Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Importar datos de Calc de OpenOffice

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Importar datos de Calc de OpenOffice Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: me manda un error Responder citando

en esta linea me manda un error
ServiceManager = CreateOleObject("com.sun.star.ServiceManager");

Error en la ejecuccion del servidor
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola! ¿Sobre qué sistema operativo has ejecutado esto?. En win XP funciona sin problemas.
Y ¿que versión de Open Office estás usando?. Igual la cosa va por ahí. Puede que hayan hecho cambios. Pero si es así, aquí:
http://www.openoffice.org/api/docs/common/ref/com/sun/star/frame/Desktop.html
No veo que diga nada de esto.
Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Igual esto te ayuda:

http://www.oooforum.org/forum/viewtopic.phtml?t=116113
http://www.oooforum.org/forum/viewtopic.phtml?p=318090#318090

Y sino no sé donde mirar.

Suerte.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Voy a investigar a ver que saco

Muchas gracias.

Carlos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
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


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.