Sign in Join
Wiki copytemporary

Office Automation/es: what changed

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

Title: Office Automation/es

OldNewLine
1+La capacidad de interactuar con los programas ofimáticos y así generar hojas de cálculo, documentos de texto y presentaciones desde nuestro código puede ser muy valiosa en la oficina, y ahorrar mucho tiempo a aquellos que lo necesiten. Un ejemplo es la creación de aplicaciones que pueden leer archivos en un formato arbitrario y guardar la salida en un archivo de Excel, una tarea mucho más eficiente de hacer con el código a continuación expuesto que de forma manual.
2+
3+## Utilizando *UNO Bridge* de OpenOffice
4+
5+   OpenOffice tiene enlaces para lenguaje como C, Java, JavaScript y Python. En Windows, OpenOffice también puede ser manipulado en Pascal a través de automatización COM (véase más adelante), pero actualmente no existe una forma sencilla de usar OpenOffice UNO (Universal Network Objects -Objetos Universales de Red-) desde Pascal en OS X y Linux. Si estás interesado en el desarrollo de un puente entre OO y Pascal, por favor mira estos enlaces para más información (precaución: estos enlaces son muy *técnicos* al estilo SUN):
6+
7+[api.openoffice.org](http://api.openoffice.org/)
8+
9+[About_Bridges](http://wiki.services.openoffice.org/wiki/Uno/Article/About_Bridges)
10+
11+Ver también el tema más abajo sobre Python.
12+
13+## Usar automatización COM para interactuar con OpenOffice y Microsoft Office
14+
15+   La automatización COM es exclusiva de Windows, así que los ejemplos que siguen no funcionan ni en OS X ni en Linux. Para estas plataformas ver [Prescindiendo de la automatización COM de Windows](http://wiki.lazarus.freepascal.org/Multiplatform_Programming_Guide#Making_do_without_Windows_COM_Automation). Si sólo necesita crear y/o ver un documento de texto desde su programa, da un vistazo al [XDev Toolkit](http://web.fastermac.net/~MacPgmr/XDev/XDevStatus.html#RTF).
16+
17+   Este es una ejemplo sencillo de cómo abrir un documento con tu programa utilizando el servidor de automatización de OpenOffice. Recuerda que esto sólo funciona en Windows.
18+
19+``` pascal
20+ program PruebaOpenOffice;
21+
22+ {$IFDEF FPC}
23+ {$MODE Delphi}
24+ {$ELSE}
25+ {$APPTYPE CONSOLE}
26+ {$ENDIF}
27+
28+ uses
29+ SysUtils, Variants, ComObj;
30+
31+ const
32+ NombreServidor = 'com.sun.star.ServiceManager';
33+ var
34+ Servidor : Variant;
35+ Escritorio : Variant;
36+ ParametrosCarga : Variant;
37+ Documento : Variant;
38+ CursorTexto : Variant;
39+ begin
40+ if Assigned(InitProc) then
41+ TProcedure(InitProc);
42+
43+ try
44+ Servidor := CreateOleObject(NombreServidor);
45+ except
46+ WriteLn('No puedo arrancar OpenOffice.');
47+ Exit;
48+ end;
49+
50+ Escritorio := Servidor.CreateInstance('com.sun.star.frame.Desktop');
51+
52+ ParametrosCarga := VarArrayCreate([0, -1], varVariant);
53+
54+ {Crear un documento nuevo}
55+ Documento := Escritorio.LoadComponentFromURL('private:factory/swriter',
56+ '_blank', 0, ParametrosCarga);
57+
58+ CursorTexto := Documento.Text.CreateTextCursor;
59+
60+ {Insertarun documento existente} //Substituye por tu ruta y documento
61+ CursorTexto.InsertDocumentFromURL('file:///C|/mi/ruta/midocumento.doc',
62+ ParametrosCarga);
63+ end.
64+```
65+
66+   Y aquí un ejemplo sencillo de cómo abrir un documento con tu programa usando el servidor de automatización de Word. Ten en cuenta que este ejemplo sólo funciona en Windows y sólo cuando se compila con Delphi; Free Pascal 2.2.2 compila el código, pero no funciona. Por favor. Comprueba más adelante o prueba con una versión más reciente de FPC.
67+
68+``` pascal
69+ program PruebaMsOffice;
70+
71+ {$IFDEF FPC}
72+ {$MODE Delphi}
73+ {$ELSE}
74+ {$APPTYPE CONSOLE}
75+ {$ENDIF}
76+
77+ uses
78+ SysUtils, Variants, ComObj;
79+
80+ const
81+ NombreServidor = 'Word.Application';
82+ var
83+ Servidor : Variant;
84+ begin
85+ if Assigned(InitProc) then
86+ TProcedure(InitProc);
87+
88+ try
89+ Servidor := CreateOleObject(NombreServidor);
90+ except
91+ WriteLn('No puedo arrancar M$Word.');
92+ Exit;
93+ end;
94+
95+ {Abrir un documento existente} //Substituye por tu ruta y documento
96+ Servidor.Documents.Open('c:\mi\ruta\midocumento.doc');
97+
98+ Servidor.Visible := True; {Hacer Word visible}
99+
100+ end.
101+```
102+
103+## Utilizar Python para manejar OpenOffice
104+
105+   Dado que OpenOffice incluye soporte para Python, sería posible ejecutar secuencias de comandos de Python desde Pascal para manipular OO, en lugar de un enlace real para lenguaje Pascal. Éstos son los pasos para un posible enfoque para realizarlo:
106+
107+1. Probar que UNO vía macro de Python funciona dentro de OO
108+2. Probar que UNO vía macro de Python independiente
109+3. Crear el soporte para correr macros de Python en Pascal
110+4. Probar que UNO vía macro de Python funciona con Pascal
111+5. Crear una clase Pascal para envolver Python UNO
112+
113+   Nota: Las siguientes macros han sido probadas con OpenOffice 2.3.1 en Windows XP y NeoOffice 2.2.5 Patch 6 en Mac OS X 10.4.11 (PowerPC).
114+
115+#### Paso 1. Probar que UNO vía macro de Python funciona dentro de OO
116+
117+   OpenOffice tiene herramientas para crear macros de JavaScript, pero no las macros Python, por lo que utilizaremos el editor de texto para guardar la secuencia de comandos siguiente para el archivo prueba_macro.py y colocarlo en la carpeta de macros OO del usuario. En Windows, esta carpeta es:
118+
119+ C:\Document and Setting\<NombreUsuario>\Application Data\OpenOffice.org2\user\Scripts\python\Library1
120+
121+   En Mac OS X, la carpeta es:
122+
123+ ~/Library/Preferences/NeoOffice-2.2/usuario/Scripts/python/Library1
124+
125+   En ambas plataformas es necesario crear la carpeta **python/Library1**.
126+
127+   Este es el código para prueba_macro.py, adaptado del ejemplo OO Pascal anterior:
128+
129+``` pascal
130+ # Macro Python que prueba UNO creando un nuevo documento e inserta en el algo de texto.
131+
132+ import uno
133+
134+ def PruebaNuevoDoc():
135+ ctx = uno.getComponentContext()
136+ smgr = ctx.ServiceManager
137+ escritorio = smgr.createInstance('com.sun.star.frame.Desktop')
138+ doc = escritorio.loadComponentFromURL('private:factory/swriter', '_blank', 0, ())
139+ textoCursor = doc.Text.createTextCursor()
140+ doc.Text.insertString(textoCursor, 'Hola Mundo', 0)
141+```
142+
143+   En OO, seleccionar **Herramientas \| Macros \| Organizar Macros \| Python...** y ejecuta la macro para comprobar que funciona.
144+
145+#### Paso 2. Probar que UNO funciona con una macro de Python independiente
146+
147+   Aquí el código para una macro independiente:
148+
149+``` pascal
150+ # Macro Python que prueba UNO creando un nuevo documento e inserta en el algo de texto.
151+
152+ import sys
153+
154+ if sys.platform == 'darwin':
155+ sys.path.append('/Applications/NeoOffice.app/Contents/MacOS')
156+
157+ import officehelper
158+
159+ ctx = officehelper.bootstrap()
160+ smgr = ctx.ServiceManager
161+ escritorio = smgr.createInstance('com.sun.star.frame.Desktop')
162+ doc = escritorio.loadComponentFromURL('private:factory/swriter', '_blank', 0, ())
163+ textoCursor = doc.Text.createTextCursor()
164+ doc.Text.insertString(textoCursor, 'Hola Mundo', 0)
165+
166+```
167+
168+   Guarda el archivo prueba.py y ejecútalo desde la línea de órdenes de Windows. Nota: En Windows y Linux, usa la versión de Python incluida con OO; en Mac OS X, usa la versión Python 2.3. del sistema.
169+
170+ "\program files\openoffice.org 2.3\program\python" test.py
171+
172+   En Mac OS X, corre la macro en una ventana de Terminal así:
173+
174+ #!/bin/sh
175+ export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH":/Applications/NeoOffice.app/Contents/MacOS"
176+ python2.3 test.py
177+
178+   Desafortunadamente, esta macro no funciona bien en Windows o Mac OS X. En Windows, se muestra un diálogo de error sin texto (¡!) Y luego escribe un mensaje de error en la consola que dice "No se puede conectar a un servidor soffice". En Mac OS X, se inicia NeoOffice y crea el nuevo documento, a continuación, NeoOffice se cierra abruptamente.
179+
180+#### UNO Python Cosas por Hacer (ToDo)
181+
182+   Obviamente se necesita investigación adicional antes de proceder al paso 3. Te invitamos a trabajar en ello. Éstas son un par de cosas para probar:
183+
184+- Pruebas en Linux
185+- Pruebas en versiones más recientes de OpenOffice
186+
187+- Enero. 5, 2009: Resultados de probar OpenOffice 3 en Windows:
188+ - OO 3.0.0 soporte para macros Python de usuario roto (paso 1); arreglado en OO 3.0.1 RC1.
189+ - Paso 2 el diálogo vacío ya no se muestra y el el mensaje de error de la consola es diferente, pero OO sigue sin arrancar.
190+ - Ten en cuenta que las rutas a diferentes partes de OO y de las macros de usuario han cambiado con OO 3.
191+
192+------------------------------------------------------------------------
193+
194+## Usar la librería Spreadsheet de Free Pascal
195+
196+   Otra manera de automatizar tareas repetitivas con hojas de cálculo es utilizar la librería [[FPSpreadsheet]]. Puede leer y escribir hojas de cálculo en varios formatos y no requiere tener ninguna aplicación externa instalada en la máquina.
197+
198+## Escribir un archivo Excel usando ADO
199+
200+- Si alguien puede documentar este paso la información vendría muy bien.
201+
202+## Leer y escribir archivos Excel utilizando el componente Excel Interface
203+
204+   El componente está disponible aquí:
205+
206+
207+<http://tcoq.free.fr/composants.html>
208+
209+   Dado que la Automatización no está disponible, pero COM si lo está, el componente de interfaz de Excel proporciona un conjunto de clases que encapsula las llamadas a Lazarus a la interfaz COM de Excel (por debajo de la Automatización). Así se oculta la mayoría del aburrido código de trabajo a bajo nivel.
210+
211+   Funcionalidad:
212+
213+- crear y cargar libros de trabajo de excel,
214+- guardar libros de trabajo,
215+- crear y acceder a hojas,
216+- extraer y dar valores (y formulas) en las celdas,
217+- recuperar y vambiar colores de las celdas,
218+- recuperar y cambiar la anchura de las columnas y la altura de la filas,
219+- crear comentarios,
220+- crear formas,
221+- crear gráficos.
222+
223+    Obtener una hoja es sencillo:
224+
225+``` pascal
226+ // Iniciando un libro de trabajo excel corriente:
227+ ExcelAplicacion := TExcelApplication.Create(nil);
228+ ExcelAplicacion.Active := True;
229+ ExcelAplicacion.Visible := True;
230+ LibrosExcel := ExcelAplicacion.WorkBooks;
231+ unLibroExcel := LibrosExcel.Open(NombreArchivodePrueba)
232+ HojasExcel := unLibroExcel.Sheets;
233+ unaHojaExcel := HojasExcel.Sheet('Hoja1');
234+```
235+
236+   Trabajar con las celdas es muy fácil:
237+
238+``` pascal
239+ // añadiendo un valor
240+ unaCelda := unaHojaExcel.Cells(1, 1);
241+ unaCelda.Value := 10;
242+ // añadiendo una formula
243+ unaCelda := unaHojaExcel.Cells(2,1);
244+ unaCelda.Formula := '=A1+10';
245+ // obteniendo el valor claculado por Excel
246+ unValor := unaCelda.Value;
247+```
248+
249+   En el ejemplo facilitado hay muchos más ejemplos.
250+
251+## Enlaces externos
252+
253+- Descripción del formato de fichero Excel en el [sitio web de OpenOffice](http://sc.openoffice.org/excelfileformat.pdf)
254+
255+---
256+*From the Free Pascal wiki, page "Office Automation/es", 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