Sign in Join
Wiki copytemporary

Office Automation/fr: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11*(Windows only)*
22
33La possibilité d'interagir avec les programmes office et générer des feuilles de calcul, des documents texte et des présentations depuis le code peut être de grande valeur au bureau, et permet de gagner beaucoup de temps pour ceux qui peuvent le faire.
44
55Un exemple est la création d'applications qui peuvent lire et écrire des fichiers dans un format arbitraire et générer un fichier Excel, une tâche qu'il est bien plus efficace de faire par code que manuellement.
66
77## Utilisation de OpenOffice UNO Bridge
88
99OpenOffice a des bindings de langage pour C++, Java, JavaScript et Python. Sur Windows, OpenOffice peut aussi être manipulé en Pascal via COM Automation (voir ci-dessous), mais il n'y a actuellement aucune façon simple d'utiliser OpenOffice UNO (Universal Network Objects) depuis Pascal sur OS X et Linux. Si vous êtes interessé par le développement d'un "bridge" OO pour Pascal, veuillez vous référer au liens suivants pour plus d'information (attention: ces liens sont relativement techniques à la mode de Sun):
1010
1111[api.openoffice.org](http://api.openoffice.org/)
1212
1313[About Bridges](http://wiki.services.openoffice.org/wiki/Uno/Article/About_Bridges)
1414
1515Voir aussi le sujet ci-dessous à propos de Python.
1616
1717## Utilisation de COM Automation pour interagir avec OpenOffice et Microsoft Office
1818
1919Automation est uniquement valable sous Windows donc les deux exemples suivants ne fonctionneront pas sous OS X ou Linux. Pour ces plateformes, veuillez vous référer à [Making do without Windows COM Automation](http://wiki.lazarus.freepascal.org/Multiplatform_Programming_Guide#Making_do_without_Windows_COM_Automation). Si vous avez seulement besoin de créer et/ou visualiser un document de traitement de text depuis votre programme, veuillez jeter un oeil à [XDev Toolkit](http://web.fastermac.net/~MacPgmr/XDev/XDevStatus.html#RTF).
2020
2121### OpenOffice sur Windows
2222
2323Voici un exemple simple sur comment ouvrir un document avec votre programme en utilisant le serveur Automation d'OpenOffice. Notez que ça ne marche que sur Windows.
2424
2525``` pascal
2626program TestOO;
2727
2828{$IFDEF FPC}
2929 {$MODE Delphi}
3030{$ELSE}
3131 {$APPTYPE CONSOLE}
3232{$ENDIF}
3333
3434uses
3535 SysUtils, Variants, ComObj;
3636
3737const
3838 ServerName = 'com.sun.star.ServiceManager';
3939var
4040 Server : Variant;
4141 Desktop : Variant;
4242 LoadParams : Variant;
4343 Document : Variant;
4444 TextCursor : Variant;
4545begin
4646 if Assigned(InitProc) then
4747 TProcedure(InitProc);
4848
4949 try
5050 Server := CreateOleObject(ServerName);
5151 except
5252 WriteLn('Unable to start OO.');
5353 Exit;
5454 end;
5555
5656 Desktop := Server.CreateInstance('com.sun.star.frame.Desktop');
5757
5858 LoadParams := VarArrayCreate([0, -1], varVariant);
5959
6060 {Crée un nouveeau document}
6161 Document := Desktop.LoadComponentFromURL('private:factory/swriter', '_blank', 0, LoadParams);
6262
6363 {ou ouvrir un existant} // vous devez utiliser des / et non des \ ! dans le chemin d'accès
6464 //Document := Desktop.LoadComponentFromURL('file:///C:/my/path/mydoc.doc', '_blank', 0, LoadParams);
6565
6666 TextCursor := Document.Text.CreateTextCursor;
6767
6868 {Insère un nouveau document} //Remplacer avc vos valeur de nom de fichier
6969 TextCursor.InsertDocumentFromURL('file:///C:/my/path/mydoc.doc',
7070 LoadParams);
7171end.
7272```
7373
7474### Office sur Windows
7575
7676Voici un exemple simple de comment ouvrir un document avec votre programme en utilisant le serveur d'automation de Word. Notez que ce serveur ne fonctionne que sous Windows. Ceci marchera avec Delphi et FPC.
7777
7878``` pascal
7979program TestMsOffice;
8080
8181{$IFDEF FPC}
8282 {$MODE Delphi}
8383{$ELSE}
8484 {$APPTYPE CONSOLE}
8585{$ENDIF}
8686
8787uses
8888 SysUtils, Variants, ComObj;
8989
9090const
9191 ServerName = 'Word.Application';
9292var
9393 Server : Variant;
9494 w:widestring;
9595begin
9696 if Assigned(InitProc) then
9797 TProcedure(InitProc);
9898
9999 try
100100 Server := CreateOleObject(ServerName);
101101 except
102102 WriteLn('Unable to start Word.');
103103 Exit;
104104 end;
105105
106106 {ouvre un document existant} //Substituez votre votre chemin et nom de fichier
107107 w:= UTF8Decode('c:\my\path\mydoc.doc');
108108 Server.Documents.Open(w); //OLE utilises BSTR (http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(v=vs.85).aspx). Seule la widestring est compatible avec BSTR dans FPC, donc la conversion est nécessaire pour les caractères non latins.
109109 Server.Visible := True; {Make Word visible}
110110
111111end.
112112```
113113
114114Voici un échantillon de code de comment travailler dans un document Word ouvert, en utilisant le serveur d'automation de Word.
115115
116116``` pascal
117117var
118118 Server: Variant;
119119begin
120120 try
121121 Server := GetActiveOleObject('Word.Application');
122122 except
123123 try
124124 ShowMessage('Word pas encore ouvert, crée un objet');
125125 // Si aucune instance de Word ne tourne, essayer de créer un nouvel objet Word
126126 Server := CreateOleObject('Word.Application');
127127 except
128128 ShowMessage('Ne peut pas lancer Word/Word pas installé ?');
129129 Exit;
130130 end;
131131 end;
132132end;
133133```
134134
135135Limitations: Parce que **End** est un mot réservé de FPC, il doit être utiliser comme un paramètre après le signe *&*.
136136
137137``` pascal
138138Server.ActiveDocument.Application.Selection.start := Server.ActiveDocument.Application.Selection.&end+1;
139139```
140140
141141De nombreux exemples pour Excel sont disponibles dans la [[ExcelAutomation/de|page Wiki allemande]].
142142
143143## Tenter d'utiliser Python pour piloter OpenOffice
144144
145145Parce qu'OpenOffice inclut le support pour Python, il semble possible d'exécuter des scripts Python depuis Pascal pour piloter OO, au lieu des actuelles liaisons(bindings) Pascal. Voici les étapes pour une possible approcjhe pour faire cela:
146146
1471471. Tester UNO via une macro Python exécutée dans OO
1481482. Tester UNO via un script Python autonome
1491493. Support de l'exécution de scripts Python dans Pascal
1501504. Tester UNO via un script Python exécuté dans Pascal.
1511515. Une classe Pascal qui enveloppe Python UNO
152152
153153Note: Les scripts suivant ont été testés avec OpenOffice 2.3.1 sur Windows XP et NeoOffice 2.2.5 Patch 6 sur Mac OS X 10.4.11 (PowerPC).
154154
155155#### Etape 1. Tester UNO via une macro Python exécutée dans OO
156156
157157OO a des outils pour créer des macro JavaScript, mais pas des macros en Python, donc utilisez un éditeur pour enregistrerle script suivant dans 'test_macro.py' et placez-le dans le dossier des macros utilisateur. Sur Windows, Ce dossier est:
158158
159159 C:\Document and Setting\<username>\Application Data\OpenOffice.org2\user\Scripts\python\Library1
160160
161161Sur Mac OS X, ce dossier est:
162162
163163 ~/Library/Preferences/NeoOffice-2.2/user/Scripts/python/Library1
164164
165165Sur ces deux plates-formes, vous devrez créer le dossier python/Library1.
166166
167167Voici le code pour test_macro.py, adapté de l'exemepl OO en Pascal du dessus:
168168
169169``` python
170170# Macro Python qui teste UNO en créant un nouveau document et y insère du texte
171171
172172import uno
173173
174174def TestNewDoc():
175175 ctx = uno.getComponentContext()
176176 smgr = ctx.ServiceManager
177177 desktop = smgr.createInstance('com.sun.star.frame.Desktop')
178178 doc = desktop.loadComponentFromURL('private:factory/swriter', '_blank', 0, ())
179179 textCursor = doc.Text.createTextCursor()
180180 doc.Text.insertString(textCursor, 'Salut Monde', 0)
181181```
182182
183183Dans OO, choisissez Tools \| Macros \| Organize Macros \| Python et exécuter la macro pour être sûr que ça marche
184184
185185#### Etape 2. Tester UNO via un script Python autonome
186186
187187Voici le même code que dans le script autonome:
188188
189189``` python
190190# Macro Python qui teste UNO en créant un nouveau document et y insère du texte
191191
192192import sys
193193
194194if sys.platform == 'darwin':
195195 sys.path.append('/Applications/NeoOffice.app/Contents/MacOS')
196196
197197import officehelper
198198
199199ctx = officehelper.bootstrap()
200200smgr = ctx.ServiceManager
201201desktop = smgr.createInstance('com.sun.star.frame.Desktop')
202202doc = desktop.loadComponentFromURL('private:factory/swriter', '_blank', 0, ())
203203textCursor = doc.Text.createTextCursor()
204204doc.Text.insertString(textCursor, 'Hello World', 0)
205205```
206206
207207Sauvez cela dans le fichier test.py et exécutez-le sur Windows depuis la ligne de commande. note: Sur Windows et Linux, utiliser la version de Python incluse dans OO ; sur Mac OS X, utilisez le Python 2.3 du système.
208208
209209 "\program files\openoffice.org 2.3\program\python" test.py
210210
211211Sur Mac OS X, exécutez le script comme ça depuis la fenêtre Terminal:
212212
213213``` bash
214214#!/bin/sh
215215export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH":/Applications/NeoOffice.app/Contents/MacOS"
216216python2.3 test.py
217217```
218218
219219Malheureusement, ce script ne fonctionne pas non plus sur Windows ou Mac OS X (NDT: c''est ballot). Sur Windows, il affiche un dialogue d'erreur sans texte (!) et sort un message d'erreur vers la console qui dit "Cannot connect to soffice server". Sur Mac OS X, il démarre NeoOffice et crée le nouveau document, puis NeoOffice s'arrêt brutalement.
220220
221221#### UNO Python A-faire
222222
223223D'évidentes investigations supplémentaires sont nécessaires avant de pouvoir réaliser l'étape 3. Vous êtes le bienvenu pour travailler là-dessus. Voici deux choses à essayer:
224224
225225- Tester sur Linux
226226- Tester sur des versions plus récentes d'OpenOffice
227227
228228- Jan. 5, 2009: Résultats des tests d'OpenOffice 3 sur Windows:
229229 - OO 3.0.0 Le support pour les utilisateurs de macro Python est rompu (Etape 1); corrigé avec OO 3.0.1 RC1.
230230 - Etape 2 n'affiche plus le message vide de la boîte de dialogue et le message d'exception vers la console est différent, mais ne démarre toujours pas OO.
231231 - Notez que les chemins vers les différentes parties de OO et des macros utilisateur ont changé avec OO 3.
232232
233233------------------------------------------------------------------------
234234
235235## En utilisant l'unité fpXMLXSDExport
236236
237237FPC 2.6 et plus récent contient l'unité **fpXMLXSDExport**, partie des composant d'export de la FCL-DB. Avec cela, vous pouvez exporter des datasets vers divers formats XML, y compris un format compatible avec Microsoft Access et un format compatible avec Microsoft Excel.
238238
239239Le format Access peut sortir du XML avec ou sans définition de donnée/table XSD incorporée. Observez que l'exportation de donnée de type binaire/blob nécessite une action supplémentaire à la fin de l'import Access car Access ne prend pas en charge les véritables champs binaires appropriés, seuls les champs OLE.
240240
241241Dans le format Excel, les champs texte multi-ligne ne sont pas pris en charge actuellement: les fins de lignes sont supprimées pendant l'export.
242242
243243Lazarus fournit un composant visuel pour cela: après l'installation du paquet **lazdbexport**, vous verrez le composant **TXMLXSDExporter** sur l'onglet **Data Export**.
244244
245245Voir [[fpXMLXSDExport]] pour les détails.
246246
247247## En utilisant la bibliothèque Spreadsheet de Free Pascal
248248
249249Une autre façon d'automatiser les tâches répétitives est d'utiliser la bibliothèque [[FPSpreadsheet]]. Elle peut lire ou écrire des classeurs dans plusieurs formats et ne nécessite l'installation d'aucune application externe sur la machine.
250250
251251Les avantages sont que FPSpreadsheet est à 100% du code [[Object Pascal|Pascal Objet]] et qu'elle ne nécessite aucune bibliothèque ou programme.
252252
253253## En écrivant un fichier Excel en utilisant ADO
254254
255255Ecrire à l'auteur de la page anglaise.
256256
257257## En écrivant/lisant un fichier Excel en utilisant OLE
258258
259259Cette méthode nécessite qu'Excel soit installé sur la machine de l'utilisateur car elle utilise OLE pour y accéder.
260260
261261***Garder à l'esprit que cette méthode démarre Excel en tâche de fond, lequel ouvre le fichier et travaille dessus comme un utilisateur véritable.***
262262
263263- Créez un nouvelle fiche avec un TButton, un TStringGrid et un TEdit.
264264- Créez un nouveau fichier Excel et remplissez quelques cellules.
265265
266-<figure>
267-<img src="excel123.png" title="excel123.png" />
268-<figcaption>excel123.png</figcaption>
269-</figure>
266+![](/wiki-images/7/74/Excel123.png)
270267
271268Exemple - Ouvrir/lire le fichier Excel:
272269
273270``` pascal
274271uses ..... comobj;
275272
276273procedure TForm1.Button1Click(Sender: TObject);
277274
278275Var XLApp: OLEVariant;
279276 x,y: byte;
280277 path: variant;
281278
282279begin
283280 XLApp := CreateOleObject('Excel.Application'); // nécessite comobj dans uses
284281 try
285282 XLApp.Visible := False; // Cache Excel
286283 XLApp.DisplayAlerts := False;
287284 path := edit1.Text;
288285 XLApp.Workbooks.Open(Path); // Ouvre le classeur
289286 for x := 1 to 4 do
290287 begin
291288 for y := 1 to 6 do
292289 begin
293290 SG.Cells[x,y] := XLApp.Cells[y,x].Value; // Remplit le TStringGrid avec les valeurs
294291 end;
295292 end;
296293 finally
297294 XLApp.Quit;
298295 XLAPP := Unassigned;
299296 end;
300297```
301298
302299Si vous voulez faire des modifications et que vous voulez les reporter dans Excel, vous pouvez utiliser:
303300
304301``` pascal
305302XLApp.Cells[x,y].Value := SG.Cells[y,x];
306303```
307304
308305Si vous voulez enregistrer:
309306
310307``` pascal
311308XLApp.ActiveWorkBook.Save;
312309```
313310
314311## En lisant/écrivant un fichier Excel en utilisant l'interface de composant SpreadSheet
315312
316313Le composant fournit une bibliothèque d'interface, faisant abstraction des interfaces Excel COM et Calc Open Office UNO. Le composant est disponible là: <http://www.tcoq.org/composants>
317314
318315Puisque l'Automation n'est pas encore disponible, mais que COM l'est, le composant d'interface fournit un ensemble de classes Lazarus encapsulant les appels à l'interface COM d'Excel (au dessous de l'Automation). Il
319316
320317Since Automation is not yet available, but COM is available, the Excel interface component provides a set of Lazarus classes encapsulating calls to the Excel COM interface (the one below the Automation). Il masque la plupart des corvées du code de bas-niveau.
321318
322319Soyez prudent, c'est un travail en cours. Vous l'utilisez à vos propres risques.
323320
324321Fonctionnalité:
325322
326323- création et chargement de classeurs Excel,
327324- enregistrement de classeurs,
328325- création et accès aux feuilles de calcul,
329326- obtention et modification des valeurs (et formules) dans les cellules,
330327- obtention et modification de la couleur des cellules,
331328- obtention et modification de la hauteur des lignes et de la largeur des colonnes,
332329- création de commentaires,
333330- création de formes ,
334331- création de graphes.
335332
336333**D'abord les Inits.**
337334
338335``` pascal
339336 IMPLEMENTATION
340337 USES
341338 ExcelUtilities,
342339 SpreadSheetInterfaces ;
343340
344341 VAR
345342 aCell : IRange ;
346343 aValue : OleVariant ; // Pas sûr de cela, mais ça marche. ie( Edit.Text := STRING(aValue); )
347344 ExcelApp : TExcelApplication ;
348345 ExcelWbs : IWorkBooks ;
349346
350347 ExcelBook : IWorkBook ;
351348 ExcelSheet : ISheet ;
352349 ExcelSheets : ISheets ;
353350```
354351
355352Obtenir une feuille de calcul est simple:
356353
357354``` pascal
358355 // Initialisation le classeur Excel:
359356 ExcelApp := TExcelApplication.Create(nil) ;
360357 ExcelApp.Active := True ;
361358 ExcelApp.Visible := True ;
362359
363360 ExcelWbs := ExcelApp.WorkBooks ;
364361 ExcelBook := ExcelWbs.Add ;
365362 ExcelSheets := ExcelBook.Sheets ;
366363 ExcelSheet := ExcelSheets.Sheet(1) ;
367364```
368365
369366S'amuser avec les cellules est aussi simple:
370367
371368``` pascal
372369 // Ajout d'une valeur
373370 aCell := ExcelSheet.Cells(1, 1) ;
374371 aCell.Value := 10;
375372
376373 // Ajout d'une formule
377374 aCell := ExcelSheet.Cells(2,1) ;
378375 aCell.Formula := '=A1+10' ;
379376
380377 // Obtenir la valeur calculée dans Excel
381378 aValue := aCell.Value ;
382379```
383380
384381Le cas de test fourni a de nombreux autres exemples.
385382
386383## Copier du HTML dans le prese-papier
387384
388385Vous pouvez copier du HTML dans le presse-papier lequel est compris par de nombreuses applications. De cette façon, vous pouvez copier du texte formaté. Pour les applications qui ne peuvent comprendre que du texte pur, vous pouvez copier du texte pur aussi.
389386
390387Les applications Microsoft Office nécessite que le HTML passé par le presse-papier soit d'un format plus complexe que celui décrit ici.
391388
392389[[Clipboard|Voir ici un exemple qui marche avec Microsoft Office.]]
393390
394391``` pascal
395392uses
396393 ClipBrd;
397394...
398395 // enregistrer le type mime type pour text/html. Vous pouvez faire cela une fois pour toutes au démarrage du programme:
399396 ClipbrdFmtHTML:=RegisterClipboardFormat('text/html');
400397...
401398 // Nettoyer les formats précédents du presse-papier avant de commencer
402399 Clipboard.Clear;
403400
404401 // Déposer le texte et le HTML dans le presse-papier. Les autres applications choisiront le meilleur format automatiquement.
405402 ThePlainUTF8Text:='Simple text';
406403 Clipboard.AsText:=ThePlainUTF8Text;
407404
408405 AsHTML:='<b>Formatted</b> text'; // texte avec formatage
409406 Clipboard.AddFormat(ClipbrdFmtHTML,AsHTML[1],length(AsHTML));
410407```
411408
412409## Voir aussi
413410
414411- [[Clipboard]]
415412
416413## Liens externes
417414
418415- [Excel file format](http://sc.openoffice.org/excelfileformat.pdf) - Description dans le site Web OpenOffice
419416
420417---
421418*From the Free Pascal wiki, page "Office Automation/fr", as it stood on 2020-02-21 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history