 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Lun 28 May, 2007 9:15 am Asunto: Importar datos de Calc de OpenOffice |
|
|
Esto es un ejemplo de como importar datos de una hoja de Calc de OpenOffice
Cuando haga una función como tal también la pondré por aquí. De momento esto es por si acaso alguien tiene la necesidad, para que tenga un punto de partida.
Luego haré una función de exportar.
| Código: |
//------------------------------------------------------------------------
// Desarrollado por Vidal Lasa con la inestimable colaboración
// de _Leo (muchas gracias)
//------------------------------------------------------------------------
Variant ServiceManager,Desktop,Document,Sheets,FilePath,Sheet,MyStruct,View,Cell;
Variant Valor,CellCursor,Filas,Columnas;
//Variant vEmptyParam(OPENARRAY(int, (0, -1)), varInteger); //Un array vacío
Variant VariantArray(OPENARRAY(int, (0, 0)), varVariant);
ServiceManager = CreateOleObject("com.sun.star.ServiceManager");
if(VarType(ServiceManager) == varDispatch)
Desktop = ServiceManager.OleFunction("CreateInstance","com.sun.star.frame.Desktop");
MyStruct = ServiceManager.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
//false = Lo abre sin mostrar el OpenOffice
//true = muestra una instancia del calc
MyStruct.OlePropertySet("name","Hidden");
MyStruct.OlePropertySet("value",false);
VariantArray.PutElement(MyStruct, 0);
//Así se abre una instancia de Calc con una hoja en blanco
//Document = Desktop.OleFunction("loadComponentFromURL", "private:factory/scalc", "_blank", 0, VariantArray);//vEmptyParam);
//Así se abre una instancia con el documento. Lo de File:/// es por
// que esta función necesita una URL, sino no funciona
Document = Desktop.OleFunction("LoadComponentFromURL","File:///C:/MiCarpeta/MiDocumento.xls", "_blank", 0, VariantArray);
if (VarType(Document) == varDispatch) Sheets = Document.OleFunction("getSheets");
//Inserta una nueva hoja
//Sheets.OleFunction("insertNewByName", "HojaNueva",1);//NewSheetName, 1);
//Sheets = Document.OleFunction("getSheets");
//Coge una hoja existente
Sheet = Sheets.OleFunction("getByName", "Hoja1");
//Se crea un cursor y devuelve la fila y la columna hasta donde hay datos
CellCursor = Sheet.OleFunction("createCursor");
CellCursor.OleFunction("GotoEndOfUsedArea",True);
Filas = CellCursor.OleFunction("GetRows");
int filamax = Filas.OleFunction("getCount");
ShowMessage(AnsiString(filamax));
Columnas = CellCursor.OleFunction("GetColumns");
int colmax = Columnas.OleFunction("getCount");
ShowMessage(AnsiString(colmax));
//Se posiciona en la página activa (?)
//View = Document.OleFunction("getCurrentController");
//View.OleFunction("setActiveSheet", Sheet);
Cell = Sheet.OleFunction("getCellByPosition", 0,4);//col, row);
Cell.OleFunction("setValue",123456);
Valor = Cell.OleFunction("getValue");
ShowMessage(AnsiString(Valor));
Cell = Sheet.OleFunction("getCellByPosition", 2,7);//col, row);
int tipo = Cell.OleFunction("getType");
switch (tipo)
{
case 1:Valor = Cell.OleFunction("getValue"); break;
case 2:Valor = Cell.OleFunction("getString"); break;
case 3:Valor = Cell.OleFunction("getFormula"); break;
default: Valor = tipo; break;
}
ShowMessage(AnsiString(Valor));
Document.OleFunction("close", true);
Document = Unassigned();
Desktop.OleFunction("terminate");
Desktop = Unassigned();
VariantArray = Unassigned(); |
Espero que os resulte de utilidad. |
|
| Volver arriba |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Mar 29 May, 2007 9:29 am Asunto: |
|
|
Aquí lo mismo, pero ya dentro de una función y con algunos cambios:
| Código: |
//-----------------------------------------------------------------------------
// By Vidal Lasa. Gracias _Leo por tu ayuda
// Importa una hoja Excel desde OpenOffice
// Variant vEmptyParam(OPENARRAY(int, (0, -1)), varInteger); //Un array vacío
//-----------------------------------------------------------------------------
void ImportarCalc(AnsiString Fichero,int CualHoja,TStringGrid * Rejilla, bool Oculta)
{
Variant ServiceManager,Escritorio,Propiedades,Documento,Hojas,Hoja;
Variant CellCursor,Filas,Columnas,Vista,Celda,Valor;
Variant VariantArray(OPENARRAY(int, (0, 0)), varVariant);
int filamax,colmax,filas,columnas,tipo;
//La conexión OLE con el OpenOffice
ServiceManager = CreateOleObject("com.sun.star.ServiceManager");
//Si es una variable tipo Dispatch es que la conxesión se ha realizado con éxito
if(VarType(ServiceManager) == varDispatch)
{
//Se necesita una instancia del desktop de OpenOffice
Escritorio = ServiceManager.OleFunction("CreateInstance","com.sun.star.frame.Desktop");
//En Propiedades se almacena una estructura con la manera en la que se quiere
//presentar el OOo
Propiedades = ServiceManager.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
//false = Lo abre sin mostrar el OOo
//true = muestra una instancia del calc
Propiedades.OlePropertySet("name","Hidden");
Propiedades.OlePropertySet("value",Oculta);
VariantArray.PutElement(Propiedades, 0);
//si el nombre está vacío se abre una hoja en blanco
//sino se le añade "File:///" para convertirlo en una URL
if(Fichero.Length() == 0) Fichero = "private:factory/scalc";
else Fichero = AnsiString("File:///")+Fichero;
//Así se abre una instancia con el documento
Documento = Escritorio.OleFunction("LoadComponentFromURL",Fichero.c_str(), "_blank", 0, VariantArray);
//Si hay documento
if(VarType(Documento) == varDispatch)
{
Hojas = Documento.OleFunction("getSheets");
//Coge una hoja existente pero no se posiciona en ella
Hoja = Hojas.OleFunction("getByIndex", CualHoja);
//Se posiciona en la página activa (Si Hidden es true esto sólo estorba)
Vista = Documento.OleFunction("getCurrentController");
Vista.OleFunction("setActiveSheet", Hoja);
//Se crea un cursor y devuelve la fila y la columna usadas
CellCursor = Hoja.OleFunction("createCursor");
CellCursor.OleFunction("GotoEndOfUsedArea",True);
Filas = CellCursor.OleFunction("GetRows");
filamax = Filas.OleFunction("getCount");
Columnas = CellCursor.OleFunction("GetColumns");
colmax = Columnas.OleFunction("getCount");
//Se pasa lo que se vaya leyendo a la rejilla
Rejilla->RowCount = filamax;
Rejilla->ColCount = colmax;
//ShowMessage(AnsiString(filamax));
//ShowMessage(AnsiString(colmax));
for(filas=0;filas < filamax;filas++)
{
for(columnas=0;columnas <colmax>Cells[columnas][filas] = AnsiString(Valor);
}
}
//Se cierra todo y se ¿libera? lo asignado
//Aunque se supone que al salir de la fución se debe liberar todo
Documento.OleFunction("close", true);
Escritorio.OleFunction("terminate");
ServiceManager = Unassigned();
Escritorio = Unassigned();
Propiedades = Unassigned();
Documento = Unassigned();
Hojas = Unassigned();
Hoja = Unassigned();
CellCursor = Unassigned();
Filas = Unassigned();
Columnas = Unassigned();
Celda = Unassigned();
Valor = Unassigned();
} //si hay documento
} //si hay OpenOffice
}
//----------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
OpenDialog1->Title = "Cargar Kanban Bsh";
OpenDialog1->InitialDir = "D:\\KanbanBsh"; //OJO! A piñón fijo!
OpenDialog1->DefaultExt = "XLS";
OpenDialog1->FileName = "*.xls";
if(OpenDialog1->Execute())
{
ImportarCalc(OpenDialog1->FileName,0,Rejilla,true);
}
}
|
|
|
| Volver arriba |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
Publicado: Jue 31 May, 2007 9:59 am Asunto: |
|
|
Y ahora una función de exportar:
| Código: |
//-----------------------------------------------------------------------------
// Vidal/2007
// Exporta una hoja Excel desde OpenOffice
// Variant vEmptyParam(OPENARRAY(int, (0, -1)), varInteger); //Un array vacío
//-----------------------------------------------------------------------------
void ExportarCalc(TStringGrid * Rejilla)
{
Variant ServiceManager,Escritorio,Propiedades,Documento,Hojas,Hoja;
Variant CellCursor,Filas,Columnas,Vista,Celda,Valor;
Variant VariantArray(OPENARRAY(int, (0, 0)), varVariant);
int filamax,colmax,filas,columnas,tipo;
//La conexión OLE con el OpenOffice
ServiceManager = CreateOleObject("com.sun.star.ServiceManager");
//Si es una variable tipo Dispatch es que la conxesión se ha realizado con éxito
if(VarType(ServiceManager) == varDispatch)
{
//Se necesita una instancia del desktop de OpenOffice
Escritorio = ServiceManager.OleFunction("CreateInstance","com.sun.star.frame.Desktop");
//En Propiedades se almacena una estructura con la manera en la que se quiere
//presentar el OOo
Propiedades = ServiceManager.OleFunction("Bridge_GetStruct","com.sun.star.beans.PropertyValue");
//false = Lo abre sin mostrar el OOo
//true = muestra una instancia del calc
Propiedades.OlePropertySet("name","Hidden");
Propiedades.OlePropertySet("value",false);
VariantArray.PutElement(Propiedades, 0);
//Así se abre una instancia con el documento
Documento = Escritorio.OleFunction("LoadComponentFromURL","private:factory/scalc", "_blank", 0, VariantArray);
//Si hay documento
if(VarType(Documento) == varDispatch)
{
Hojas = Documento.OleFunction("getSheets");
//Coge una hoja existente pero no se posiciona en ella
Hoja = Hojas.OleFunction("getByIndex", 0);
//Se posiciona en la hoja activa
Vista = Documento.OleFunction("getCurrentController");
Vista.OleFunction("setActiveSheet", Hoja);
for(filas=0;filas <Rejilla>RowCount;filas++)
{
for(columnas=0;columnas <Rejilla>ColCount;columnas++)
{
Celda = Hoja.OleFunction("getCellByPosition", columnas,filas);//col, row);
Celda.OleFunction("setString",Rejilla->Cells[columnas][filas].c_str());
}
}
ServiceManager = Unassigned();
Escritorio = Unassigned();
Propiedades = Unassigned();
Documento = Unassigned();
Hojas = Unassigned();
Hoja = Unassigned();
CellCursor = Unassigned();
Filas = Unassigned();
Columnas = Unassigned();
Celda = Unassigned();
Valor = Unassigned();
} //si hay documento
} //si hay OpenOffice
}
|
|
|
| Volver arriba |
|
 |
luisglz Cdt

Registrado: 29 Ago 2008Mensajes: 4
|
Publicado: Mie 05 Oct, 2011 5:27 pm Asunto: me manda un error |
|
|
en esta linea me manda un error
ServiceManager = CreateOleObject("com.sun.star.ServiceManager");
Error en la ejecuccion del servidor |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mar 09 Abr, 2013 4:04 pm Asunto: |
|
|
A mi el error me lo aquí:
Escritorio = ServiceManager.OleFunction("CreateInstance","com.sun.star.frame.Desktop");
Y me dice, "Tipo de variable incorrecto"
Se os ocurre por que puede ser?
Un abrazo.
Carlos |
|
| Volver arriba |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Mie 10 Abr, 2013 11:08 am Asunto: |
|
|
Muy buenas,
Pues estoy usando el XE3 en windows 7 64 y la version de OpenOffice la ultima que esta ahora la 3.4.1
Un abrazo.
Carlos |
|
| Volver arriba |
|
 |
laremi400 Master

Registrado: 12 May 2004Mensajes: 179
|
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Jue 11 Abr, 2013 5:16 pm Asunto: |
|
|
Voy a investigar a ver que saco
Muchas gracias.
Carlos |
|
| Volver arriba |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Jue 18 Abr, 2013 5:28 pm Asunto: |
|
|
Nada no hay forma,
Lo extraño es que en Builder 6 funciona perfectamente, pero copias y pegas en XE3 y da ese fallo.
Seguire mirando a ver que puede ser.
Un saludo.
Carlos |
|
| Volver arriba |
|
 |
|
|
No puedes publicar temas nuevos en este foro No puedes responder a temas en este foro No puedes editar tus mensajes en este foro No puedes borrar tus mensajes en este foro No puedes votar en las encuestas de este foro
|
© 2002–2026 Club Builder · Funciona con phpBB.
|