Difference between revisions of "Office Automation/fr"

From Free Pascal wiki
Jump to navigationJump to search
(Created page with "{{Office Automation}} The ability to interact with office software and generate spreadsheets, text documents and presentations from code can be invaluable in the office, and ...")
 
m (Fixed syntax highlighting; removed categories included in template)
 
(15 intermediate revisions by 3 users not shown)
Line 1: Line 1:
 +
{{Platform only|Windows|Windows|Windows}}
 
{{Office Automation}}
 
{{Office Automation}}
  
The ability to interact with office software and generate spreadsheets, text documents and presentations from code can be invaluable in the office, and win a lot of time for those that can do it. One example of this is the creation of applications that can read files in an arbitrary format and output an Excel file, a task much more efficient to be done with code then manually.
+
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.  
  
== Using the OpenOffice UNO Bridge ==
+
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.
OpenOffice has language bindings for C++, Java, JavaScript and Python. On Windows, OpenOffice can also be manipulated in Pascal via COM Automation (see below), but there is currently no easy way of using OpenOffice's UNO (Universal Network Objects) from Pascal on OS X and Linux. If you're interested in developing an OO "bridge" for Pascal, please refer to these links for more information (caution: these links are quite techie in true Sun fashion):
+
 
 +
== Utilisation de OpenOffice UNO Bridge ==
 +
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):
  
 
[http://api.openoffice.org/ api.openoffice.org]
 
[http://api.openoffice.org/ api.openoffice.org]
Line 10: Line 13:
 
[http://wiki.services.openoffice.org/wiki/Uno/Article/About_Bridges About Bridges]
 
[http://wiki.services.openoffice.org/wiki/Uno/Article/About_Bridges About Bridges]
  
See also the topic below about Python.
+
Voir aussi le sujet ci-dessous à propos de Python.
  
== Using COM Automation to interact with OpenOffice and Microsoft Office==
+
== Utilisation de COM Automation pour interagir avec OpenOffice et Microsoft Office==
Automation is unique to Windows so the following two examples won't work on OS X or Linux. For those platforms, please refer to [http://wiki.lazarus.freepascal.org/Multiplatform_Programming_Guide#Making_do_without_Windows_COM_Automation Making do without Windows COM Automation]. If you only need to create and/or view a word processing document from your program, take a look at the [http://web.fastermac.net/~MacPgmr/XDev/XDevStatus.html#RTF XDev Toolkit].
+
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 à [http://wiki.lazarus.freepascal.org/Multiplatform_Programming_Guide#Making_do_without_Windows_COM_Automation 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 à [http://web.fastermac.net/~MacPgmr/XDev/XDevStatus.html#RTF XDev Toolkit].
  
=== OpenOffice on Windows ===
+
=== OpenOffice sur Windows ===
Here's a simple example of how to open a document with your program using the OpenOffice Automation server. Note that this works only on Windows.
+
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.
  
<syntaxhighlight>program TestOO;
+
<syntaxhighlight lang=pascal>program TestOO;
  
 
{$IFDEF FPC}
 
{$IFDEF FPC}
Line 52: Line 55:
 
   LoadParams := VarArrayCreate([0, -1], varVariant);
 
   LoadParams := VarArrayCreate([0, -1], varVariant);
  
   {Create new document}
+
   {Crée un nouveeau document}
   Document := Desktop.LoadComponentFromURL('private:factory/swriter',
+
   Document := Desktop.LoadComponentFromURL('private:factory/swriter', '_blank', 0, LoadParams);
                                          '_blank', 0, LoadParams);
+
 
 +
 
 +
  {ou ouvrir un existant} // vous devez utiliser des / et non des \ ! dans le chemin d'accès
 +
  //Document := Desktop.LoadComponentFromURL('file:///C:/my/path/mydoc.doc', '_blank', 0, LoadParams);  
  
 
   TextCursor := Document.Text.CreateTextCursor;
 
   TextCursor := Document.Text.CreateTextCursor;
  
   {Insert existing document}  //Substitute your path and doc
+
   {Insère un nouveau document}  //Remplacer avc vos valeur de nom de fichier
   TextCursor.InsertDocumentFromURL('file:///C|/my/path/mydoc.doc',   
+
   TextCursor.InsertDocumentFromURL('file:///C:/my/path/mydoc.doc',   
 
                                   LoadParams);
 
                                   LoadParams);
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
  
=== Office on Windows ===
+
=== Office sur Windows ===
Here's a simple example of how to open a document with your program using the Word Automation server. Note that this example works only on Windows. This will work with both delphi and fpc.
+
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.
  
<syntaxhighlight>program TestMsOffice;
+
<syntaxhighlight lang=pascal>program TestMsOffice;
  
 
{$IFDEF FPC}
 
{$IFDEF FPC}
Line 93: Line 99:
 
   end;
 
   end;
  
   {Open existing document}  //Substitute your path and doc
+
   {ouvre un document existant}  //Substituez votre votre chemin et nom de fichier
 
   w:= UTF8Decode('c:\my\path\mydoc.doc');
 
   w:= UTF8Decode('c:\my\path\mydoc.doc');
   Server.Documents.Open(w); //OLE uses BSTR (http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(v=vs.85).aspx). Only widestring is compatible with BSTR in FPC, so conversion is needed for nonlatin chars.
+
   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.
 
   Server.Visible := True;  {Make Word visible}
 
   Server.Visible := True;  {Make Word visible}
  
 
end.</syntaxhighlight>
 
end.</syntaxhighlight>
  
 
+
Voici un échantillon de code de comment travailler dans un document Word ouvert, en utilisant le serveur d'automation de Word.
Here is a sample code how to work in an open Word document, using the Word Automation server.
+
<syntaxhighlight lang=pascal>
<syntaxhighlight>
 
 
var
 
var
 
   Server: Variant;
 
   Server: Variant;
Line 110: Line 115:
 
   except
 
   except
 
     try
 
     try
       ShowMessage('Word not already open create a Word Object');
+
       ShowMessage('Word pas encore ouvert, crée un objet');
       // If no instance of Word is running, try to Create a new Word Object
+
       // Si aucune instance de Word ne tourne, essayer de créer un nouvel objet Word
 
       Server := CreateOleObject('Word.Application');
 
       Server := CreateOleObject('Word.Application');
 
     except
 
     except
       ShowMessage('Cannot start Word/Word not installed ?');
+
       ShowMessage('Ne peut pas lancer Word/Word pas installé ?');
 
       Exit;
 
       Exit;
 
     end;
 
     end;
Line 122: Line 127:
  
 
Limitations:
 
Limitations:
Since '''End''' is a reserved word in FPC it shall be used as a parameter after the ''&'' sign.
+
Parce que '''End''' est un mot réservé de FPC, il doit être utiliser comme un paramètre après le signe ''&''.
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
Server.ActiveDocument.Application.Selection.start:=Server.ActiveDocument.Application.Selection.&end+1;
+
Server.ActiveDocument.Application.Selection.start := Server.ActiveDocument.Application.Selection.&end+1;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
De nombreux exemples pour Excel sont disponibles dans la [[ExcelAutomation/de|page Wiki allemande]].
  
A lot of examples for Excel are available on the German wiki page [[ExcelAutomation/de]].
+
== Tenter d'utiliser Python pour piloter OpenOffice ==
 
 
== Attempting to use Python to manipulate OpenOffice ==
 
 
 
Since OpenOffice includes support for Python, it would seem possible to run Python scripts from Pascal to manipulate OO, in lieu of actual Pascal language bindings. Here are the steps for one possible approach to doing this:
 
 
 
  
# Test UNO via Python macro run within OO
+
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:
# Test UNO via Python standalone script
 
# Support for running Python scripts in Pascal
 
# Test UNO via Python script run in Pascal
 
# Pascal class that wraps Python UNO
 
  
 +
# Tester UNO via une macro Python exécutée dans OO
 +
# Tester UNO via un script Python autonome
 +
# Support de l'exécution de scripts Python dans Pascal
 +
# Tester UNO via un script Python exécuté dans Pascal.
 +
# Une classe Pascal qui enveloppe Python UNO
  
Note: The following scripts were tested with OpenOffice 2.3.1 on Windows XP and NeoOffice 2.2.5 Patch 6 on Mac OS X 10.4.11 (PowerPC).
+
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).
  
==== Step 1. Test UNO via Python macro run within OO ====
+
==== Etape 1. Tester UNO via une macro Python exécutée dans OO ====
  
OO has tools for creating JavaScript macros, but not Python macros, so use a text editor to save the following script to file test_macro.py and place it in OO's user macro folder. On Windows, this folder is:
+
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:
  
 
<pre>C:\Document and Setting\<username>\Application Data\OpenOffice.org2\user\Scripts\python\Library1</pre>
 
<pre>C:\Document and Setting\<username>\Application Data\OpenOffice.org2\user\Scripts\python\Library1</pre>
  
On Mac OS X, this folder is:
+
Sur Mac OS X, ce dossier est:
  
 
<pre>~/Library/Preferences/NeoOffice-2.2/user/Scripts/python/Library1</pre>
 
<pre>~/Library/Preferences/NeoOffice-2.2/user/Scripts/python/Library1</pre>
  
On both platforms, you'll need to create the python/Library1 folder.
+
Sur ces deux plates-formes, vous devrez créer le dossier python/Library1.
  
Here is the code for test_macro.py, adapted from the OO Pascal example above:
+
Voici le code pour test_macro.py, adapté de l'exemepl OO en Pascal du dessus:
  
<syntaxhighlight lang="python"># Python macro that tests UNO by creating new document and inserting some text.
+
<syntaxhighlight lang="python"># Macro Python qui teste UNO en créant un nouveau document et y insère du texte
  
 
import uno
 
import uno
Line 168: Line 170:
 
   doc = desktop.loadComponentFromURL('private:factory/swriter', '_blank', 0, ())
 
   doc = desktop.loadComponentFromURL('private:factory/swriter', '_blank', 0, ())
 
   textCursor = doc.Text.createTextCursor()
 
   textCursor = doc.Text.createTextCursor()
   doc.Text.insertString(textCursor, 'Hello World', 0)
+
   doc.Text.insertString(textCursor, 'Salut Monde', 0)
 
</syntaxhighlight>
 
</syntaxhighlight>
  
In OO, choose Tools | Macros | Organize Macros | Python and run the macro to make sure it works.
+
Dans OO, choisissez Tools | Macros | Organize Macros | Python et exécuter la macro pour être sûr que ça marche
  
==== Step 2. Test UNO via Python standalone script ====
+
==== Etape 2. Tester UNO via un script Python autonome ====
  
Here is the same code as a standalone script:
+
Voici le même code que dans le script autonome:
  
<syntaxhighlight lang="python"># Python script that tests UNO by creating new document and inserting some text.
+
<syntaxhighlight lang="python"># Macro Python qui teste UNO en créant un nouveau document et y insère du texte
  
 
import sys
 
import sys
Line 194: Line 196:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Save this to file test.py and run it like this on Windows from a command line. Note: On Windows and Linux, use the version of Python included with OO; on Mac OS X, use the system's Python 2.3.
+
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.
  
 
<pre>"\program files\openoffice.org 2.3\program\python" test.py</pre>
 
<pre>"\program files\openoffice.org 2.3\program\python" test.py</pre>
  
On Mac OS X, run the script like this from a Terminal window:
+
Sur Mac OS X, exécutez le script comme ça depuis la fenêtre Terminal:
  
 
<syntaxhighlight lang="bash">#!/bin/sh
 
<syntaxhighlight lang="bash">#!/bin/sh
Line 204: Line 206:
 
python2.3 test.py</syntaxhighlight>
 
python2.3 test.py</syntaxhighlight>
  
Unfortunately, this script doesn't work either on Windows or Mac OS X. On Windows, it displays an error dialog with no text (!) and then outputs an error message to the console that says "Cannot connect to soffice server". On Mac OS X, it starts NeoOffice and creates the new document, then NeoOffice shuts down abruptly.
+
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.
  
==== UNO Python To-Do ====
+
==== UNO Python A-faire ====
  
Obviously additional investigation is needed before we can proceed to step 3. You are welcome to work on this. Here are a couple things to try:
+
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:
  
* Test on Linux
+
* Tester sur Linux
* Test on more recent versions of OpenOffice
+
* Tester sur des versions plus récentes d'OpenOffice
 
 
* Jan. 5, 2009: Results of testing OpenOffice 3 on Windows:
 
** OO 3.0.0 support for user Python macros is broken (Step 1); fixed with OO 3.0.1 RC1.
 
** Step 2 no longer displays the empty error dialog and the console exception message is different, but still doesn't start OO.
 
** Note that paths to various parts of OO and to user macros have changed with OO 3.
 
  
 +
* Jan. 5, 2009: Résultats des tests d'OpenOffice 3 sur Windows:
 +
** OO 3.0.0 Le support pour les utilisateurs de macro Python est rompu (Etape 1); corrigé avec OO 3.0.1 RC1.
 +
** 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.
 +
** Notez que les chemins vers les différentes parties de OO et des macros utilisateur ont changé avec OO 3.
  
 
----
 
----
== Using the fpXMLXSDExport unit ==
 
FPC 2.6 and newer contain the '''fpXMLXSDExport''' unit, part of the FCL-DB export components. With that, you can export datasets to various XML formats, including a Microsoft Access-compatible format and a Microsoft Excel-compatible format.
 
  
The Access format can output XML with or without an embedded XSD data/table definition. Note that exporting binary/BLOB type data needs additional action at the Access import end, as Access does not support proper binary fields, only OLE fields.
+
== En utilisant l'unité fpXMLXSDExport ==
 +
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.
  
In the Excel format, multiline text fields are not supported at the moment: the line ends are removed during the export.
+
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.
  
Lazarus provides a visual component for this: after installing the '''lazdbexport''' package, you will see the '''TXMLXSDExporter''' component on the '''Data Export''' tab
+
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.
  
See [[fpXMLXSDExport]] for details.
+
Lazarus fournit un composant visuel pour cela: après l'installation du paquet '''lazdbexport''', vous verrez le composant '''TXMLXSDExporter''' sur l'onglet '''Data Export'''.
  
== Using the Free Pascal Spreadsheet Library ==
+
Voir [[fpXMLXSDExport]] pour les détails.
  
Another way to automate repetitive work with spreadsheets is to use the [[FPSpreadsheet]] library. It can read and write spreadsheets in several formats and it doesn't require having any external application installed on the machine.
+
== En utilisant la bibliothèque Spreadsheet de Free Pascal ==
  
The advantages are that fpspreadsheet is 100% ObjectPascal code, and it requires no external libraries or programs.
+
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.
  
== Writing an Excel file using ADO ==
+
Les avantages sont que FPSpreadsheet est à 100% du code [[Object_Pascal|Pascal Objet]] et qu'elle ne nécessite aucune bibliothèque ou programme.
please write me.
 
  
== Reading/Writing an Excel file using OLE ==
+
== En écrivant un fichier Excel en utilisant ADO ==
 +
Ecrire à l'auteur de la page anglaise.
  
This method needs Excel to be installed on the user's machine because it uses OLE to access it.
+
== En écrivant/lisant un fichier Excel en utilisant OLE ==
 +
Cette méthode nécessite qu'Excel soit installé sur la machine de l'utilisateur car elle utilise OLE pour y accéder.
  
'''''Keep in mind that this method starts Excel in the background, which opens the file and works with it like a real user.''
+
'''''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.'''''
'''
 
  
* Create a new form with button, stringgrid and edit.
+
* Créez un nouvelle fiche avec un TButton, un TStringGrid et un TEdit.
* Create a new Excel file and fill a few cells.
+
* Créez un nouveau fichier Excel et remplissez quelques cellules.
  
  
Line 254: Line 254:
  
  
Example - Open/Read Excel file:
+
Exemple - Ouvrir/lire le fichier Excel:
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
uses .....  comobj;
 
uses .....  comobj;
  
Line 265: Line 265:
  
 
begin
 
begin
  XLApp := CreateOleObject('Excel.Application'); // requires comobj in uses
+
  XLApp := CreateOleObject('Excel.Application'); // nécessite comobj dans uses
 
  try
 
  try
   XLApp.Visible := False;        // Hide Excel
+
   XLApp.Visible := False;        // Cache Excel
 
   XLApp.DisplayAlerts := False;
 
   XLApp.DisplayAlerts := False;
 
   path := edit1.Text;
 
   path := edit1.Text;
   XLApp.Workbooks.Open(Path);    // Open the Workbook
+
   XLApp.Workbooks.Open(Path);    // Ouvre le classeur
 
   for x := 1 to 4 do
 
   for x := 1 to 4 do
 
     begin
 
     begin
 
     for y := 1 to 6 do
 
     for y := 1 to 6 do
 
       begin
 
       begin
       SG.Cells[x,y] := XLApp.Cells[y,x].Value;  // fill stringgrid with values
+
       SG.Cells[x,y] := XLApp.Cells[y,x].Value;  // Remplit le TStringGrid avec les valeurs
 
       end;
 
       end;
 
     end;
 
     end;
Line 284: Line 284:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
If you want to make some changes and you want them to write back into the Excel, file you can use:
+
Si vous voulez faire des modifications  et que vous voulez les reporter dans Excel, vous pouvez utiliser:
  
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
XLApp.Cells[x,y].Value := SG.Cells[y,x];
 
XLApp.Cells[x,y].Value := SG.Cells[y,x];
 
</syntaxhighlight>
 
</syntaxhighlight>
  
If you want to save:
+
Si vous voulez enregistrer:
<syntaxhighlight>
+
<syntaxhighlight lang=pascal>
 
XLApp.ActiveWorkBook.Save;
 
XLApp.ActiveWorkBook.Save;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Read/Writing an Excel file using the SpreadSheet Interface Component ==
+
== En lisant/écrivant un fichier Excel en utilisant l'interface de composant SpreadSheet ==
  
The component provides a library interface, abstracting the Excel COM and the Calc Open Office UNO interfaces.
+
Le composant fournit une bibliothèque d'interface, faisant abstraction des interfaces Excel COM et Calc Open Office UNO.
The component is available here:
+
Le composant est disponible là: http://www.tcoq.org/composants
http://www.tcoq.org/composants
 
  
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). It hides most of the drudgery of working with low-level code.
+
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
Be careful, this is a work-in-progress. Use it at your own risk.
 
  
Functionality:
 
  
* creating and loading excel workbooks,
+
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.
* saving workbooks,
 
* creating and accessing sheets,
 
* getting values and setting values (and formulas) in cells,
 
* getting and changing color of cells,
 
* getting and changing column height and row width,
 
* creating comments,
 
* creating shapes,
 
* creating charts.
 
  
'''Inits first.'''
+
Soyez prudent, c'est un travail en cours. Vous l'utilisez à vos propres risques.
  
<syntaxhighlight>  IMPLEMENTATION
+
Fonctionnalité:
 +
 
 +
* création et chargement de classeurs Excel,
 +
* enregistrement de classeurs,
 +
* création et accès aux feuilles de calcul,
 +
* obtention et modification des valeurs (et formules) dans les cellules,
 +
* obtention et modification de la couleur des cellules,
 +
* obtention et modification de la hauteur des lignes et de la largeur des colonnes,
 +
* création de commentaires,
 +
* création de formes ,
 +
* création de graphes.
 +
 
 +
'''D'abord les Inits.'''
 +
 
 +
<syntaxhighlight lang=pascal>  IMPLEMENTATION
 
   USES
 
   USES
 
     ExcelUtilities,
 
     ExcelUtilities,
Line 325: Line 328:
 
   VAR
 
   VAR
 
   aCell    : IRange ;
 
   aCell    : IRange ;
   aValue  : OleVariant ; // Not sure about this, but it works. ie( Edit.Text := STRING(aValue); )
+
   aValue  : OleVariant ; // Pas sûr de cela, mais ça marche. ie( Edit.Text := STRING(aValue); )
 
   ExcelApp : TExcelApplication ;
 
   ExcelApp : TExcelApplication ;
 
   ExcelWbs : IWorkBooks ;
 
   ExcelWbs : IWorkBooks ;
Line 333: Line 336:
 
   ExcelSheets : ISheets ;</syntaxhighlight>
 
   ExcelSheets : ISheets ;</syntaxhighlight>
  
Getting a sheet is simple:
+
Obtenir une feuille de calcul est simple:
<syntaxhighlight>  // Initializing the common excel workbook:
+
<syntaxhighlight lang=pascal>  // Initialisation le classeur Excel:
 
   ExcelApp        := TExcelApplication.Create(nil) ;
 
   ExcelApp        := TExcelApplication.Create(nil) ;
 
   ExcelApp.Active  := True ;
 
   ExcelApp.Active  := True ;
Line 344: Line 347:
 
   ExcelSheet  := ExcelSheets.Sheet(1) ;</syntaxhighlight>
 
   ExcelSheet  := ExcelSheets.Sheet(1) ;</syntaxhighlight>
  
Playing around with cells is simple too:
+
S'amuser avec les cellules est aussi simple:
<syntaxhighlight>  // adding a value
+
<syntaxhighlight lang=pascal>  // Ajout d'une valeur
 
   aCell := ExcelSheet.Cells(1, 1) ;
 
   aCell := ExcelSheet.Cells(1, 1) ;
 
   aCell.Value := 10;
 
   aCell.Value := 10;
  
   // adding a formula
+
   // Ajout d'une formule
 
   aCell := ExcelSheet.Cells(2,1) ;
 
   aCell := ExcelSheet.Cells(2,1) ;
 
   aCell.Formula := '=A1+10' ;
 
   aCell.Formula := '=A1+10' ;
  
   // getting the value computed in Excel
+
   // Obtenir la valeur calculée dans Excel
 
   aValue := aCell.Value ;</syntaxhighlight>
 
   aValue := aCell.Value ;</syntaxhighlight>
  
 +
Le cas de test fourni a de nombreux autres exemples.
  
The test case provided has many more examples.
+
==Copier du HTML dans le prese-papier==
  
==Copy HTML to the clipboard==
+
<p>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.</p>
 +
<p>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.
  
You can copy HTML to the clipboard which is understood by many applications. This way you can copy formatted text. For those applications that only understand text put plain text too.
+
[[Clipboard#Windows|Voir ici un exemple qui marche avec Microsoft Office.]]</p>
  
<syntaxhighlight>uses
+
 
 +
<syntaxhighlight lang=pascal>uses
 
   ClipBrd;
 
   ClipBrd;
 
...
 
...
   // register the mime type for text/html. You can do this once at program start:
+
   // enregistrer le type mime type pour text/html. Vous pouvez faire cela une fois pour toutes au démarrage du programme:
 
   ClipbrdFmtHTML:=RegisterClipboardFormat('text/html');
 
   ClipbrdFmtHTML:=RegisterClipboardFormat('text/html');
 
...
 
...
   // put text and html on the clipboard. Other applications will choose the best format automatically.
+
   // Nettoyer les formats précédents du presse-papier avant de commencer
 +
  Clipboard.Clear;
 +
 
 +
  // Déposer le texte et le HTML dans le presse-papier. Les autres applications choisiront le meilleur format automatiquement.
 
   ThePlainUTF8Text:='Simple text';
 
   ThePlainUTF8Text:='Simple text';
 
   Clipboard.AsText:=ThePlainUTF8Text;  
 
   Clipboard.AsText:=ThePlainUTF8Text;  
   AsHTML:='<b>Formatted</b> text'; // text with formattings
+
 
 +
   AsHTML:='<b>Formatted</b> text'; // texte avec formatage
 
   Clipboard.AddFormat(ClipbrdFmtHTML,AsHTML[1],length(AsHTML));</syntaxhighlight>
 
   Clipboard.AddFormat(ClipbrdFmtHTML,AsHTML[1],length(AsHTML));</syntaxhighlight>
  
==See also==
+
==Voir aussi==
  
 
* [[Clipboard]]
 
* [[Clipboard]]
  
== External links ==
+
== Liens externes ==
 
 
* [http://sc.openoffice.org/excelfileformat.pdf Excel file format] - description on OpenOffice website
 
  
[[Category:Tutorials]]
+
* [http://sc.openoffice.org/excelfileformat.pdf Excel file format] - Description dans le site Web OpenOffice

Latest revision as of 12:44, 21 February 2020

Windows logo - 2012.svg

Cet article s'applique uniquement à Windows.

Voir aussi: Multiplatform Programming Guide/fr

Deutsch (de) English (en) español (es) français (fr) italiano (it) русский (ru) 中文(中国大陆)‎ (zh_CN)

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.

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.

Utilisation de OpenOffice UNO Bridge

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):

api.openoffice.org

About Bridges

Voir aussi le sujet ci-dessous à propos de Python.

Utilisation de COM Automation pour interagir avec OpenOffice et Microsoft Office

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. 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.

OpenOffice sur Windows

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.

program TestOO;

{$IFDEF FPC}
 {$MODE Delphi}
{$ELSE}
 {$APPTYPE CONSOLE}
{$ENDIF} 

uses
  SysUtils, Variants, ComObj;

const
  ServerName = 'com.sun.star.ServiceManager';
var          
  Server     : Variant;
  Desktop    : Variant;
  LoadParams : Variant;
  Document   : Variant;
  TextCursor : Variant;
begin
  if Assigned(InitProc) then
    TProcedure(InitProc);

  try
    Server := CreateOleObject(ServerName);
  except
    WriteLn('Unable to start OO.');
    Exit;
  end;

  Desktop := Server.CreateInstance('com.sun.star.frame.Desktop');

  LoadParams := VarArrayCreate([0, -1], varVariant);

   {Crée un nouveeau document}
  Document := Desktop.LoadComponentFromURL('private:factory/swriter', '_blank', 0, LoadParams);


   {ou ouvrir un existant} // vous devez utiliser des / et non des \ ! dans le chemin d'accès
  //Document := Desktop.LoadComponentFromURL('file:///C:/my/path/mydoc.doc', '_blank', 0, LoadParams); 

  TextCursor := Document.Text.CreateTextCursor;

   {Insère un nouveau document}  //Remplacer avc vos valeur de nom de fichier
  TextCursor.InsertDocumentFromURL('file:///C:/my/path/mydoc.doc',  
                                   LoadParams);
end.

Office sur Windows

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.

program TestMsOffice;

{$IFDEF FPC}
 {$MODE Delphi}
{$ELSE}
 {$APPTYPE CONSOLE}
{$ENDIF} 

uses
  SysUtils, Variants, ComObj;

const
  ServerName = 'Word.Application';
var
  Server     : Variant;
  w:widestring;
begin
  if Assigned(InitProc) then
    TProcedure(InitProc);

  try
    Server := CreateOleObject(ServerName);
  except
    WriteLn('Unable to start Word.');
    Exit;
  end;

   {ouvre un document existant}  //Substituez votre votre chemin et nom de fichier
  w:= UTF8Decode('c:\my\path\mydoc.doc');
  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.
  Server.Visible := True;  {Make Word visible}

end.

Voici un échantillon de code de comment travailler dans un document Word ouvert, en utilisant le serveur d'automation de Word.

var
  Server: Variant;
begin
  try
    Server := GetActiveOleObject('Word.Application');
  except
    try
      ShowMessage('Word pas encore ouvert, crée un objet');
      // Si aucune instance de Word ne tourne, essayer de créer un nouvel objet Word
      Server := CreateOleObject('Word.Application');
    except
      ShowMessage('Ne peut pas lancer Word/Word pas installé ?');
      Exit;
    end;
  end;
end;

Limitations: Parce que End est un mot réservé de FPC, il doit être utiliser comme un paramètre après le signe &.

Server.ActiveDocument.Application.Selection.start := Server.ActiveDocument.Application.Selection.&end+1;

De nombreux exemples pour Excel sont disponibles dans la page Wiki allemande.

Tenter d'utiliser Python pour piloter OpenOffice

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:

  1. Tester UNO via une macro Python exécutée dans OO
  2. Tester UNO via un script Python autonome
  3. Support de l'exécution de scripts Python dans Pascal
  4. Tester UNO via un script Python exécuté dans Pascal.
  5. Une classe Pascal qui enveloppe Python UNO

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).

Etape 1. Tester UNO via une macro Python exécutée dans OO

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:

C:\Document and Setting\<username>\Application Data\OpenOffice.org2\user\Scripts\python\Library1

Sur Mac OS X, ce dossier est:

~/Library/Preferences/NeoOffice-2.2/user/Scripts/python/Library1

Sur ces deux plates-formes, vous devrez créer le dossier python/Library1.

Voici le code pour test_macro.py, adapté de l'exemepl OO en Pascal du dessus:

# Macro Python qui teste UNO en créant un nouveau document et y insère du texte

import uno

def TestNewDoc():
  ctx = uno.getComponentContext()
  smgr = ctx.ServiceManager
  desktop = smgr.createInstance('com.sun.star.frame.Desktop')
  doc = desktop.loadComponentFromURL('private:factory/swriter', '_blank', 0, ())
  textCursor = doc.Text.createTextCursor()
  doc.Text.insertString(textCursor, 'Salut Monde', 0)

Dans OO, choisissez Tools | Macros | Organize Macros | Python et exécuter la macro pour être sûr que ça marche

Etape 2. Tester UNO via un script Python autonome

Voici le même code que dans le script autonome:

# Macro Python qui teste UNO en créant un nouveau document et y insère du texte

import sys

if sys.platform == 'darwin':
  sys.path.append('/Applications/NeoOffice.app/Contents/MacOS')

import officehelper

ctx = officehelper.bootstrap()
smgr = ctx.ServiceManager
desktop = smgr.createInstance('com.sun.star.frame.Desktop')
doc = desktop.loadComponentFromURL('private:factory/swriter', '_blank', 0, ())
textCursor = doc.Text.createTextCursor()
doc.Text.insertString(textCursor, 'Hello World', 0)

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.

"\program files\openoffice.org 2.3\program\python" test.py

Sur Mac OS X, exécutez le script comme ça depuis la fenêtre Terminal:

#!/bin/sh
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH":/Applications/NeoOffice.app/Contents/MacOS"
python2.3 test.py

Malheureusement, ce script ne fonctionne pas non plus sur Windows ou Mac OS X (NDT: cest 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.

UNO Python A-faire

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:

  • Tester sur Linux
  • Tester sur des versions plus récentes d'OpenOffice
  • Jan. 5, 2009: Résultats des tests d'OpenOffice 3 sur Windows:
    • OO 3.0.0 Le support pour les utilisateurs de macro Python est rompu (Etape 1); corrigé avec OO 3.0.1 RC1.
    • 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.
    • Notez que les chemins vers les différentes parties de OO et des macros utilisateur ont changé avec OO 3.

En utilisant l'unité fpXMLXSDExport

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.

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.

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.

Lazarus fournit un composant visuel pour cela: après l'installation du paquet lazdbexport, vous verrez le composant TXMLXSDExporter sur l'onglet Data Export.

Voir fpXMLXSDExport pour les détails.

En utilisant la bibliothèque Spreadsheet de Free Pascal

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.

Les avantages sont que FPSpreadsheet est à 100% du code Pascal Objet et qu'elle ne nécessite aucune bibliothèque ou programme.

En écrivant un fichier Excel en utilisant ADO

Ecrire à l'auteur de la page anglaise.

En écrivant/lisant un fichier Excel en utilisant OLE

Cette méthode nécessite qu'Excel soit installé sur la machine de l'utilisateur car elle utilise OLE pour y accéder.

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.

  • Créez un nouvelle fiche avec un TButton, un TStringGrid et un TEdit.
  • Créez un nouveau fichier Excel et remplissez quelques cellules.


excel123.png


Exemple - Ouvrir/lire le fichier Excel:

uses .....  comobj;

procedure TForm1.Button1Click(Sender: TObject);

Var   XLApp: OLEVariant;
      x,y: byte;
      path: variant;

begin
 XLApp := CreateOleObject('Excel.Application'); // nécessite comobj dans uses
 try
   XLApp.Visible := False;         // Cache Excel
   XLApp.DisplayAlerts := False;
   path := edit1.Text;
   XLApp.Workbooks.Open(Path);     // Ouvre le classeur
   for x := 1 to 4 do
    begin
     for y := 1 to 6 do
      begin
       SG.Cells[x,y] := XLApp.Cells[y,x].Value;  // Remplit le TStringGrid avec les valeurs
      end;
    end;
 finally
   XLApp.Quit;
   XLAPP := Unassigned;
  end;

Si vous voulez faire des modifications et que vous voulez les reporter dans Excel, vous pouvez utiliser:

XLApp.Cells[x,y].Value := SG.Cells[y,x];

Si vous voulez enregistrer:

XLApp.ActiveWorkBook.Save;

En lisant/écrivant un fichier Excel en utilisant l'interface de composant SpreadSheet

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

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


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.

Soyez prudent, c'est un travail en cours. Vous l'utilisez à vos propres risques.

Fonctionnalité:

  • création et chargement de classeurs Excel,
  • enregistrement de classeurs,
  • création et accès aux feuilles de calcul,
  • obtention et modification des valeurs (et formules) dans les cellules,
  • obtention et modification de la couleur des cellules,
  • obtention et modification de la hauteur des lignes et de la largeur des colonnes,
  • création de commentaires,
  • création de formes ,
  • création de graphes.

D'abord les Inits.

  IMPLEMENTATION
  USES
    ExcelUtilities,
    SpreadSheetInterfaces ;

  VAR
   aCell    : IRange ;
   aValue   : OleVariant ; // Pas sûr de cela, mais ça marche. ie( Edit.Text := STRING(aValue); )
   ExcelApp : TExcelApplication ;
   ExcelWbs : IWorkBooks ;

  ExcelBook   : IWorkBook ;
  ExcelSheet  : ISheet ;
  ExcelSheets : ISheets ;

Obtenir une feuille de calcul est simple:

  // Initialisation le classeur Excel:
  ExcelApp         := TExcelApplication.Create(nil) ;
  ExcelApp.Active  := True ;
  ExcelApp.Visible := True ;

  ExcelWbs    := ExcelApp.WorkBooks ;
  ExcelBook   := ExcelWbs.Add ;
  ExcelSheets := ExcelBook.Sheets ;
  ExcelSheet  := ExcelSheets.Sheet(1) ;

S'amuser avec les cellules est aussi simple:

  // Ajout d'une valeur
  aCell := ExcelSheet.Cells(1, 1) ;
  aCell.Value := 10;

  // Ajout d'une formule
  aCell := ExcelSheet.Cells(2,1) ;
  aCell.Formula := '=A1+10' ;

  // Obtenir la valeur calculée dans Excel
  aValue := aCell.Value ;

Le cas de test fourni a de nombreux autres exemples.

Copier du HTML dans le prese-papier

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.

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. Voir ici un exemple qui marche avec Microsoft Office.


uses
  ClipBrd;
...
  // enregistrer le type mime type pour text/html. Vous pouvez faire cela une fois pour toutes au démarrage du programme:
  ClipbrdFmtHTML:=RegisterClipboardFormat('text/html');
...
  // Nettoyer les formats précédents du presse-papier avant de commencer
  Clipboard.Clear;

  // Déposer le texte et le HTML dans le presse-papier. Les autres applications choisiront le meilleur format automatiquement.
  ThePlainUTF8Text:='Simple text';
  Clipboard.AsText:=ThePlainUTF8Text; 

  AsHTML:='<b>Formatted</b> text'; // texte avec formatage
  Clipboard.AddFormat(ClipbrdFmtHTML,AsHTML[1],length(AsHTML));

Voir aussi

Liens externes