Red de conocimiento informático - Conocimiento del nombre de dominio - Cómo utilizar la programación en lenguaje C para implementar un bucle para leer datos en una columna específica de un archivo de Excel o leer datos en un archivo de Excel en

Cómo utilizar la programación en lenguaje C para implementar un bucle para leer datos en una columna específica de un archivo de Excel o leer datos en un archivo de Excel en

La mejor respuesta puede ser usar el lenguaje C para formatear la salida en un archivo de texto que pueda importarse mediante EXCEL y luego usar EXCEL para importarlo manualmente. Para conocer métodos de importación específicos, consulte "Tres métodos para importar datos de texto TXT a Excel": /s/2006-05-12/1042934532.shtml Este método es el más simple, pero tiene poca automatización y no se puede integrar en su programa C. Ir. Si usa C/C para crear EXCEL, puede usar ADO u ODBC. Si usa C/ODBC, puede consultar "Leer y escribir archivos de tablas de Excel directamente a través de ODBC": /document/viewdoc/?id. =421 y "Para tablas de Excel" Implementación de programación de operaciones de archivos": /document/viewdoc/?id=693 Si su programa está escrito en C, se recomienda utilizar el método anterior. Si utiliza C/ODBC, es un poco más problemático.

Escribí uno antes, que parece estar reescrito en C basado en una clase de C. Me llevó demasiado tiempo y no recuerdo de dónde viene. Ahora, para su referencia: Tres funciones de interfaz: OpenExcel(): un trabajo para crear. o abra archivos de Excel Tabla AppendExcel(): Agregar registros de datos a la hoja de trabajo CloseExcel(): Finalizar el procesamiento El ejemplo en main() es crear el archivo test.xls, que incluye dos hojas de trabajo. El programa fuente aquí está compilado con VC6.0. , y los resultados se obtienen Disponible en Excel 2003. #include lt;windows.hgt; #include lt;sqlext.hgt; #include lt;stdio.hgt; #ifdef _MSC_VER #pragma comment(lib,"odbc32.lib") #define SQLLEN SQLINTEGER #endif enum errtype { ERRORFREE, ERRACTION, HSTMT hstmt; ------------------------- ------------------------- ------------------------- - dbError vacío estático (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 () { if (hstmt! = SQL_NULL_HANDLE) { SQLFreeStmt (hstmt, SQL_UNBIND); SQLFreeHandle (SQL_HANDLE_STMT, hstmt); SQL_HANDLE_DBC, hdbc); } si (henv! = SQL_NULL_HANDLE) SQLFreeHandle(SQL_HANDLE_ENV, henv); ---------

-------------------------------------------------- -------------------------- dbErrorCleanup vacío estático (LPSTR lp, SQLSMALLINT handleType, SQLHENV henv, SQLHDBC hdbc, SQLHSTMT hstmt) {interruptor SQLHANDLE; (handleType) { case SQL_HANDLE_STMT: handle = hstmt; case SQL_HANDLE_DBC: handle = hdbc; default: handle = henv } if (handle != SQL_NULL_HANDLE) dbError(lp, handleType, handle); , hstmt } //------------------------------------------- --- -------------- static BOOL isFileOpen(const BYTE *fileName) { HANDLE hFile // Abra el archivo en modo no privado. Compruebe si el archivo EXCEL está actualmente en uso. ... ........ hFile = CreateFile(fileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); if (hFile == INVALID_HANDLE_VALUE) { if (GetLastError() == ERROR_SHARING_VIOLATION) devuelve TRUE; // Usar medio else return FALSE; // No está en uso o no existe dicho archivo (se puede crear ahora) } else { CloseHandle(hFile); BYTE *szFieldName[], BYTE *szFieldType[], int nColCount) { SQLRETURN retcode; BYTE szSql[512], *pszSql=szSql; BYTE szdatabase[256]; ( isFileOpen(szExcelName) ) devuelve SQLAllocHandle(ENV)",SQL_HANDLE_ENV,henv,hdbc,hstmt); devuelve SQLHANDLEENVERROR; } retcode = SQLSetEnvAttr(hen

v, sql_attr_odbc_version, (sqlpointer) sql_ov_odbc3, 0); si (RETCODE! = SQL_SUCCESS) {dberrorCleanup ("sqlsetenvattr ()", SQL_handle_env, HDBC, HST mt); RetCode = SQLALLOCHANDLE (SQL_HANDLE_DBC, Henv, AMP, AMP; hdbc); if (retcode!= SQL_SUCCESS) { dbErrorCleanup( "SQLAllocHandle(DBC)", SQL_HANDLE_ENV, henv, hdbc, hstmt return SQLHANDLEDBCERROR; ---- -------- sprintf(szdatabase, "DRIVER=Controlador de Microsoft Excel (*.xls); CREATE_DB=s; DBQ=s; READONLY=FALSE; EXCLUSIVE=Yes;", szExcelName, szExcelName) ; //fprintf (stderr, "DATABASE: s\n", szdatabase = SQLDriverConnect(hdbc, NULL, (SQLCHAR *)szdatabase, (corto) (strlen(szdatabase) 1), NULL, 0, NULL, SQL_DRIVER_NOPROMPT ); ); if (retcode!= SQL_SUCCESS) { dbErrorCleanup( "SQLAllocHandle(STMT)", SQL_HANDLE_DBC, henv, hdbc, hstmt); ----- ------- pszSql = szSql sprintf(szSql, "CREAR TABLA s (", szSheetName); for (i=0; ilt; nColCount; i) { if (i) *pszSql = ' ,'; pszSql = sprintf(pszSql, "s s", szFieldName[i], szFieldType[i]); } *pszSql = ')'; *pszSql = '\0'; s]\n" , szSql); retcode = SQLExecD

irect(hstmt, szSql, SQL_NTS); if (retcode!= SQL_SUCCESS) { SQLCHAR sqlState[15]; SQLGetDiagField(SQL_HANDLE_STMT, hstmt, 1, SQL_DIAG_SQLSTATE, sqlState, sizeof(sqlState), NULL); 42S01") != 0 ) { // Ya existe... dbErrorCleanup( " SQLExecDirect()", SQL_HANDLE_STMT, henv, hdbc, hstmt); return SQLCREATEERROR; } } return 0; } int AppendExcel(BYTE *szSheetName, BYTE * szFieldName[], int nColCount, BYTE *szData) { int i, rc; BYTE szSql[512], *s, *p, *d, *psz //Construir la declaración INSERT INTO-------- - ----------------------- psz = szSql sprintf(szSql, "INSERT INTO s (", szSheetName); for (i=0; ilt; nColCount ; 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) ; } return rc; } void CloseExcel() { //fprintf(stderr, "CleanUp: henv=08X; hdbc=08X, hstmt=08X.\n", henv, hdbc, hstmt()); - ------------------Datos de prueba ----------------------- ----- -------- static BYTE szExcelName[] = "Test.xls"; // Nombre del archivo de Excel static BYTE szSheetNameA[] = "List" // Nombre de la hoja de trabajo static BYTE *szFieldNameA[] = { "Nombre ", "Edad" }; // Nombre de campo static BYTE *szFieldTypeA[] = { "TEXTO", "NÚMERO" } // Tipo de campo static BYTE szSheetNameB[] = "Programa"; BYTE estático * szFieldNameB[] = { "Fecha"

, "Hora", "Programación" }; // Nombre de campo static BYTE *szFieldTypeB[] = { "TEXTO", "TEXTO", "TEXTO" } ​​// Tipo de campo int main() { if (OpenExcel( szExcelName, szSheetNameA, szFieldNameA, szFieldTypeA, 2)==0) { AppendExcel(szSheetNameA, szFieldNameA, 2, "'Zhang San', 33"); AppendExcel(szSheetNameA, szFieldNameA, 2, "'Li Si', 44") ; printf ("La hoja [s] en el archivo [s] de Excel se operó con éxito.\n", szExcelName, szSheetNameA); CloseExcel(); { AppendExcel(szSheetNameB, szFieldNameB, 3, "'3 de mayo', '18:00', 'cena'"); printf("La operación de las hojas de cálculo en los archivos de Excel fue exitosa.\n" , szExcelName, szSheetNameB); CloseExcel(); } printf("----- Finalizado."); - ---------------- Parámetros de llamada de función: int OpenExcel( //Éxito: devolver 0 BYTE *szExcelName, //Nombre del archivo de Excel BYTE *szSheetName, //Nombre de la hoja de trabajo BYTE *szFieldName [], //Nombre de campo (matriz) BYTE *szFieldType[], //Tipo de campo (matriz) int nColCount) //Número de campos int AppendExcel( //Éxito: devuelve 0 BYTE *szSheetName, //Nombre de la hoja de trabajo BYTE * szFieldName[], //Nombre de campo (matriz) int nColCount, //Número de campos BYTE *szData) //Si usa una interfaz gráfica para la cadena de datos, puede eliminar #include lt; stdio.hgt; fprintf Proporciona la información de salida necesaria para usar con el MessageBox o simplemente elimínala.