IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

[OPENOFFICE]Comment manipuler des tableaux de variants ?


Sujet :

API, COM et SDKs Delphi

  1. #1
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Points : 194
    Points
    194
    Par défaut [OPENOFFICE]Comment manipuler des tableaux de variants ?
    Bonjour,

    J'aurais besoin d'ajouter un export de données au format du tableur d'open office via OLE...

    J'utilise le pilotage un peu de la même façon que je le fais pour Microsoft Excel avec des Olevariant pour l'objet application et chaque feuille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    aOfficeApp := CreateOleObject('com.sun.star.ServiceManager');
    .....
    OpenDesktop := aOfficeApp.createInstance('com.sun.star.frame.Desktop');
    LoadParams := VarArrayCreate([0, -1], varVariant);
    NomFichier := StringReplace(aNomFichierTravail, '\', '/', [rfReplaceAll, rfIgnoreCase]);
    aOfficeDocument := OpenDesktop.LoadComponentFromURL('file:///'+NomFichier, '_blank', 0,  LoadParams);
    mais si je veux garder l'esprit de ce que je faisais avec l'export excel si je ne veux pas réécrire tout l'export, je dois prendre une plage de cellules, puis travailler dessus (voire ajouter des lignes) puis réinjecter cette plage dans le document, un peu comme cela (code pour Microsoft Excel) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    XLDonneesPageCourante := VarArrayCreate( [ 1,
                                               aLigneFin,
                                               1,
                                               aColonneFin], varVariant);
     
     
    XLDonneesPageCourante := aXLPageCourante.Range[ RefToCell( 1, 1),
                                                    RefToCell( aLigneFin, aColonneFin)].FormulaLocal;
     
     
    // ....
    // Traitement sur le tableau de variant
    //...
     
    // Réaffectation de la plage
    aXLPageCourante.Range[ RefToCell( 1, 1),
                           RefToCell( NouveauNombreDelignes, aColonneFin)].FormulaLocal := XLDonneesPageTransformee;
    J'ai à peu près trouvé comment faire toutes les opérations nécessaires à mon export...sauf l'affectation de la plage (cela semble déclencher une exception en lecture de la première valeur variante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    XLDonneesPageTravail := VarArrayCreate( [ 0,
                                                        aColonneFin,
                                                        0,
                                                        aLigneFin], varVariant);
    XLDonneesPageCourante := aXLPageCourante.GetCellRangeByPosition(0, 0, aColonneFin, aLigneFin).GetFormulaArray;
     
    if (VarType(XLDonneesPageCourante[0, 0]) <> varNull) and (VarType(XLDonneesPageCourante[0, 0]) <> varEmpty) then // <-- EXCEPTION ICI
    begin
    ....
    end;
    Est-ce possible de procéder ainsi ou un peu différemment...et, si oui, comment ?

  2. #2
    Membre habitué
    Inscrit en
    Juin 2006
    Messages
    379
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 379
    Points : 194
    Points
    194
    Par défaut Quelques précisions
    Bonjour,

    Comme il n'y a aucune réponse...ni même de questions sur ce que je souhaite faire, je me suis dit qu'il faudrait peut être ajouter des précisions à ma demande.

    Je vais essayer d'expliquer un peu plus dans le détail le fonctionnel.
    Dans plusieurs logiciels, nous avons des éditions à réaliser qui sont faites sous forme d'export vers Microsoft Excel ou Microsoft Word actuellement, et nous aimerions ajouter l'export vers OpenOffice (dans Calc pour l'instant).

    J'ai donc commencé à regarder hier comment ce faire et j'ai trouvé comment lancer une instance de Calc, charger un fichier modèle, accéder aux cellules, enregistrer, imprimer et quitter sans problème. Je dois avouer que c'est génial et facile à piloter...reste à se familiariser avec les classes disponibles et leur hiérarchie (d'ailleurs si on peut en trouver une représentation visuelle, cela m'aiderait grandement).

    De la façon dont j'ai implémenté l'export, c'est la même fonction Delphi qui réalise ces exports à partir de liste d'objets contenant les données, il suffit de choisir le format de sortie et de paramétrer quelques options particulières à chacun. On peut assez facilement ajouter des formats d'export et j'ai commencé à le faire pour ce format (Calc). Tout se passe bien jusqu'au moment où je dois manipuler sur les données existantes dans le fichier Calc (ex ModeleTest.ots). Nous avons des fichiers modèles dans lesquels il y a des "mots clés" à substituer par les valeurs courantes, et cela peut être partout dans les documents modèles. On génère ainsi des fichiers d'édition avec une présentation de sortie conforme au modèle voulu. Ici, ce qui m'intéresse, c'est le contenu des cellules proprement dit.

    Comme il y a des zones qui peuvent être répétées, cela peut parfois être complexe, alors pour que l'édition ne soit pas longue, tout le travail de substitution, voire d'agrandissement des plages de cellules est fait en mémoire (cela va beaucoup plus vite). Cela a aussi l'avantage d'être indépendant du logiciel cible de l'export.

    Dans le cas présent, je veux prendre toute la plage "de cellules remplies" pour la copier dans un tableau de variants (copier les formules), faire mes manipulations dessus, et réaffecter la plage résultante (réaffecter les formules) à son ancien emplacement. Le fichier de sortie est ainsi prêt pour l'édition. Bien sûr, je pourrais revoir tout mon traitement et traiter chaque cellule individuellement, de proche en proche, mais je devrais réécrire toute la logique pour l'adapter à OpenOffice, ce qui serait une perte de temps que mon entreprise ne m'accorde pas...et en plus, le traitement en serait surement fortement ralenti....et à voir, si je réussis à réaliser ces affectations dans les deux sens, j'aurais fini le travail !!! Ce serait le pied...à peine une journée pour ajouter ce type d'export !!!

    Je sais, ce n'est pas évident de se représenter cela "virtuellement"...Le plus simple pour se rendre compte est de regarder les fichiers Excel joints (le modèle avant l'export et le fichier résultat après l'export). J'ai essayé de faire un exemple simple...

Discussions similaires

  1. Réponses: 3
    Dernier message: 21/06/2007, 18h48
  2. Réponses: 4
    Dernier message: 10/05/2006, 10h36
  3. Réponses: 13
    Dernier message: 09/05/2006, 16h30
  4. Comment manipuler des .bin en C ???
    Par Spidermeu dans le forum C
    Réponses: 8
    Dernier message: 24/03/2006, 12h52
  5. Réponses: 1
    Dernier message: 17/03/2006, 22h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo