Dev - C++ - crear fichero excel desde c++ builder
Hola a todos!!
Tengo hecha una aplicacion en c++ builder en la cual hago una consulta a una base de datos sql. Ahora lo que necesito es crear un fichero excel con los registros seleccionados. Alguien sabe como puedo hacer esto. Muchas gracias
Te dejo 2 ejemplos, espero que se sirvan para algo... aunque sea para ver
por donde atacar el problema... void __fastcall TForm1::Button1Click(TObject *Sender) { 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","The yellow book-keeping "); 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.OleProcedure("Quit"); Excel=Unassigned; } Otro ejemplo: Variant Ex,Wb,Sh1; Ex = Variant::CreateObject("Excel.Application"); Ex.PG("WorkBooks").PR("Open", "c:\\book1.xls"); Wb = Ex.PG("ActiveWorkBook"); Sh1 = Wb.PG("ActiveSheet"); Edit1->Text = Sh1.PG("Cells", 1, 1).PG("Value"); for(int i=1; i<=10; i++) for(int j=1; j<=10; j++) Sh1.PG("Cells", i, j).PS("Value", i*100 + j); Saludos desde Baires, JuanC
Hola JuanC:
Gracias por los ejemplos que me has pasado, espero que me sean de gran ayuda, aunque solo sea para saber por donde empezar. Saludos!!!
Gracias, creo que me sera de gran utilidad!!!
Hola comunidad:
Estuve viendo el ejemplo que aparece en el foro, y me quedan algunas dudas, cuales son las propiedades del EXCEL a las que yo puedo acceder mediante OLE, es decir a mi me gustaria poder crear una tabla, escribir en las celdas, cambiarle el color de relleno de las celdas, el color del borde, etc, Celda.OlePropertyGet("Interior").OlePropertySet("ColorIndex",9-3*j); Veo que con este ejemplo se puede cambiar el color del interior (me imagino que este sea el de relleno), pero no encuentro una bibliografía que me indique como hacer para cambiar las otras propiedades, además de como crear graficos de diferentes tipos, me imagino que todo esto sea posible, estoy trabajando con C++ Builder 6.0. Agradecería que si existe alguna bibliografia me la puedan facilitar. Estoy haciendo una applicacion para la gestion de un almacen y quiero que se puedan exportar los datos para el excel, y añadirles la parte de poder crear graficos, y que los datos se agrupen en tablas que se vean bien definidas. Gracias de antemano.
Gracias Juan Carlos, pero el segundo ejemplo no lo he podido ejecutar pues me causa una excepción. Disculpa si te pregunto algo quizá obvio, pero es mi primer acercamiento a 'automation'. Hice los reemplazos siguientes que creo que se requerían (PG, PS, PR). ¿Son correctos?
Saludos, Rolando Variant Ex,Wb,Sh1; Ex = Variant::CreateObject("Excel.Application"); Ex.OlePropertyGet("WorkBooks").OleProcedure("Open", "c:\book1.xls"); Wb = Ex.OlePropertyGet("ActiveWorkBook"); Sh1 = Wb.OlePropertyGet("ActiveSheet"); Edit1->Text = Sh1.OlePropertyGet("Cells", 1, 1).OlePropertyGet("Value"); for(int i=1; i<=10; i++) for(int j=1; j<=10; j++) Sh1.OlePropertyGet("Cells", i, j).OlePropertySet("Value", i*100 + j);
Para este ejemplo que cabeceras deberiamos añadir. Gracias
Good example. Thanks. nsm
Hola a todos: Me ha sido de mucha ayuda vuestro ejemplo, pero no funciona en XE2 y me he vuelto loco con OlePropertySet hasta dar con la SOLUCIÓN: Para que funcione con XE2 el segundo parámetro debe ir entre 'WideString( DATO ).Copy()'. Ejemplo: ANTES: Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",11,1).OlePropertySet("Value","=SUM(A1:A10)"); AHORA: Hoja.OlePropertyGet("Cells").OlePropertyGet("Item",11,1).OlePropertySet("Value",WideString("=SUM(A1:A10)").Copy()); Saludos, Rafa. programa de punto fijo y biseccion Excelente manual de c/c++ para los que se inician |