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 datos a excel desde embarcadero c++ (https://www.clubdelphi.com/foros/showthread.php?t=94940)

tekito 12-11-2020 11:06:25

Exportar datos a excel desde embarcadero c++
 
Hola, estoy intentando exportar datos de una consulta a una hoja excel, pero me da error, este es el código que utilizo:
Código PHP:

void __fastcall exportarAExcel(TADOQuery *q,String hoja,String fichero)
{
        
Variant _excel;
        
Variant _libro;
        
Variant _hoja;
        
Variant _celda;
        
Variant aux NULL;
        
String txt "";
        
int fila 1;//me almacena en qué fila del Excel estoy escribiendo
        
int columna 1;//me almacena en qué columna del Excel estoy escribiendo

        
try{
                
_excel CreateOleObject("Excel.Application");
                
//doy valor al libro a partir de la aplicación: su libro
                
_libro _excel.OlePropertyGet("Workbooks");
                
//le digo lo que tiene que hacer: añadir hojas
                
_libro.OleProcedure("Add");
                
//asigno a la hoja el primer item del libro
                
_hoja _libro.OlePropertyGet("Item",1);
                
//
                
_libro _hoja.OlePropertyGet("Worksheets");
                
//Libro=Hoja.OlePropertyGet("Worksheets");
                
_libro.OlePropertyGet("Item",1).OlePropertySet("Name",hoja);

                
//RECORRO LA CONSULTA INSERTANDO LAS CELDAS

                
_hoja _libro.OlePropertyGet("Item",1);
                
//primero relleno las cabeceras: LA PRIMERA FILA (letra en blanco negrita y fondo negro)
                
for(columna 1columna <= q->Fields->Count;columna++){
                        
txt q->Fields->Fields[columna-1]->FieldName;
                        
_hoja.OlePropertyGet("Cells").OlePropertyGet("Item",fila,columna).OlePropertySet("Value",txt );
                        
_hoja.OlePropertyGet("Cells").OlePropertyGet("Item",fila,columna).OlePropertyGet("Font").OlePropertySet("Color",clBlack);
                        
_hoja.OlePropertyGet("Cells").OlePropertyGet("Item",fila,columna).OlePropertyGet("Font").OlePropertySet("Bold",true);
                        
_hoja.OlePropertyGet("Cells").OlePropertyGet("Item",fila,columna).OlePropertyGet("Interior").OlePropertySet("ColorIndex",clBlack);
                }
                
fila 2;

                while( !
q->Eof ){
                        for(
columna 1columna <= q->Fields->Count;columna++){
                                
txt q->Fields->Fields[columna-1]->AsString;
                                
_hoja.OlePropertyGet("Cells").OlePropertyGet("Item",fila,columna).OlePropertySet("Value",txt );
                                
//vuelvo a empezar desde la primera columna: COLUMNA = 1
                        
}
                        
q->Next();//avanzo al siguiente registro: cambio de línea
                        
fila++;
                }

                
_excel.OlePropertySet("DisplayAlerts",false); //suppress the warning dialog on closing the server
                //_excel.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs",fichero);
                //la pongo en visible
                
_excel.OlePropertySet("Visible",true);
                
//_excel.OleProcedure("Quit");
                //_excel = Unassigned;
        
}
        catch(
Exception *e){
                
_excel.OlePropertySet("DisplayAlerts",false); //suppress the warning dialog on closing the server
                
_excel.OleProcedure("Quit");
                
_excel Unassigned;
        }


¿Me podría ayudar?
Gracias!!

Casimiro Notevi 12-11-2020 13:22:57

Hola, bienvenido a clubdelphi, por favor, revisa nuestra guía de estilo, gracias :)

tekito 12-11-2020 13:52:37

Hola, ya me la he leído. El código que adjunto es el que teníamos en el Borland 5 pero al migrar a Embarcadero no funciona. No he encontrado en el foro otra manera de hacerlo en c++. Me da error de tipo de variable en la fila 23.
Gracias!

ecfisa 12-11-2020 14:32:50

Hola tekito.

Cuando agregues código a tu mensaje usa las etiquetas:

[php]
...codigo...
[/php]

para una mejor visualización, gracias.

Saludos :)

tekito 12-11-2020 14:37:50

Ok! Gracias!

Casimiro Notevi 12-11-2020 16:20:40

Cita:

Empezado por tekito (Mensaje 539062)
Hola, ya me la he leído. El código que adjunto es el que teníamos en el Borland 5 pero al migrar a Embarcadero no funciona. No he encontrado en el foro otra manera de hacerlo en c++. Me da error de tipo de variable en la fila 23.
Gracias!

Y no podemos saber cuál es la línea 23 porque puede haber más código antes de lo que has publicado.

tekito 13-11-2020 10:15:25

Hola, la fila no ha cambiado, sigue siendo la 23, me da error en el tipo de variable.
Aquí:
_libro.OlePropertyGet("Item",1).OlePropertySet("Name",hoja);
Gracias.

Casimiro Notevi 13-11-2020 10:29:27

Cita:

Empezado por tekito (Mensaje 539079)
Hola, la fila no ha cambiado, sigue siendo la 23, me da error en el tipo de variable.
Aquí:
_libro.OlePropertyGet("Item",1).OlePropertySet("Name",hoja);
Gracias.


No sé qué tipo de variable espera, ni sabemos de qué tipo es tu variable "hoja", por ejemplo.


Y recuerda usar las etiquetas de código, como te han comentado antes, gracias.

tekito 13-11-2020 10:50:17

Tienes razón, hoja es de tipo texto:
Código PHP:

  Variant _libro;
_libro.OlePropertyGet("Item",1).OlePropertySet("Name","habitantes"); 


Casimiro Notevi 13-11-2020 11:05:32

Pues no sé, pero "propery set" parece que es para proporcionarle un valor a alguna propiedad, puede que espere un entero, por ejemplo número de página.
Mira esto.
Y "habitantes" no creo que sea una propiedad.

tekito 13-11-2020 11:38:07

Tienes razón espera un entero, si lo cambio por un entero funciona.
¿Pero la propiedad no sería "Name"? ¿No se haría así para ponerle nombre a la hoja de excel?
Código PHP:

_libro.OlePropertyGet("Item",1).OlePropertySet("Name","habitantes"); 

"habitantes" sería el nombre de la hoja de excel.
Muchas gracias!

tekito 18-11-2020 09:42:37

¿me echáis una mano, porfa, que estoy atascado?

Saludos.

Casimiro Notevi 18-11-2020 10:29:54

Mira este ejemplo.

tekito 18-11-2020 11:03:11

Hola, ya lo conseguí, pongo el código:
Código PHP:

void __fastcall exportarAExcel(TADOQuery *q,WideString hoja,WideString fichero)
{
        
Variant _excel;
        
Variant _libro;
        
Variant _hoja;
        
Variant _celda;
        
Variant excel_sheet;
        
Variant aux NULL;
        
WideString txt "";
        
int fila 1;//me almacena en qué fila del Excel estoy escribiendo
        
int columna 1;//me almacena en qué columna del Excel estoy escribiendo

        
try{
                
_excel CreateOleObject("Excel.Application");
                
//doy valor al libro a partir de la aplicación: su libro
                
_libro _excel.OlePropertyGet("Workbooks");
                
//le digo lo que tiene que hacer: añadir hojas
                
_libro.OleProcedure("Add");
                
//asigno a la hoja el primer item del libro
                
_hoja _libro.OlePropertyGet("Item",1);
                
//
                
_libro _hoja.OlePropertyGet("Worksheets");
                
//Libro=Hoja.OlePropertyGet("Worksheets");
                
_libro _libro.OlePropertyGet("Item"1);
                
_libro.OlePropertySet("Name",hoja);

                
//RECORRO LA CONSULTA INSERTANDO LAS CELDAS

                //////_hoja = _libro.OlePropertyGet("Item",1);
                //primero relleno las cabeceras: LA PRIMERA FILA (letra en blanco negrita y fondo negro)
                
for(columna 1columna <= q->Fields->Count;columna++){
                        
txt q->Fields->Fields[columna-1]->FieldName;
                        
_libro.OlePropertyGet("Cells").OlePropertyGet("Item",fila,columna).OlePropertySet("Value",txt);
                        
_libro.OlePropertyGet("Cells").OlePropertyGet("Item",fila,columna).OlePropertyGet("Font").OlePropertySet("Color",clBlack);
                        
_libro.OlePropertyGet("Cells").OlePropertyGet("Item",fila,columna).OlePropertyGet("Font").OlePropertySet("Bold",true);
                        
_libro.OlePropertyGet("Cells").OlePropertyGet("Item",fila,columna).OlePropertyGet("Interior").OlePropertySet("ColorIndex",clBlack);
                }
                
fila 2;

                while( !
q->Eof ){
                        for(
columna 1columna <= q->Fields->Count;columna++){
                                
txt q->Fields->Fields[columna-1]->AsString;
                                
_libro.OlePropertyGet("Cells").OlePropertyGet("Item",fila,columna).OlePropertySet("Value",txt);
                                
//vuelvo a empezar desde la primera columna: COLUMNA = 1
                        
}
                        
q->Next();//avanzo al siguiente registro: cambio de línea
                        
fila++;
                }

                
_excel.OlePropertySet("DisplayAlerts",false); //suppress the warning dialog on closing the server
                //_excel.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs",fichero);
                //la pongo en visible
                
_excel.OlePropertySet("Visible",true);
                
//_excel.OleProcedure("Quit");
                //_excel = Unassigned();
        
}
        catch(
Exception *e){
                
_excel.OlePropertySet("DisplayAlerts",false); //suppress the warning dialog on closing the server
                
_excel.OleProcedure("Quit");
                
_excel Unassigned();
        }


Gracias!

ecfisa 18-11-2020 15:22:01

Hola tekito, gracias por compartir la solución. ^\||/

Saludos :)


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

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