Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Exportar Contenido DBGrid a Excel? (https://www.clubdelphi.com/foros/showthread.php?t=66161)

Bare 04-02-2010 20:52:07

Exportar Contenido DBGrid a Excel?
 
Que tal amigos foreros, estoy desarrollando una aplicacion y ya tengo todo lo necesario (base de datos, consultas, etc).
Veran, debo generar un reporte trimestral de estadisticas, los datos los consulto y los muestro en un DBGrid, pero necesito exportar todo lo que se este mostrando en el grid a un documento de excel..

Anteriormente hice algo parecido, solo que importaba datos de algunos Edit Labels a excel usando el ExcelOLEObject, solo que ahora no tengo la menor idea de como exportar los datos del DBGrid a excel...??

Estoy trabajando con C++Builder 6.

Cualquier Ayuda o Sugerencia es Bienvenida.


De Antemano, Gracias...


Saludos.

Neftali [Germán.Estévez] 05-02-2010 11:14:34

Te recomiendo el TmxExport de Max. Funcionan para Delphi y C++ Builder y funcionan de maravilla.

Bare 05-02-2010 23:39:12

Que tal Neftali, ya lo baje pero no se como instalarlo al builder...
segui las instrucciones del leeme y descargue tambien el excelnative, pero aun no puedo...
intente hacerlo en la opcion de componentes del builder, pero me pide un archivo .cpp, y lo que vi tambien, que los archivos de paquetes son en dpk, y los de builder son bpk.

Me podrias explicar como puedo instalarle el componente??
y para usarse, hay alguna pagina para bajar ejemplos de codigos??




Saludos...

_cero_ 06-02-2010 21:49:34

mmm los traes de un DBGrid, en ese caso se puede entender que los datos que quieres exportar vienen de una base de datos no?
Qué te parece este código.
Código:

    //declaracion de variables
    Variant XL,v0,v1,v2,v3;

    //abres excel
    XL=Variant::CreateObject("excel.application");
    //la abres con la ventana visivle o si tiene false la ventana es invisible
    XL.OlePropertySet("Visible", true);
    //abre el archivo C:\\mi_archivo.xls, se puede "SaveAs" en lugar de "Open" para crear en lugar de abrir
    XL.OlePropertyGet("Workbooks").OleProcedure("Open", "C:\\mi_archivo.xls");
    //abres la hoja1 en este caso llamada reporte
    v0=XL.OlePropertyGet("Sheets", "Reporte");
    v1=v0.OlePropertyGet("Cells");

    //aqui pones el nombre de las columnas que vas usar de la BD
    String columnas[6]={"col1", "col2", "col3", "col4", "col5", "col6"};

    //qq es un query ya con una consulta hecha
    qq->First();
    for (int i = 1; i <= qq->RecordCount; i++) {
        for (int ii = 0; ii < 6; ii++) {
            //se va escribiendo dato por dato
            v1.OlePropertyGet("Cells", i+4, ii+1).OlePropertySet("Value",
                qq->FieldByName(columnas[ii])->AsString.t_str());
        }
        qq->Next();
    }

    XL.OlePropertySet("DisplayAlerts", false);
    XL.OleProcedure("Save");
    XL=Unassigned;

    MessageBoxA(Handle, "ya esta", "", MB_ICONINFORMATION


Bare 07-02-2010 04:12:03

Que tal Cero, asi es, los datos los muestro en un DBGrid provenientes de una base de datos..

Probe el codigo q me pusiste, pero me tira este error:



Le movi algunas cosas y salio peor, me marcaba un error ASSET...:S

aqui te pongo como puse el codigo:

Código:


    //declaracion de variables
    Variant XL,v0,v1,v2,v3;

    //abres excel
    XL=Variant::CreateObject("excel.application");
    //la abres con la ventana visivle o si tiene false la ventana es invisible
    XL.OlePropertySet("Visible", true);
    //abre el archivo C:\\mi_archivo.xls, se puede "SaveAs" en lugar de "Open" para crear en lugar de abrir
    XL.OlePropertyGet("Workbooks").OleProcedure("SaveAs", "C:\\mi_archivo.xls");
    //abres la hoja1 en este caso llamada reporte
    v0=XL.OlePropertyGet("Sheets", "Reporte");
    v1=v0.OlePropertyGet("Cells");

    //aqui pones el nombre de las columnas que vas usar de la BD
    String columnas[19]={"Total_casos_colera", "cepas_positivasvibrio", "Total_muestrasproc", "Deter_cloro", "Total_detercloro",  "ID_coberturadeteccion"," P_coberturadeteccion","ID_tratoportuno","P_tratoportuno","ID_eficiencialab","P_eficiencialab","ID_cloracionagua","P_cloracionagua","Año","Localidad","Trimestre"};

    //qq es un query ya con una consulta hecha
    ADODataSet2->First();
    for (int i = 1; i <= ADODataSet2->RecordCount; i++) {
        for (int ii = 0; ii < 19; ii++) {
            //se va escribiendo dato por dato
            v1.OlePropertyGet("Cells", i+4, ii+1).OlePropertySet("Value",
                ADODataSet2->FieldByName(columnas[ii])->AsString.c_str());
        } //fin for i
        ADODataSet2->Next();
    } //fin for ii

    XL.OlePropertySet("DisplayAlerts", false);
    XL.OleProcedure("Save");
    XL=Unassigned;

    MessageBoxA(Handle, "listo vale", "", MB_ICONINFORMATION);

Las columnas se pusieron asi por la pagina, en el programa estan todas seguidas...


Porque me marcara ese error..??


Saludos..

_cero_ 07-02-2010 05:35:48

Lo siento el código que te di era para abrir un xls ya creado con anterioridad, y meterle los datos (en mi opinión es mejor ya que puedes poner imágenes y darle un formato más agradable de una forma fácil).

Ahora para crear el xls desde cero solo se necesitarían unas pequeñas modificaciones que son:
Código:

    Variant XL,v0,v1; //quite variables que no se usan
    XL=Variant::CreateObject("excel.application");
    XL.OlePropertySet("Visible", true);
    XL.OlePropertyGet("Workbooks").OleProcedure("Add"); //se agrega un libro
    //Aqui e se cambia Reporte por Hoja1 que es el nombre por defecto de las hojas de excel
    v0=XL.OlePropertyGet("Sheets", "Hoja1");
    v1=v0.OlePropertyGet("Cells");

    //DATOS//
    //se escriben los datos como ya lo haces
    v1.OlePropertyGet("Cells", 2/*cordenada y*/, 3/*cordenada x*/).OlePropertySet("Value", "lolo");


    XL.OlePropertySet("DisplayAlerts", false);
    //aqui es donde se guarda
    XL.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", "C:\\test.xlsx"/*xlsxpor que uso office 2007*/);
    XL=Unassigned;

Pd. La parte de los datos se queda exactamente igual, solo se cambia la forma en la que se trabaja con “XL”.

Pd2. Ese error da cuando se intenta acceder a una función que no existe, debido a que el manejo de “OleProcedure” es complejo no me di cuenta de los dos fallos del anterior código:o. Nos vemos y cuenta como te fue.

Edito: en caso de que abras Excel de forma oculta, no se te olvide poner “XL.OleProcedure("Quit");” antes de “XL=Unassigned;” para cerrarlo, de lo contrario se quedara abierto y solo se serrara terminando el proceso en el administrador.

Bare 07-02-2010 23:41:29

Que tal Cero,le hice las modificaciones que me dijiste y ahora me sale este msj:




asi puse el codigo, no se si me haya equivocado en alguna parte...


Código:





        //declaracion de variables
    Variant XL,v0,v1,v2,v3;
  XL=Variant::CreateObject("excel.application");
    XL.OlePropertySet("Visible", true);
    XL.OlePropertyGet("Workbooks").OleProcedure("Add");
    v0=XL.OlePropertyGet("Sheets", "Hoja1");
    v1=v0.OlePropertyGet("Cells");

    //DATOS//
 
    //aqui pones el nombre de las columnas que vas usar de la BD
    String columnas[19]={"Total_casos_colera", "cepas_positivasvibrio", "Total_muestrasproc", "Deter_cloro", "Total_detercloro", "ID_coberturadeteccion"," P_coberturadeteccion","ID_tratoportuno","P_tratoportuno","ID_eficiencialab","P_eficiencialab","ID_cloracionagua","P_cloracionagua","Año","Localidad","Trimestre"};

    //qq es un query ya con una consulta hecha
    ADODataSet2->First();
    for (int i = 1; i <= ADODataSet2->RecordCount; i++) {
        for (int ii = 0; ii < 19; ii++) {
            //se va escribiendo dato por dato
            v1.OlePropertyGet("Cells", i+4, ii+1).OlePropertySet("Value",
                ADODataSet2->FieldByName(columnas[ii])->AsString.c_str());
        } //fin for i
        ADODataSet2->Next();
    } //fin for ii

      XL.OlePropertySet("DisplayAlerts", false);
    //aqui es donde se guarda
    XL.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", "C:\\test.xlsx"/*xlsxpor que uso office 2007*/);
      XL.OleProcedure("Quit");



    XL=Unassigned;

    MessageBoxA(Handle, "listo vale", "", MB_ICONINFORMATION);

Como ves el mensaje???, si le deshabilito las excepciones al builder es peor...


Saludos..

_cero_ 08-02-2010 00:21:34

Pues hice un copy/paste del código y me va bien, y por más que lo intenté, no pude reproducir el error que te sale. Todo me va perfecto:confused:, la creación e inserción de datos en el xls.
Mi recomendación es que primero agás unas pruebas básicas sin meter el “ADODataSet2” simplemente mandando una cadena a una celda, puedes hacerlo copiando el código tal cual está en mi penúltimo mensaje, ese código manda la cadena “lolo” en la celda “C2”, si ese cacho si funciona entonces querrá decir que el problema está en otra parte, por el momento es lo que se me ocurre:(.

Bare 08-02-2010 01:18:30

Que tal, sigue lo mismo...
y lo del codigo que me dijiste del value lolo, eso si funciona, ya lo habia hecho antes con valores de edit y labels...: D

el problema va a estar a la hora de pasar los datos del adodataset, aunque no veo por donde...porque sustitui el adodataset por el adotable y siguio con el mismo error..

no hay otra manera de generar el reporte a excel?, quiza obtener los datos directo de la tabla sin necesidad de usar el DBGrid? pasar lo obtenido de la consulta directo a excel? o asi es como se esta haciendo?



Saludos..

_cero_ 08-02-2010 02:23:37

Aquí no se está usando el DBGrid estamos pasando los datos directamente desde la base de datos, ahora ahí con intentos logre sacar un error que aparentemente no es el mismo pero eso quizás se deba a la versión del builder, y sale cuando no se convierte correctamente el tipo String a char* del campo, o sea cuanto escribes “.c_str()” yo uso “.t_str()” (podría ser eso).


Creo que hay otra forma de pasar los datos usando los componentes ADO y abriendo el libro de Excel como si fuera una mini base o algo así, desafortunadamente no sé nada de esta forma (solo la leí por ahí), así que no te podría ayudar en eso, la única forma que conozco y me funciona es la que te puse.

Bare 08-02-2010 03:07:06

ooooooo, eso pense...
sobre lo de la conversion a string, si le pongo “.t_str()”, me marca error, diciendo que .t_str() no es parte del ANSIstring... : S


Sabe si sera la version del builder, estoy usando la 6.


habra q investigar esa manera q me mencionas, al igual, si sabes de alguna pagina, me avisas por favor.....( ;
Sino funciona, creo que le voy a ligar unos edit y asi funciona a la segura, solo que el usuario tendria un poquito mas de trabajo, pero ni modo...


Saludos...y gracias por tu ayuda...; )

_cero_ 08-02-2010 18:03:23

Sin duda es la versión, a partir de la 2009 se opto por UnicodeString en lugar de AnsiString, y siendo t_str miembro de UnicodeString ps por eso. En cuanto a la otra forma ps seria googlearle o buscar en el foro que alguien ha de tener la solución, o también podrías buscar componentes (libres o de pago) aptos para tu proyecto. Nos vemos

Bare 09-02-2010 01:16:56

oooooo..

estuve googleando y encontre varios ejemplos, pero sobre lo que ya habia hecho al importar los datos de un edit o label a excel..
por este foro me encontre una manera de exportar pero a word, siendo asi mejor le ligo los edits y q se pasen a excel, aunque sea un poquito mas de trabajo..

bueno, me despido y de nueva cuenta te agradezo tu ayuda cero...: D

un saludo..

giulichajari 01-07-2013 19:03:36

Gracias
 
Cita:

Empezado por _cero_ (Mensaje 353252)
Lo siento el código que te di era para abrir un xls ya creado con anterioridad, y meterle los datos (en mi opinión es mejor ya que puedes poner imágenes y darle un formato más agradable de una forma fácil).

Ahora para crear el xls desde cero solo se necesitarían unas pequeñas modificaciones que son:
Código:

    Variant XL,v0,v1; //quite variables que no se usan
    XL=Variant::CreateObject("excel.application");
    XL.OlePropertySet("Visible", true);
    XL.OlePropertyGet("Workbooks").OleProcedure("Add"); //se agrega un libro
    //Aqui e se cambia Reporte por Hoja1 que es el nombre por defecto de las hojas de excel
    v0=XL.OlePropertyGet("Sheets", "Hoja1");
    v1=v0.OlePropertyGet("Cells");

    //DATOS//
    //se escriben los datos como ya lo haces
    v1.OlePropertyGet("Cells", 2/*cordenada y*/, 3/*cordenada x*/).OlePropertySet("Value", "lolo");


    XL.OlePropertySet("DisplayAlerts", false);
    //aqui es donde se guarda
    XL.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", "C:\\test.xlsx"/*xlsxpor que uso office 2007*/);
    XL=Unassigned;

Pd. La parte de los datos se queda exactamente igual, solo se cambia la forma en la que se trabaja con “XL”.

Pd2. Ese error da cuando se intenta acceder a una función que no existe, debido a que el manejo de “OleProcedure” es complejo no me di cuenta de los dos fallos del anterior código:o. Nos vemos y cuenta como te fue.

Edito: en caso de que abras Excel de forma oculta, no se te olvide poner “XL.OleProcedure("Quit");” antes de “XL=Unassigned;” para cerrarlo, de lo contrario se quedara abierto y solo se serrara terminando el proceso en el administrador.

Hola amigo utilice tu codigo y me abre excel, pero no coloca los nombre de las columnas
Mi codigo:
Código Delphi [-]
 Variant XL,v0,v1;
 XL=Variant::CreateObject("excel.application");
    XL.OlePropertySet("Visible", true);
    XL.OlePropertyGet("Workbooks").OleProcedure("Add"); //se agrega un libro
    //Aqui e se cambia Reporte por Hoja1 que es el nombre por defecto de las hojas de excel
    v0=XL.OlePropertyGet("Sheets", "Hoja1");
    v1=v0.OlePropertyGet("Cells");

    //DATOS//
    //se escriben los datos como ya lo haces
    String columnas[6]={"Fecha","Unidades","Detalle","PU","Costo","Marca"};
    v1.OlePropertyGet("Cells", 2, 3).OlePropertySet("Value", "lolo");
        Table1->First();
    for (int i = 1; i <= Table1->RecordCount; i++) {
        for (int ii = 0; ii < 6; ii++) {
            //se va escribiendo dato por dato
            v1.OlePropertyGet("Cells", i+1, ii+1).OlePropertySet("Value",
                Table1->FieldByName(columnas[ii])->AsString.c_str());
        } //fin for i
        Table1->Next();
    }

    XL.OlePropertySet("DisplayAlerts", false);
    //aqui es donde se guarda
    XL.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", "C:\\test.xlsx"/*xlsxpor que uso office 2007*/);
    XL=Unassigned;


La franja horaria es GMT +2. Ahora son las 01:27:11.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi