Cómo verter la salida de C en una hoja de cálculo de Excel
Este método es el más simple, pero tiene poca automatización y no puede integrarlo en su programa C.
Si usas C/C++ para crear EXCEL, puedes usar ADO u ODBC.
Si utiliza C++/ODBC, puede consultar "Leer y escribir archivos de formulario Excel directamente a través de ODBC": /document/viewdoc/?id=421
Y "Programación para "Implementación de operaciones de archivos de formulario de Excel":/document/viewdoc/?id=421
También hay "Implementación de programación de operaciones de archivos de formulario de Excel":/document/viewdoc/?Implementación de programación de operaciones de archivos de formulario de Excel ":/document/viewdoc /?/document/viewdoc/?id=693
Si su programa está escrito en C++, se recomienda utilizar el método anterior.
Si estás usando C/ODBC, entonces es un poco problemático. Escribí uno antes, creo que fue reescrito en C basado en una clase de C++. La referencia que haces ahora es:
Tres funciones de interfaz: p>
OpenExcel(): Crea o abre una hoja de cálculo de un archivo Excel
AppendExcel(): Añade registros de datos a la hoja de cálculo
CloseExcel(): Finaliza el proceso
El ejemplo en main() es crear el archivo test.xls, que tiene dos hojas de trabajo. Compilo el programa fuente con VC6.0 y el resultado se puede usar en Excel 2003.
#include
#include
#include
# ifdef _MSC_VER
#pragma comment(lib, "odbc32.lib")
#define SQLLEN SQLINTEGER
#endif
enum errtype { ERRORFREE, ERRACTION, /p>
SQLHENV henv
SQLHDBC hdbc
SQLHSTMT hstmt;
// ------- ------ -------------------------------------------- ------- ------------------------------------------- -------
static void dbError( LPSTR lp, SQLSMALLINT handleType, SQLHANDLE handle)
{
BYTE buf[250], sqlstate[ 15];
SQLGetDiagRec (handleType,handle, 1, sqlstate, NULL,buf.sizeof(buf),NULL);
fprintf(stderr,"%s: %s SQLSTATE =%s\n",lp, buf, sqlstate);
}
// ------------------- --------- ----------------------------------------- ------------ ----------------------------
dbCleanup vacío estático ()
{ p>
si (hstmt! = SQL_NULL_HANDLE) {
SQLFreeStmt(hstmt, SQL_UNBIND);
SQLFreeHandle(SQL_HANDLE_STMT,hstmt);
}
si (hdbc ! = SQL_NULL_HANDLE) {
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC,hdbc);
}
if (henv ! = SQL_NULL_HANDLE) SQLFreeHandle(SQL_HANDLE_ENV,henv);
}
// ----------------------- ------------------------------- ------------ - -------------------------
---------
static void dbErrorCleanup( LPSTR lp,SQLSMALLINT handleType,SQLHENV henv,SQLHDBC hdbc,SQLHSTMT hstmt)
{
mango SQLHANDLE;
switch (handleType) {
caso SQL_HANDLE_STMT:
mango = hstmt;
descanso;
caso SQL_HANDLE_DBC:
handle = hdbc;
break;
default:
handle = henv;
}
if (handle != SQL_NULL_HANDLE) dbError( lp, handleType, handle );
dbCleanup(henv, hdbc, hstmt );
}
//----------------------- --------- --- -------------
static BOOL isFileOpen(const BYTE *fileName)
{
HANDLE hFile
// Abre el archivo en modo de cobertura sin ****.
Compruebe si el archivo EXCEL se está utilizando actualmente...
hFile = CreateFile(fileName,GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
If (hFile == INVALID_HANDLE_VALUE) {
If (GetLastError() == ERROR_SHARING_VIOLATION) devuelve TRUE; // En uso
else devuelve FALSE // No está en uso o no hay archivo (ahora puede ser) creado)
} else {
BYTE *szFieldType[], int nColCount)
{
SQLRETURN retcode;
BYTE szSql[512], *pszSql=szSql;
BYTE szdatabase[256];
int rc, i;
henv = hdbc = hstmt = SQL_NULL_HANDLE;
if ( isFileOpen(szExcelName) ) return XLSBUSY;
// Preparar el entorno---------- ------- -
retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
if (retcode!= SQL_SUCCESS) {
dbErrorCleanup( "SQLAllocHandle(ENV)", SQL_HANDLE_ENV,henv,hdbc,hstmt);
Devuelve SQLHANDLEENVERROR;
}
retcode = SQLSetEnvAttr(henv ,SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3 ,0);
if (retcode != SQL_SUCCESS) {
dbErrorCleanup( "SQLSetEnvAttr()",SQL_HANDLE_ENV,henv,hdbc,hstmt
); return SQLSETENVERROR;
}
retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
if (retcode ! = SQL_SUCCESS) {
dbErrorCleanup("SQLAllocHandle(DBC)",SQL_HANDLE_ENV,henv,hdbc,hstmt);
return SQLHANDLEDBCERROR;
}
// Establecer una conexión a la base de datos-----------------
sprintf(szdatabase, "DRIVER=Microsoft Excel Controlador (*.xls);CREATE_DB=%s;DBQ=%s;READONLY=FALSE;EXCLUSIVE=Sí;",
szExcelName, szExcelName);
//fprintf( s
tderr, "DATABASE:%s\n", szdatabase);
retcode = SQLDriverConnect(hdbc, NULL, (SQLCHAR *)szdatabase, (corto) (strlen(szdatabase)+1), NULL, 0 , NULL, SQL_DRIVER_NOPROMPT);
if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO) {
dbErrorCleanup( "SQLDriverConnect()",SQL_HANDLE_DBC,henv,hdbc,hstmt);
return SQLCONNECTERROR;
}
retcode = SQLAllocHandle(SQL_HANDLE_STMT,hdbc, &hstmt);
if (retcode != SQL_SUCCESS) {
dbErrorCleanup( "SQLAllocHandle(STMT)",SQL_HANDLE_DBC,henv,hdbc,hstmt);
return SQLALLOCSTMTERROR;
}
//Construir la instrucción Ejecutar CREATE TABLE----------------------
pszSql = szSql + sprintf(szSql, "CREATE TABLE % s (", szSheetName);
for (i=0; i<nColCount;++i) {
if (i) *pszSql++ = ',';
pszSql += sprintf(pszSql, "%s %s", szFieldName[i], szFieldType[i]);
}
* pszSql++ = ')' ;
*pszSql = '\0';
//fprintf(stderr, "DECLARACIÓN:[%s]\n", szSql);
retcode = SQLExecDirect(hstmt, szSql, SQL_NTS);
if (retcode ! = SQL_SUCCESS) {
SQLCHAR sqlState[15];
SQLGetDiagField( SQL_HANDLE_STMT, hstmt,1,SQL_DIAG_SQLSTATE,sqlState,sizeof(sqlState ),NULL);
if ( lstrcmpiA(sqlState, "42S01") != 0 ){ // Ya existe...
dbErrorCleanup( " SQLExecDirect()",SQL_HANDLE_STMT,henv,hdbc,hstmt);
Devuelve SQLCREATEERROR;
}
}
Devuelve 0;
}
int AppendExcel (BYTE *szSheetName, BYTE *szFieldName[], int nColCount, BYTE *szDa
ta)
{
int i, rc;
BYTE szSql[512], *s, *p, *d, *psz;
//Construir la instrucción INSERT INTO--------------------------------
psz = szSql + sprintf(szSql, "INSERT INTO %s (", szSheetName);
for (i=0; i if ( i ) *psz++ = ','; psz += sprintf(psz, "%s", szFieldName[i]); } psz + = sprintf(psz, ") VALORES (%s)", szData); //fprintf(stderr, "DECLARACIÓN:%s\n", szSql); rc = (int) SQLExecDirect(hstmt, szSql.SQL_NTS); if (rc != SQL_SUCCESS) { dbError( " SQLExecDirect()",SQL_HANDLE_STMT,hstmt);< / p> } return rc; } void CloseExcel() { //fprintf ( stderr, "CleanUp: henv=%08X; hdbc=%08X, hstmt=%08X.\n", henv, hdbc, hstmt); dbCleanup(); }