SoloCodigo
Programación General => C/C++ => C++ Builder => Mensaje iniciado por: curro9 en Jueves 23 de Febrero de 2006, 16:28
-
Hola, necesito imoprtar un archivo Excel a Builder 6 para procesar los datos que tiene y generar informes, pero no se como hacerlo, a ver si alguien me echa una mano
saludos
-
Navegando en Internet encontré lo siguiente, la verdad nunca lo he probado y no se si funcione pero supongo que te servirá para darte una idea.
Tengo el siguiente codigo y solo me funciona con la primera fila, pruebalo y me dices si te funciona correctamente, o bien que error puedo tener.
el problema radica cuando habilito la linea
oSheet.Exec(PropertySet("Cells") << iFilaAx << iColumAx << String(100));
int Colum, Fila, MaxFila = 10, MaxColum = 3;
int iFilaAx, iColumAx;
int iMaxValueToWrite = 65535, iValueToWrite=0, iAuxiliar;
String sValor;
Variant oExcel, oSheet;
try
{
oExcel = GetActiveOleObject("Excel.Application");
}
catch(EOleSysError &E)
{
ShowMessage("Error: no se encontró EXCEL abierto.");
return;
}
// -------- Selecciona la hoja activa
oSheet = oExcel.Exec(PropertyGet("ActiveSheet"));
if (oSheet.IsEmpty())
{
ShowMessage("No hay ninguna hoja activa");
return;
}
//Escribir en la columna A, B y C hasta la fila 10
for(Fila = 1; Fila <= MaxFila; Fila++)
{
for(Colum = 1; Colum <= 3; Colum++)
{
iAuxiliar = iValueToWrite;
Memo1->Lines->Add("Fila " + String(Fila) + " (" + String(MaxFila) + ")" + " Colum " + String(Colum) + " (" + String(MaxColum) + ")");
iFilaAx = Fila;
iColumAx = Colum;
oSheet.Exec(PropertySet("Cells") << iFilaAx << iColumAx << String(100));
// iValueToWrite++;
// if(iValueToWrite == iMaxValueToWrite) iValueToWrite = 0;
}
}
oExcel = oSheet = Unassigned;
Suerte!...
-
gracias lo probaré
-
Hola, respecto al Excel yo he estado trabajando con esto hace unas semanas y he tenido muchos problemas, porque encontraba codigos que se suponía que funcionaban y luego daban fallos.
Yo personalmente he probado este código con builder6. Lo que necesita tener instalado es, obviamente, el excel y el soporte del lenguaje Macro VBA.
Te envío el proyecto y espero que no tengas ningún problema.
Saludos,
Paulados.
P.D: Los trozos que hay de código comentado con comentarios en alemán es del código del que cogí el ejemplo que me funcionó. Te lo dejo por si te sirve de algo.
P.D: No se si el código que ha mandado el otro chaval funciona, la verdad es que no lo he mirado ni probado, pero si te da problemas prueba con el que te envío.
-
Gracias tio, aunque he encontrado otra forma un poco mas aparatosa, asi que esta retocandola me servirá. Gracias
-
paulados, creo q el código que me has puesto sirve solo para exportar de builder a excel, pero para importar un archivo y procesar esos datos no, porque al abrir el archivo solo pone q se va a abrir un archivo excel, pero no lo abre, ni tampoco procesa datos de el.
saludos
-
Si que se leen datos del archivo excel. Al principio se abre el archivo excel.xls y se lee el valor de la celda [1,1]
int fila = 1, columna = 1;
Variant cell = hoja.OlePropertyGet("Cells", fila, columna);
String valor = cell.OlePropertyGet("Value");
ShowMessage(valor);
Y después se guarda un valor en su lugar y se guarda en el fichero value.xls:
AnsiString datOut = "1,1Cambiado";
cell.OlePropertySet("Value",datOut.c_str());
ShowMessage(valor);
//------- Cerramos Excel
excel.OlePropertyGet("Workbooks").OlePropertyGet( "Item" , 1).OleProcedure("SaveAs" , (path+"\\value.xls").c_str());
Siento no haber puesto más comentarios en el código, pero tenía prisa. Pero el ejemplo creo que es completo, breve y simple pero completo, se abre un archivo de excel, se lee un valor, se cambia y se guarda en otro fichero.
Si tienes algún problema me avisas y te respondo a las dudas que tengas y pueda resolver.
Ciao,
Paulados.
-
He estado revisando el codigo y sigo creyendo q no procesa el dato del excel original, veamos:
// Inicializa el excel
excel = CreateOleObject( "Excel.Application" );
// Lo hace visible
excel.OlePropertySet( "Visible" , false );
// Aquí lo unico que hace es crear un objeto excel, q se llama "excel" pero q no tiene ninguna relacion con el fichero excel que quiero procesar.
// Escoge archivo a abrir
AnsiString fileIn = path + "\\excel.xls";
ShowMessage("Abriendo: " + fileIn);
// Aqui lo unico que hace es declarar y definir una varibale fileIn que tiene el valor del path del fichero q quiero modificar, y tambien muestar un mesaje por pantalla con ese path pero el fichero no esta abierto, simplemenet he cogido su path y lo es mostrado.
// Crea una hoja nueva
excel.OlePropertyGet( "Workbooks" ).OleFunction("Add");
hoja = excel.OlePropertyGet("ActiveSheet");
// Fijate que hoja es una hoja de la variable excel, que recordemos que no tiene nada que cver con nuestro fichero y que por tanto está vacía.
//------- Leemos el contenido de una celda y lo mostramos
int fila = 1, columna = 1;
Variant cell = hoja.OlePropertyGet("Cells", fila, columna);
String valor = cell.OlePropertyGet("Value");
// Aqui lo que hace es obtener el valor de la celda 1,1 pero de la hoja de la variable excel pero esa hoja esta vacía, y por eso al ejecutar el ShowMEssage sale en blanco el valor.
AnsiString datOut = "1,1Cambiado"; // Esto es lo que escribe
cell.OlePropertySet("Value",datOut.c_str());
ShowMessage(valor);
// Vamos yo lo veo claro, el archivo original nunca se llega a abrir, y las modificaciones se hacen sobre una hoja vacía creada por nosotros...
tu no lo ves así?
-
Creo que curro9 lo explica perfectamente paso a paso...
Falta abrir el fichero:
// Abrimos el libro:
excel.OlePropertyGet("Workbooks").OleProcedure("Open", fileIn.c_str());
// referenciamos a la 1ª hoja
hoja = excel.OlePropertyGet("Worksheets").OlePropertyGet("Item", 1);
//------- Leemos el contenido de una celda y lo mostramos
int fila = 3, columna = 1;
cell = hoja.OlePropertyGet("Cells", fila, columna);
// ...
Saludos
-
Me sirvio mucho su discusion!
Estoy haciendo un programa en C++ Builder estadistico, y una de las forma de leer los datos es a partir de un archivo de excel.
Lo hace perfecto pero solo si le digo el numero de datos a leer (Solo si estan en la primera columna).
Hay alguna forma de que se pueda indicar mediante un boolean mientras recorra cada celda de la columna que ya no hay datos?
Lo hice con un while y verificando que la celda este en ' ' y se guinda.
Me ayudan??? :hola: