| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Mie 28 Ene, 2009 5:57 pm Asunto: Exportar ListView a Excel |
|
|
Hola a todos.
¿Existe alguna forma de exportar el contenido de un ListView a un Excel?
Gracias de antemano. |
|
| Volver arriba |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Jue 29 Ene, 2009 5:52 pm Asunto: |
|
|
Parece que tengo que empezar por aqui
| Código: | Variant Nuevo = CreateOleObject("Excel.Application");
|
pero me da error de que CreateOleObjetc es un undefined function. ¿Debo añadir alguna librería? Uso el BCB6
Saludos. |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 29 Ene, 2009 6:21 pm Asunto: |
|
|
| zankiu escribió: | | ¿Debo añadir alguna librería? Uso el BCB6 |
Un dato que se encuentra con gran facilidad en la ayuda del BCB sobre esa función:
#include<ComObj.hpp>
Y ademas en el foro encontraras muchisimos ejemplos de como controlar Excel utilizando "Automatización OLE". |
|
| Volver arriba |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Jue 29 Ene, 2009 8:36 pm Asunto: |
|
|
Hola de nuevo. Es la primera vez que toco esto, creo que no he sabido por donde buscar, gracias por el apunte.
He llegado a esto pero... tengo una duda con esta prueba:
| Código: | Variant Excel,ColeccionLibros,Libro,ColeccionHojas,Hoja,Celda;
//Crear un objeto de tipo aplicación excel
Excel = CreateOleObject("Excel.Application");
//Accedo a sus propiedades y métodos
Excel.OlePropertySet("Visible", true);
//Obtener un objeto que será una colección de objetos libros
ColeccionLibros=Excel.OlePropertyGet("Workbooks");
//Creamos los libros
//La colección está vacía y se añade un libro
ColeccionLibros.OleProcedure("Add");
//A partir de la colección se obtiene el primer objeto "Libro"
Libro=ColeccionLibros.OlePropertyGet("Item",1);
//A partir de la colección de libros se obtiene una colección de hojas
ColeccionHojas=Libro.OlePropertyGet("Worksheets");
//A partir de la colección de hojas se accede a objetos hojas y las nombro
ColeccionHojas.OlePropertyGet("Item",1).OlePropertySet("Name","prueba1");
//Se obtiene un objeto hoja, a partir de la colección de hojas
Hoja=ColeccionHojas.OlePropertyGet("Item",1);
Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",1,1).OlePropertySet("Value",(Variant)this->ListView->Items->Item[1]->Caption);
Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",1,2).OlePropertySet("Value","esto1");
Excel.OlePropertySet("DisplayAlerts",false);
Excel.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs","test.xls");
Excel=Unassigned; |
El código comentando esto:
| Código: | Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",1,1).OlePropertySet("Value",(Variant)this->ListView->Items->Item[1]->Caption); |
exporta correctamente, pero cuando quiero introducir datos del ListView del modo que lo hago, la misma aplicación me saca un error diciéndo "tipo de variable incorrecto"
¿Cómo tengo que introducir los datos para que sean del tipo de dato correcto? |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Jue 29 Ene, 2009 8:57 pm Asunto: |
|
|
Prueba con:
Hoja.OlePropertyGet("Cells").OlePropertyGet("Item", 1, 1).OlePropertySet("Value", ListView->Items->Item[1]->Caption.c_str());
o:
Hoja.OlePropertyGet("Cells").OlePropertyGet("Item", 1, 1).OlePropertySet("Value", WideString(ListView->Items->Item[1]->Caption)); |
|
| Volver arriba |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Jue 29 Ene, 2009 11:03 pm Asunto: |
|
|
| Código: |
Hoja.OlePropertyGet("Cells").OlePropertyGet("Item", 1, 1).OlePropertySet("Value", ListView->Items->Item[1]->Caption.c_str()); |
con lo anterior me exporta sin problemas.
He cambiado la línea a false:
Excel.OlePropertySet("Visible", false);
Tengo dos dudas:
1.¿Cómo puedo cerrar desde código el Excel una vez exportado los datos?
2.¿Cómo puedo modificar el ancho de las columnas?
He probado esto, pero va a ser que no.
| Código: | Celda.OlePropertyGet("Column").OlePropertySet("ColumnWidth",(Variant)5); |
Gracias |
|
| Volver arriba |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 30 Ene, 2009 12:19 am Asunto: |
|
|
1.- Excel.OleProcedure("Quit");
2.- Hoja.OlePropertyGet("Columns", 1 /*Nº.Columna*/).OlePropertySet("ColumnWidth", 30 /*Ancho caracteres*/);
o bien:
Variant Celda = Hoja.OlePropertyGet("Cells", 1, 2 /*Nº.columna*/);
Celda.OlePropertySet("ColumnWidth", 30 /*Ancho caracteres*/);
El ancho es en caracteres sin ningún atributo (negrita, etc.) en el caso de fuentes de ancho fijo. Si son de ancho variable será el ancho del carácter '0'. |
|
| Volver arriba |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Vie 30 Ene, 2009 7:23 pm Asunto: |
|
|
Gracias _Leo.
He estado buscando por la web y he encontrado más propiedades para darle formato a las celdas así que les echaré un ojo.
Otra duda que me queda, para mejorar el código ¿cómo puedo pasarle una ruta para guadar el documento excel generado? Como está ahora lo guarda por defecto en Mis Documentos. Si quiero que se tenga la opción de pasarle una ruta como sería?
He probado con esto y ok:
| Código: | String sPath = ExtractFilePath(Application->ExeName);
//String sPath = "C:\";
String sFicheroGenerado = sPath + "fichero.xls"; |
pero si quiero una ruta tipo:
| Código: | String sPath = "C:\"; |
No reconoce el carácter y da error ¿cómo debería ser?.
Saludos |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Vie 30 Ene, 2009 7:55 pm Asunto: |
|
|
| Código: | String sPath = "C:\\"; |
Saludos.  |
|
| Volver arriba |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Sab 31 Ene, 2009 9:31 am Asunto: |
|
|
Uups! vaya cabecita la mia.
Gracias escafandra  |
|
| Volver arriba |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Lun 02 Feb, 2009 9:28 am Asunto: |
|
|
Buenos días
Cómo podría chequear antes de exportar que exista la aplicación excel instalada?
Es decir, cuando le doy al botón de exportar antes de que exporte compruebe primero si existe la aplicación y si no, con un ShowMessage me muestre un mensaje de error?
Gracias otra vez. |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Lun 02 Feb, 2009 10:00 am Asunto: |
|
|
¿Y si lo exportas en otro formato, también compatible con Excel, como puede ser CSV? Es un fichero de texto plano en que los campos se separan conpunto y coma; lo puedes abrir con Excel o con el bloc de notas. _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Lun 02 Feb, 2009 10:58 am Asunto: |
|
|
Es una buena idea si no está instalado el excel pero me gustaría saber como podría hacer lo otro
Gracias |
|
| Volver arriba |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Lun 02 Feb, 2009 11:38 am Asunto: |
|
|
Ya sé cómo!
| Código: | try
{
//Ruta de la aplicación
//El fichero se guarda en la ubicación de la aplicación
//String sPath = ExtractFilePath(Application->ExeName);
//String
sPath = "C:\\";
//Nombre del archivo que se genera
//String
sFicheroGenerado = sPath + "salida1.xlsx";
//Crea una instancia de Excel
Excel = CreateOleObject("Excel.Application");
//Se hace visible (Opcional) ahora está a false para que no sea asi
Excel.OlePropertySet("Visible", false);
}
catch (Exception &exception) // no llegó a abrirse
{
Application->MessageBox("Esta aplicación necesita Excel 97 o superior",
"Aviso",MB_ICONSTOP);
return;
}
...
|
|
|
| Volver arriba |
|
 |
zankiu Lt Cmdr

Registrado: 23 Ene 2008Mensajes: 106
|
Publicado: Mar 03 Feb, 2009 9:15 am Asunto: |
|
|
Buenos días!
Ahora estoy probando con el SaveDialog para que antes de exportar el usuario pueda elegir donde guardar el archivo excel y no pasarlo por código. Por tanto:
| Código: |
this->SaveDialogExcel->Title = "Guardar como";
if (this->SaveDialogExcel->Execute())
{
sFicheroGenerado = this->SaveDialogExcel->FileName;
} |
con esto se me abre la ventana del "Guardar como", pero en en Edit que aparece de Tipo de Aplicación aparece en blanco, normalmente ahí aparecen los formatos en los que puedes guardar, cómo puedo hacer que eso también aparezca?
Espero haberme explicado bien. Saludos y gracias! |
|
| Volver arriba |
|
 |
|