Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-02-2010
Bare Bare is offline
Miembro
 
Registrado: feb 2010
Posts: 29
Poder: 0
Bare Va por buen camino
Question 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.
Responder Con Cita
  #2  
Antiguo 05-02-2010
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Te recomiendo el TmxExport de Max. Funcionan para Delphi y C++ Builder y funcionan de maravilla.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #3  
Antiguo 05-02-2010
Bare Bare is offline
Miembro
 
Registrado: feb 2010
Posts: 29
Poder: 0
Bare Va por buen camino
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...
Responder Con Cita
  #4  
Antiguo 06-02-2010
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Thumbs up

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
Responder Con Cita
  #5  
Antiguo 07-02-2010
Bare Bare is offline
Miembro
 
Registrado: feb 2010
Posts: 29
Poder: 0
Bare Va por buen camino
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..

Última edición por Neftali [Germán.Estévez] fecha: 08-02-2010 a las 09:57:55. Razón: Añadida la imagen
Responder Con Cita
  #6  
Antiguo 07-02-2010
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
Thumbs up

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. 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.

Última edición por _cero_ fecha: 07-02-2010 a las 05:48:26.
Responder Con Cita
  #7  
Antiguo 07-02-2010
Bare Bare is offline
Miembro
 
Registrado: feb 2010
Posts: 29
Poder: 0
Bare Va por buen camino
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..

Última edición por Neftali [Germán.Estévez] fecha: 08-02-2010 a las 09:58:35. Razón: Añadida la imagen del error.
Responder Con Cita
  #8  
Antiguo 08-02-2010
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
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, 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.
Responder Con Cita
  #9  
Antiguo 08-02-2010
Bare Bare is offline
Miembro
 
Registrado: feb 2010
Posts: 29
Poder: 0
Bare Va por buen camino
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..
Responder Con Cita
  #10  
Antiguo 08-02-2010
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
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.
Responder Con Cita
  #11  
Antiguo 08-02-2010
Bare Bare is offline
Miembro
 
Registrado: feb 2010
Posts: 29
Poder: 0
Bare Va por buen camino
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...; )
Responder Con Cita
  #12  
Antiguo 08-02-2010
_cero_ _cero_ is offline
Miembro
 
Registrado: abr 2007
Posts: 147
Poder: 18
_cero_ Va por buen camino
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
Responder Con Cita
  #13  
Antiguo 09-02-2010
Bare Bare is offline
Miembro
 
Registrado: feb 2010
Posts: 29
Poder: 0
Bare Va por buen camino
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..
Responder Con Cita
  #14  
Antiguo 01-07-2013
giulichajari giulichajari is offline
Miembro
 
Registrado: nov 2012
Posts: 306
Poder: 12
giulichajari Va por buen camino
Post Gracias

Cita:
Empezado por _cero_ Ver Mensaje
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. 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;

Última edición por giulichajari fecha: 01-07-2013 a las 19:08:48. Razón: Me olvide el codigo
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Exportar un DBGRID a excel con formato de fecha Luis Castro Varios 3 21-01-2011 21:54:38
exportar a excel rakka Varios 12 03-09-2008 00:53:31
Exportar un DBGRID a excel luisneria Varios 4 16-03-2007 23:34:43
exportar dbgrid a excel stuka Varios 7 21-07-2006 00:16:33
Exportar a Excel pruz Varios 8 01-07-2004 15:47:37


La franja horaria es GMT +2. Ahora son las 01:18:14.


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
Copyright 1996-2007 Club Delphi