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 de un ADOQuery a Excel (https://www.clubdelphi.com/foros/showthread.php?t=80298)

lmpadron 17-09-2012 19:56:17

exportar de un ADOQuery a Excel
 
Hola comunidad.

Necesito exportar de un ADOQuery a Excell realice una busqueda en google y encontre un tema en el archivo del foro donde previamente se trato

copie el codigo cambie lo que indica el ejemplo para que se adecue a mi codigo y me devuelve este error, la verdad no tengo idea de la razon. Si alguien lo ha echo antes y puede indicarme seria genial

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]={"ueb", "expediente", "fecha_pago", "orden", "convenio", "salario_total"};

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

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


Código:

---------------------------
Debugger Exception Notification
---------------------------
Project VB.exe raised exception class EOleSysError with message 'Tipo de variable incorrecto'. Process stopped. Use Step or Run to continue.
---------------------------
OK  Help 
---------------------------


Neftali [Germán.Estévez] 18-09-2012 11:08:16

Hay otra opción por si la quieres probar, que a mi me resulta más sencilla. Se trata de conectar a Excel usando un ADOTable. De esa forma lees de un sitio y vas insertando en el otro (lees en el ADOQuery e insertas en el ADOTable).

Aquí puedes ver cómo "montar" la conexión hacia el EXCEL.

lmpadron 18-09-2012 16:12:10

he probado y me conecto bien, pero todavia no logro completar el SQL del ADOQuery y con el ADOTable no me deja agregar en TableName si me puedes poner un ejemplo seria de gran ayuda !!!

Neftali [Germán.Estévez] 18-09-2012 19:30:03

El Tablename si no recuerdo mal, era el nombre de la hoja.
Si haces una búsqueda en los foros por "ADO* Excel" sin comillas salen bastantes temas al respecto.


Incluso en el FTP tienes varios ejemplos.

lmpadron 19-09-2012 20:37:04

no me deja me devuelve un error esta ves en el FROM parece de la sentencia SQL. Con el ADOQuery consulto bien pero no me deja guardar usando el DBNavigator me dice:
Código:

---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EOleException with message '[Microsoft][Controlador ODBC Excel] La operación debe usar una consulta actualizable'. Process stopped. Use Step or Run to continue.
---------------------------
OK  Help 
---------------------------


Neftali [Germán.Estévez] 20-09-2012 08:55:35

¿Puedes poner la consulta que utilizas para cargar datos y para guardarlos?
Piensa que si realizas una consulta que involucra varias tablas, luego no puedes editar esos datos directamente (consulta no actualizable) porque no sabría qué datos meter en cada tabla.

lmpadron 26-09-2012 16:04:56

Saludos
El problema de la consulta no actualizable es que me faltaba un parámetro en la conexión ADO, y parece ser un problema bastante global hehehehe. Asi quedo la cadena conexión:

Código:

Provider=MSDASQL.1;Persist Security Info=False;Mode=ReadWrite;Extended Properties="DBQ=C:\mi_archivo.xls;Driver={Microsoft Excel Driver (*.xls)};DriverId=790;MaxBufferSize=2048;PageTimeout=5;ReadOnly=0;"
para crear una hoja de Excel encontré este código que funciona perfectamente

Código:

/*
http://www.clubdelphi.com/foros/showthread.php?t=10866
*/
Variant Excel,Libro,Hoja,Celda;
  Excel = CreateOleObject("Excel.Application");
  Excel.OlePropertySet("Visible", true);
  Libro=Excel.OlePropertyGet("Workbooks");
  Libro.OleProcedure("Add");
  Hoja=Libro.OlePropertyGet("Item",1);
  Libro=Hoja.OlePropertyGet("Worksheets");
  Libro.OlePropertyGet("Item",1).OlePropertySet("Name","Pago periodo ");
  //Libro.OlePropertyGet("Item",2).OlePropertySet("Name","The red book-keeping ");
  for (int j=1;j<3;j++)
  {
        Hoja=Libro.OlePropertyGet("Item",j);
        for (int i=1;i<11;i++)
        {
          Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",i,1).OlePropertySet("Value",i);
          Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",i,2).OlePropertySet("Value",i*5);
          Celda=Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",i,2);
          Celda.OlePropertyGet("Font").OlePropertySet("Color",clBlue);
          Celda.OlePropertyGet("Font").OlePropertySet("Bold",true);
          Celda.OlePropertyGet("Interior").OlePropertySet("ColorIndex",9-3*j);
        }
        Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",11,1).OlePropertySet("Value","=SUM(A1:A10)");
        Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",11,2).OlePropertySet("Value","=SUM(B1:B10)");
  }
  Excel.OlePropertySet("DisplayAlerts",false); //suppress the warning dialog on closing the server
  Excel.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs","test.xls");
  Excel=Unassigned;

En el manejo del SQL desde el ADOQuery logre hacer consultas sin problemas

Código:

ADOQuery1->Close();
        ADOQuery1->SQL->Clear();
        ADOQuery1->SQL->Add("SELECT * FROM [reporte$];");
        ADOQuery1->Open();

Con el INSERT la cosa no fue muy difícil tampoco, solo agregar que si insertas los datos debes cerrar la conexión y después volver a abrirla de lo contrario te devuelve un error diciendo que no soporta multiples consultas o algo parecido.

Código:

ADOConnection1->Connected = true;

        ADOQuery1->Close();
        ADOQuery1->SQL->Clear();
        ADOQuery1->SQL->Add("INSERT INTO [reporte$] (nombre, apellidos, edad) VALUES ('"+Edit1->Text+"', '"+Edit2->Text+"', '"+Edit3->Text+"')");
        ADOQuery1->ExecSQL();

        ADOConnection1->Connected = false;
        ADOConnection1->Connected = true;

ADOQuery1->Close();
        ADOQuery1->SQL->Clear();
        ADOQuery1->SQL->Add("SELECT * FROM [reporte$];");
        ADOQuery1->Open();

Donde nombre, apellidos, edad son los encabezados de las columnas de la hoja de excel o sea los nombres de los campos y [reporte$] es el nombre de la hoja de calculo, los corchetes se pueden reemplazar por las comillas simples inclinadas (`) aunque microsoft prefiere los corchetes !!!

Espero que le sirva de ayuda a los próximos que lo intenten de todas formas pueden encontrar informacion de ayuda en el soporte que da microsoft y los ejemplos que pone para Visual Basic


Cómo usar ADO con datos de Excel desde Visual Basic o desde VBA
Cómo transferir datos desde un origen de datos ADO a Excel con ADO
Cómo transferir datos de un objeto Recordset de ADO a Excel con automatización
ExcelADO muestra cómo usar ADO para leer y escribir datos en libros de Excel

lmpadron 26-09-2012 16:27:28

Ahora me queda un solo problema en el código que escribí, en el proyecto nuevo que cree funciona de lo mejor, pero cuando lo agrego al que estoy desarrollando de hace ya algún tiempo me devuelve un error

Código:

Variant Excel,Libro,Hoja,Celda;
  Excel = CreateOleObject("Excel.Application");
  Excel.OlePropertySet("Visible", true);
  Libro=Excel.OlePropertyGet("Workbooks");
 ............
este código esta en el post anterior

En la linea en negrita el compilador me dice que estoy llamando a una función que no existe o que esta indefinida
Código:

[C++ Error] Unit7.cpp(665): E2268 Call to undefined function 'CreateOleObject'
Si agrego
Código:

#pragma link "Excel_2K_SRVR"
No sucede nada, sigue con el error. La verdad ni idea de que pueda ser, si alguien sabe que es lo que me esta sucediendo pues le agradecería que diera un norte

lmpadron 26-09-2012 18:51:49

Solucionado !!! solo necesitaba agregar la cabecera
Código:

#include <ComObj.hpp>
hehehehe

DanielMC 28-09-2012 20:12:08

Saludos Impadron
Puedes poner el codigo final de como te quedo tu codigo de exportar de un ADOQuery a Excel , serviria de mucha ayuda.
Saludos

lmpadron 28-09-2012 20:59:54

Cita:

Empezado por DanielMC (Mensaje 445727)
Saludos Impadron
Puedes poner el codigo final de como te quedo tu codigo de exportar de un ADOQuery a Excel , serviria de mucha ayuda.
Saludos


Fue el que puse donde explique que se podía hacer a través del OleCreateObject creando una hoja de excel y después anexándole los valores como hace el del ejemplo o a traves del ADO. De paso cree otro post con otra pregunta pero relacionado con el código del CreateObject() ya que tengo problemas al pasar los valores desde variables.

Saludos


La franja horaria es GMT +2. Ahora son las 20:58:20.

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