C/Visual C - leer ficheros .xls con c++

 
Vista:

leer ficheros .xls con c++

Publicado por Pablo (5 intervenciones) el 11/07/2006 12:44:55
Hola a todos,

necesito hacer un programa en c++ para leer ficheros con formato .xls. Soy nuevo en c++, así que he buscado códigos hechos con google y he encontrado algo. Con la información que he encontrado he escrito mi código, pero al compilar (con visual c 2005 express edition), me sale un error diciendo que me falta sqltypes.h. He buscado el fichero con google y lo he copiado en la carpeta include de visual c++, pero haciendo eso y volviendo a compilar aparecen más de 150 errores (todos localizados en sqltypes.h. He probado con varios ficheros sqltypes.h y con todos pasa lo mismo). Pongo aquí el código que he desarrollado por si alguien me puede echar una mano.

// excel.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
//#include "ReadExcel.h"
//#include "ReadExcelDlg.h"
#include "odbcinst.h"

int _tmain(int argc, _TCHAR* argv[])
{
CDatabase database;
CString sSql;
CString sItem1, sItem2;
CString sDriver;
CString sDsn;
CString sFile = "prueba.xls";

sDriver = GetExcelDriver();
if(sDriver.IsEmpty()){
// Blast! We didn´t find that driver!
AfxMessageBox("No Excel ODBC driver found");
return;
}

// Create a pseudo DSN including the name of the Driver and the Excel file
// so we don´t have to have an explicit DSN installed in our ODBC admin
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);

TRY{
// Open the database using the former created pseudo DSN
database.Open(NULL,false,false,sDsn);

// Allocate the recordset
CRecordset recset(&database);

// Build the SQL string
// Remember to name a section of data in the Excel sheet using "Insert->Names" to be
// able to work with the data like you would with a table in a "real" database. There
// may be more than one table contained in a worksheet.
sSql = "SELECT field_1, field_2 "
"FROM demo_table "
"ORDER BY field_1";

// Execute that query (implicitly by opening the recordset)
recset.Open(CRecordset::forwardOnly,sSql,CRecordset::readOnly);

// Browse the result
while( !recset.IsEOF() )
{
// Read the result line
recset.GetFieldValue("field_1",sItem1);
recset.GetFieldValue("field_2",sItem2);

// Insert result into the list
m_ctrlList.AddString( sItem1 + " --> "+sItem2 );

// Skip to the next resultline
recset.MoveNext();
}

// Close the database
database.Close();

}
CATCH(CDBException, e)
{
// A database exception occured. Pop out the details...
AfxMessageBox("Database error: "+e->m_strError);
}
END_CATCH;

return 0;
}

No se si tengo que instalar algo que me falta...

Por favor, que alguien me ayude.
MUCHAS GRACIAS.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:leer ficheros .xls con c++

Publicado por fernando.gomez (1603 intervenciones) el 11/07/2006 18:35:11
Hola.

VC 2005 Express Edition no contiene el SDK de Windows, por lo que sólo podrás programar para .NET. En otras palabras, no te sirve ese compilador -por algo es gratuito.

No sé si funcione, pero puedes probar con bajar el SDK más reciente, instalarlo, y luego agregar los paths de los #includes y los libs, etc, en el VC XE.

Aunque lo mejor sería que te consiguieses el Visual C++ 8 completito. Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:leer ficheros .xls con c++

Publicado por Pablo (5 intervenciones) el 12/07/2006 14:28:38
Gracias.

He instalado VC++ 8 y he encontrado un codigo completo que hace lo mas o menos lo que quiero. Ahora, al compilarlo, me salen unos pocos de errores en ficheros de cabecera. Los pongo aqui por si alguien me puede ayudar:

------ Build started: Project: ReadExcel, Configuration: Debug Win32 ------
Compiling...
StdAfx.cpp
WINVER not defined. Defaulting to 0x0502 (Windows Server 2003)
c:\archivos de programa\microsoft visual studio 8\vc\atlmfc\include\afxtls_.h(66) : error C3861: 'ENSURE_ARG': identifier not found
c:\archivos de programa\microsoft visual studio 8\vc\include\afxwin.h(137) : error C2011: 'CSize' : 'class' type redefinition
c:\archivos de programa\microsoft visual studio 8\vc\atlmfc\include\atltypes.h(26) : see declaration of 'CSize'
c:\archivos de programa\microsoft visual studio 8\vc\include\afxwin.h(176) : error C2011: 'CPoint' : 'class' type redefinition
c:\archivos de programa\microsoft visual studio 8\vc\atlmfc\include\atltypes.h(66) : see declaration of 'CPoint'
c:\archivos de programa\microsoft visual studio 8\vc\include\afxwin.h(225) : error C2011: 'CRect' : 'class' type redefinition
c:\archivos de programa\microsoft visual studio 8\vc\atlmfc\include\atltypes.h(115) : see declaration of 'CRect'
c:\archivos de programa\microsoft visual studio 8\vc\include\afxwin.h(3195) : error C2079: 'CFrameWnd::m_rectBorder' uses undefined class 'CRect'
c:\archivos de programa\microsoft visual studio 8\vc\include\afxwin.h(3741) : error C2079: 'CScrollView::m_totalLog' uses undefined class 'CSize'
c:\archivos de programa\microsoft visual studio 8\vc\include\afxwin.h(3742) : error C2079: 'CScrollView::m_totalDev' uses undefined class 'CSize'
c:\archivos de programa\microsoft visual studio 8\vc\include\afxwin.h(3743) : error C2079: 'CScrollView::m_pageDev' uses undefined class 'CSize'
c:\archivos de programa\microsoft visual studio 8\vc\include\afxwin.h(3744) : error C2079: 'CScrollView::m_lineDev' uses undefined class 'CSize'
c:\archivos de programa\microsoft visual studio 8\vc\include\afxwin.h(3870) : error C2079: 'CWinThread::m_ptCursorLast' uses undefined class 'CPoint'
c:\archivos de programa\microsoft visual studio 8\vc\atlmfc\include\afxext.h(426) : error C2079: 'CToolBar::m_sizeImage' uses undefined class 'CSize'
c:\archivos de programa\microsoft visual studio 8\vc\atlmfc\include\afxext.h(427) : error C2079: 'CToolBar::m_sizeButton' uses undefined class 'CSize'
c:\archivos de programa\microsoft visual studio 8\vc\atlmfc\include\afxext.h(369) : error C3861: 'CRect': identifier not found
c:\archivos de programa\microsoft visual studio 8\vc\atlmfc\include\afxext.h(369) : error C2440: 'default argument' : cannot convert from 'CRect' to 'CRect'
Source or target has incomplete type
c:\archivos de programa\microsoft visual studio 8\vc\atlmfc\include\afxext.h(457) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Build log was saved at "file://c:\Documents and Settings\GTE\Mis documentos\COMED\C++\ReadExcel\Debug\BuildLog.htm"
ReadExcel - 15 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

El codigo lo he bajado de la siguiente pagina

http://www.codeguru.com/cpp/data/mfc_database/microsoftexcel/article.php/c1131/

(esta casi abajo de la pagina, en el link "download demo project").

No tengo ni idea de cual es la causa de los fallos. He probado en otro ordenador y crea el ejecutable sin problemas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:leer ficheros .xls con c++

Publicado por fernando.gomez (1603 intervenciones) el 12/07/2006 19:09:36
Se me ocurre que el código que bajaste esté escrito con MFC 6... puede que ahí haya problemas -tu compilador tiene MFC 8. ¿Dice el artículo para qué versión de MFC fué escrito?

Nomás para estar seguro, confírmame que no estás trabajando con Visual C++ Express Edtion.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:leer ficheros .xls con c++

Publicado por Pablo (5 intervenciones) el 12/07/2006 20:45:23
En el articulo no dice nada sobre MFC.

Estoy trabajando con VC++ 8 (no es la Express Edition).

GRACIAS!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:leer ficheros .xls con c++

Publicado por fernando.gomez (1603 intervenciones) el 12/07/2006 22:37:56
Bueno, es evidente que se trabaja con MFC, además está con la versión MFC 6.0. Después de leer el artículo me parece muy buena la solución que propone: tratar a Excel como si fuese una base de datos y acceder a ésta a través de ODBC.

El código fuente lo compilé con Visual C++ 6, y no tuve problema alguno. Hasta aquí, pensaba que el problema era de conversión hacia Visual C++ 8. Sin embargo, compilé con VC++ 8 y sólo tuve 3 warnings, concernientes a funciones depreciadas. Pero no tuve ni error de compilación ni de enlazado, y el programa corrió bien.

¿Modificaste en algo el VC++, o el código fuente? Es que pareciera que no reconoce MFC...

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:leer ficheros .xls con c++

Publicado por Pablo (5 intervenciones) el 13/07/2006 01:26:49
Gracias por responder con tanta rapidez.

Yo no he tocado nada del codigo ni tampoco de VC++. En el ordenador en el que suelo trabajar estaba instalado antes el VC Express Edition y tambien habia otro programa instalado para desarrollar en C++ (no recuerdo el nombre), aunque no creo que eso sea el origen de los problemas.

He probado a compilar el programa en otro ordenado r que tambien tiene VC++ 8 y no ha habido ningun problema, por eso estoy un poco extrañado por los errores que me aparecen en el primer ordenador.

Tengo cierta experiencia programando en C y nunca me han ocurrido problemas como este. En programacion orientada a objetos soy relativamente nuevo (un poco de practica en Java, pero no demasiada) y los problemas que me estan ocurriendo me dejan un poco desconcertado porque no se solucionarlos. Hay una gran parte del codigo fuente del programa ReadExcel que no entiendo lo que hace y no me gusta molestar a la gente para preguntarle cosas. ¿Crees que el libro Aprenda Visual C++ Ya de McGraw Hill me podria servir de ayuda? ¿Crees que el codigo del programa ReadExcel es excesivamente complejo?

Muchas gracias.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:leer ficheros .xls con c++

Publicado por fernando.gomez (1603 intervenciones) el 13/07/2006 18:30:58
Hola,

mira, yo pienso que en la primera máquina no tienes instalado el SDK. Con esto, supongo que MFC no estaría instalado, y pues el código que bajaste está escrito con MFC. Y el VC Express NO incluye el SDK para Windows, ni MFC, ni ATL; sólo C++/CLI para .NET.

El código que bajaste en escencia trata al excel como una base de datos, donde cada hoja es una tabla y lo que haya escrito en el primer renglón de cada columna es el nombre de la columna misma. Así, lo que hace es emplear el API de ODBC para comunicarse con Excel como si fuera base de datos. Después emplea SQL para "consultar" la hoja de Excel (es decir, la "tabla") y muestra los resultados. Hasta aquí se trabaja directamente con C.

PEEEEEEERO, y ahí está el asunto, el autor hace uso de DAO para obtener los datos (con las clases CDatabase y CRecordset).

La verdad es que el código no es complejo, pero sí debes tener conocimientos del API de ODBC, MFC y DAO.

Finalmente, cualquier libro que trate sobre Visual C++ te va a enseñar a emplear MFC. Si eso es lo que quieres, adelante. Pero ten en cuenta que tienes que aprender muchas APIs de Windows, en particular, la de ODBC; aunque no la uses con frecuencia, pero sí es necesario para este tipo de casos. Toda la documentación la encuentras en www.msdn.microsoft.com/visualc.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:leer ficheros .xls con c++

Publicado por Pablo (5 intervenciones) el 13/07/2006 21:43:51
Muchas gracias por las respuestas. Seguire al lio a ver si soy capaz de solucionar el problema.

Saludos.
Pablo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar