Sign in Join
Wiki copytemporary

Office Automation/fr: what changed

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

Title: Office Automation/fr

OldNewLine
1+*(Windows only)*
2+
3+La 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.
4+
5+Un 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.
6+
7+## Utilisation de OpenOffice UNO Bridge
8+
9+OpenOffice 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):
10+
11+[api.openoffice.org](http://api.openoffice.org/)
12+
13+[About Bridges](http://wiki.services.openoffice.org/wiki/Uno/Article/About_Bridges)
14+
15+Voir aussi le sujet ci-dessous à propos de Python.
16+
17+## Utilisation de COM Automation pour interagir avec OpenOffice et Microsoft Office
18+
19+Automation 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).
20+
21+### OpenOffice sur Windows
22+
23+Voici 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.
24+
25+``` pascal
26+program TestOO;
27+
28+{$IFDEF FPC}
29+ {$MODE Delphi}
30+{$ELSE}
31+ {$APPTYPE CONSOLE}
32+{$ENDIF}
33+
34+uses
35+ SysUtils, Variants, ComObj;
36+
37+const
38+ ServerName = 'com.sun.star.ServiceManager';
39+var
40+ Server : Variant;
41+ Desktop : Variant;
42+ LoadParams : Variant;
43+ Document : Variant;
44+ TextCursor : Variant;
45+begin
46+ if Assigned(InitProc) then
47+ TProcedure(InitProc);
48+
49+ try
50+ Server := CreateOleObject(ServerName);
51+ except
52+ WriteLn('Unable to start OO.');
53+ Exit;
54+ end;
55+
56+ Desktop := Server.CreateInstance('com.sun.star.frame.Desktop');
57+
58+ LoadParams := VarArrayCreate([0, -1], varVariant);
59+
60+ {Crée un nouveeau document}
61+ Document := Desktop.LoadComponentFromURL('private:factory/swriter', '_blank', 0, LoadParams);
62+
63+ {ou ouvrir un existant} // vous devez utiliser des / et non des \ ! dans le chemin d'accès
64+ //Document := Desktop.LoadComponentFromURL('file:///C:/my/path/mydoc.doc', '_blank', 0, LoadParams);
65+
66+ TextCursor := Document.Text.CreateTextCursor;
67+
68+ {Insère un nouveau document} //Remplacer avc vos valeur de nom de fichier
69+ TextCursor.InsertDocumentFromURL('file:///C:/my/path/mydoc.doc',
70+ LoadParams);
71+end.
72+```
73+
74+### Office sur Windows
75+
76+Voici 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.
77+
78+``` pascal
79+program TestMsOffice;
80+
81+{$IFDEF FPC}
82+ {$MODE Delphi}
83+{$ELSE}
84+ {$APPTYPE CONSOLE}
85+{$ENDIF}
86+
87+uses
88+ SysUtils, Variants, ComObj;
89+
90+const
91+ ServerName = 'Word.Application';
92+var
93+ Server : Variant;
94+ w:widestring;
95+begin
96+ if Assigned(InitProc) then
97+ TProcedure(InitProc);
98+
99+ try
100+ Server := CreateOleObject(ServerName);
101+ except
102+ WriteLn('Unable to start Word.');
103+ Exit;
104+ end;
105+
106+ {ouvre un document existant} //Substituez votre votre chemin et nom de fichier
107+ w:= UTF8Decode('c:\my\path\mydoc.doc');
108+ 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.
109+ Server.Visible := True; {Make Word visible}
110+
111+end.
112+```
113+
114+Voici un échantillon de code de comment travailler dans un document Word ouvert, en utilisant le serveur d'automation de Word.
115+
116+``` pascal
117+var
118+ Server: Variant;
119+begin
120+ try
121+ Server := GetActiveOleObject('Word.Application');
122+ except
123+ try
124+ ShowMessage('Word pas encore ouvert, crée un objet');
125+ // Si aucune instance de Word ne tourne, essayer de créer un nouvel objet Word
126+ Server := CreateOleObject('Word.Application');
127+ except
128+ ShowMessage('Ne peut pas lancer Word/Word pas installé ?');
129+ Exit;
130+ end;
131+ end;
132+end;
133+```
134+
135+Limitations: Parce que **End** est un mot réservé de FPC, il doit être utiliser comme un paramètre après le signe *&*.
136+
137+``` pascal
138+Server.ActiveDocument.Application.Selection.start := Server.ActiveDocument.Application.Selection.&end+1;
139+```
140+
141+De nombreux exemples pour Excel sont disponibles dans la [[ExcelAutomation/de|page Wiki allemande]].
142+
143+## Tenter d'utiliser Python pour piloter OpenOffice
144+
145+Parce 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:
146+
147+1. Tester UNO via une macro Python exécutée dans OO
148+2. Tester UNO via un script Python autonome
149+3. Support de l'exécution de scripts Python dans Pascal
150+4. Tester UNO via un script Python exécuté dans Pascal.
151+5. Une classe Pascal qui enveloppe Python UNO
152+
153+Note: 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).
154+
155+#### Etape 1. Tester UNO via une macro Python exécutée dans OO
156+
157+OO 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:
158+
159+ C:\Document and Setting\<username>\Application Data\OpenOffice.org2\user\Scripts\python\Library1
160+
161+Sur Mac OS X, ce dossier est:
162+
163+ ~/Library/Preferences/NeoOffice-2.2/user/Scripts/python/Library1
164+
165+Sur ces deux plates-formes, vous devrez créer le dossier python/Library1.
166+
167+Voici le code pour test_macro.py, adapté de l'exemepl OO en Pascal du dessus:
168+
169+``` python
170+# Macro Python qui teste UNO en créant un nouveau document et y insère du texte
171+
172+import uno
173+
174+def TestNewDoc():
175+ ctx = uno.getComponentContext()
176+ smgr = ctx.ServiceManager
177+ desktop = smgr.createInstance('com.sun.star.frame.Desktop')
178+ doc = desktop.loadComponentFromURL('private:factory/swriter', '_blank', 0, ())
179+ textCursor = doc.Text.createTextCursor()
180+ doc.Text.insertString(textCursor, 'Salut Monde', 0)
181+```
182+
183+Dans OO, choisissez Tools \| Macros \| Organize Macros \| Python et exécuter la macro pour être sûr que ça marche
184+
185+#### Etape 2. Tester UNO via un script Python autonome
186+
187+Voici le même code que dans le script autonome:
188+
189+``` python
190+# Macro Python qui teste UNO en créant un nouveau document et y insère du texte
191+
192+import sys
193+
194+if sys.platform == 'darwin':
195+ sys.path.append('/Applications/NeoOffice.app/Contents/MacOS')
196+
197+import officehelper
198+
199+ctx = officehelper.bootstrap()
200+smgr = ctx.ServiceManager
201+desktop = smgr.createInstance('com.sun.star.frame.Desktop')
202+doc = desktop.loadComponentFromURL('private:factory/swriter', '_blank', 0, ())
203+textCursor = doc.Text.createTextCursor()
204+doc.Text.insertString(textCursor, 'Hello World', 0)
205+```
206+
207+Sauvez 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.
208+
209+ "\program files\openoffice.org 2.3\program\python" test.py
210+
211+Sur Mac OS X, exécutez le script comme ça depuis la fenêtre Terminal:
212+
213+``` bash
214+#!/bin/sh
215+export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH":/Applications/NeoOffice.app/Contents/MacOS"
216+python2.3 test.py
217+```
218+
219+Malheureusement, 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.
220+
221+#### UNO Python A-faire
222+
223+D'é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:
224+
225+- Tester sur Linux
226+- Tester sur des versions plus récentes d'OpenOffice
227+
228+- Jan. 5, 2009: Résultats des tests d'OpenOffice 3 sur Windows:
229+ - OO 3.0.0 Le support pour les utilisateurs de macro Python est rompu (Etape 1); corrigé avec OO 3.0.1 RC1.
230+ - 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.
231+ - Notez que les chemins vers les différentes parties de OO et des macros utilisateur ont changé avec OO 3.
232+
233+------------------------------------------------------------------------
234+
235+## En utilisant l'unité fpXMLXSDExport
236+
237+FPC 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.
238+
239+Le 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.
240+
241+Dans 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.
242+
243+Lazarus fournit un composant visuel pour cela: après l'installation du paquet **lazdbexport**, vous verrez le composant **TXMLXSDExporter** sur l'onglet **Data Export**.
244+
245+Voir [[fpXMLXSDExport]] pour les détails.
246+
247+## En utilisant la bibliothèque Spreadsheet de Free Pascal
248+
249+Une 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.
250+
251+Les avantages sont que FPSpreadsheet est à 100% du code [[Object Pascal|Pascal Objet]] et qu'elle ne nécessite aucune bibliothèque ou programme.
252+
253+## En écrivant un fichier Excel en utilisant ADO
254+
255+Ecrire à l'auteur de la page anglaise.
256+
257+## En écrivant/lisant un fichier Excel en utilisant OLE
258+
259+Cette méthode nécessite qu'Excel soit installé sur la machine de l'utilisateur car elle utilise OLE pour y accéder.
260+
261+***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.***
262+
263+- Créez un nouvelle fiche avec un TButton, un TStringGrid et un TEdit.
264+- Créez un nouveau fichier Excel et remplissez quelques cellules.
265+
266+<figure>
267+<img src="excel123.png" title="excel123.png" />
268+<figcaption>excel123.png</figcaption>
269+</figure>
270+
271+Exemple - Ouvrir/lire le fichier Excel:
272+
273+``` pascal
274+uses ..... comobj;
275+
276+procedure TForm1.Button1Click(Sender: TObject);
277+
278+Var XLApp: OLEVariant;
279+ x,y: byte;
280+ path: variant;
281+
282+begin
283+ XLApp := CreateOleObject('Excel.Application'); // nécessite comobj dans uses
284+ try
285+ XLApp.Visible := False; // Cache Excel
286+ XLApp.DisplayAlerts := False;
287+ path := edit1.Text;
288+ XLApp.Workbooks.Open(Path); // Ouvre le classeur
289+ for x := 1 to 4 do
290+ begin
291+ for y := 1 to 6 do
292+ begin
293+ SG.Cells[x,y] := XLApp.Cells[y,x].Value; // Remplit le TStringGrid avec les valeurs
294+ end;
295+ end;
296+ finally
297+ XLApp.Quit;
298+ XLAPP := Unassigned;
299+ end;
300+```
301+
302+Si vous voulez faire des modifications et que vous voulez les reporter dans Excel, vous pouvez utiliser:
303+
304+``` pascal
305+XLApp.Cells[x,y].Value := SG.Cells[y,x];
306+```
307+
308+Si vous voulez enregistrer:
309+
310+``` pascal
311+XLApp.ActiveWorkBook.Save;
312+```
313+
314+## En lisant/écrivant un fichier Excel en utilisant l'interface de composant SpreadSheet
315+
316+Le 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>
317+
318+Puisque 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
319+
320+Since 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.
321+
322+Soyez prudent, c'est un travail en cours. Vous l'utilisez à vos propres risques.
323+
324+Fonctionnalité:
325+
326+- création et chargement de classeurs Excel,
327+- enregistrement de classeurs,
328+- création et accès aux feuilles de calcul,
329+- obtention et modification des valeurs (et formules) dans les cellules,
330+- obtention et modification de la couleur des cellules,
331+- obtention et modification de la hauteur des lignes et de la largeur des colonnes,
332+- création de commentaires,
333+- création de formes ,
334+- création de graphes.
335+
336+**D'abord les Inits.**
337+
338+``` pascal
339+ IMPLEMENTATION
340+ USES
341+ ExcelUtilities,
342+ SpreadSheetInterfaces ;
343+
344+ VAR
345+ aCell : IRange ;
346+ aValue : OleVariant ; // Pas sûr de cela, mais ça marche. ie( Edit.Text := STRING(aValue); )
347+ ExcelApp : TExcelApplication ;
348+ ExcelWbs : IWorkBooks ;
349+
350+ ExcelBook : IWorkBook ;
351+ ExcelSheet : ISheet ;
352+ ExcelSheets : ISheets ;
353+```
354+
355+Obtenir une feuille de calcul est simple:
356+
357+``` pascal
358+ // Initialisation le classeur Excel:
359+ ExcelApp := TExcelApplication.Create(nil) ;
360+ ExcelApp.Active := True ;
361+ ExcelApp.Visible := True ;
362+
363+ ExcelWbs := ExcelApp.WorkBooks ;
364+ ExcelBook := ExcelWbs.Add ;
365+ ExcelSheets := ExcelBook.Sheets ;
366+ ExcelSheet := ExcelSheets.Sheet(1) ;
367+```
368+
369+S'amuser avec les cellules est aussi simple:
370+
371+``` pascal
372+ // Ajout d'une valeur
373+ aCell := ExcelSheet.Cells(1, 1) ;
374+ aCell.Value := 10;
375+
376+ // Ajout d'une formule
377+ aCell := ExcelSheet.Cells(2,1) ;
378+ aCell.Formula := '=A1+10' ;
379+
380+ // Obtenir la valeur calculée dans Excel
381+ aValue := aCell.Value ;
382+```
383+
384+Le cas de test fourni a de nombreux autres exemples.
385+
386+## Copier du HTML dans le prese-papier
387+
388+Vous 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.
389+
390+Les applications Microsoft Office nécessite que le HTML passé par le presse-papier soit d'un format plus complexe que celui décrit ici.
391+
392+[[Clipboard|Voir ici un exemple qui marche avec Microsoft Office.]]
393+
394+``` pascal
395+uses
396+ ClipBrd;
397+...
398+ // enregistrer le type mime type pour text/html. Vous pouvez faire cela une fois pour toutes au démarrage du programme:
399+ ClipbrdFmtHTML:=RegisterClipboardFormat('text/html');
400+...
401+ // Nettoyer les formats précédents du presse-papier avant de commencer
402+ Clipboard.Clear;
403+
404+ // Déposer le texte et le HTML dans le presse-papier. Les autres applications choisiront le meilleur format automatiquement.
405+ ThePlainUTF8Text:='Simple text';
406+ Clipboard.AsText:=ThePlainUTF8Text;
407+
408+ AsHTML:='<b>Formatted</b> text'; // texte avec formatage
409+ Clipboard.AddFormat(ClipbrdFmtHTML,AsHTML[1],length(AsHTML));
410+```
411+
412+## Voir aussi
413+
414+- [[Clipboard]]
415+
416+## Liens externes
417+
418+- [Excel file format](http://sc.openoffice.org/excelfileformat.pdf) - Description dans le site Web OpenOffice
419+
420+---
421+*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