¿Cómo agregar un programa escrito en lenguaje C a Excel?
Idea básica
El método de implementación básico es el mismo que el del artículo anterior "Leer y escribir archivos de tablas de Excel directamente a través de ODBC". Ambos usan ODBC para leer el archivo de tablas de Excel. un archivo de base de datos, escritura y otras operaciones, por lo que el nombre del encabezado de la fila escrito en el archivo de la tabla de Excel debe ser único (no tenga nombres duplicados, lo que equivale al valor de ID en la base de datos). Las operaciones en archivos de Excel en este artículo están encapsuladas en una clase CSpreadSheet, a través de la cual podemos implementar muy fácilmente varias operaciones de datos de tablas de Excel y podemos expandir esta clase para satisfacer nuestras propias necesidades.
Implementación específica
1. Incluir archivo de encabezado de operación de archivo Excel
#include "CSpreadSheet.h"
2. Crear nuevo Excel archivo y escribe datos predeterminados
// Crea un nuevo nombre de archivo Excel y ruta, TestSheet es el nombre de la tabla interna
CSpreadSheet SS("c:\\Test.xls", " TestSheet ");
CStringArray sampleArray, testRow;
SS.BeginTransaction();
// Agregar título
sampleArray.RemoveAll ( );
sampleArray.Add("Nombre");
sampleArray.Add("Edad");
SS.AddHeaders(sampleArray);
p>
//Agregar datos
CString strName[] = {"Xu Jingzhou","Xu Zhihui","Guo Hui","Niu Yingjun","Zhu Xiaopeng"};
CString strAge[] = {"27","23","28","27","26"};
for(int i = 0; i < sizeof(strName)/ sizeof(CString); i++)
{
sampleArray.RemoveAll();
sampleArray.Add(strName[ i]);
sampleArray.Add(strAge[i]);
SS.AddRow(sampleArray);
}
SS.Commit();
3. Leer datos de archivos de Excel
CSpreadSheet SS("c:\\Test.xls", "TestSheet");
CStringArray Filas, Columna;
p>//Borrar el cuadro de lista
m_AccessList.ResetContent();
for (int i = 1; i < = SS.GetTotalRows(); i++) p>
{
// Leer una fila
SS.ReadRow(Rows, i);
CString strContents = "";
for (int j = 1; j <= Rows.GetSize(); j++)
{
if( j == 1)
strContents = Rows.GetAt(j-1);
else
strContents = strContents + " --> " + Filas. GetAt(j-1);
}
m_AccessList.AddString(strContents);
}
4. Agregar, insertar, y reemplace los datos existentes de la tabla de Excel
p>//Inicialice los datos de la fila de prueba y realice demostraciones de operaciones para agregar, insertar y reemplazar datos
for (int k = 1; k <= 2 ; k++)
{
testRow.Add("Prueba");
}
SS.AddRow(testRow);
// Agregar al final
SS.AddRow(testRow, 2); // Insertar una nueva fila en la segunda fila
SS.AddRow(testRow, 6, true); // Reemplazar la cuarta fila original con contenido nuevo
SS.AddCell("Xu Jingzhou", 1,2 // Agregar (no existe) o reemplazar (existir) celdas en la segunda fila y Contenido de la primera columna
SS.Commit();
5. Consultar filas, columnas y celdas de datos de tablas de Excel existentes
void CExcelAccessDlg::OnQuery( )
{
CSpreadSheet SS("c:\\Test.xls", "TestSheet");
CStringArray Filas, Columna;
CString tempString = "";
UpdateData();
if(m_strRow == "" && m_strColumn == "") // La consulta está vacía
{
AfxMessageBox("¡El número de fila y el número de columna no pueden estar vacíos al mismo tiempo!");
return;
} p>
else if(m_strRow == "" && m_strColumn != "") // Consulta los datos de la columna especificada
{
int iColumn = atoi(m_strColumn);
int iCols = SS.GetTotalColumns();
if(iColumn > iCols) // Al realizar consultas más allá del rango de la tabla
{
CString str;
str.Format("El número total de columnas de la tabla es: %d, ", iCols);
AfxMessageBox(str + "El número de columnas de consulta es mayor que el número total de columnas en la tabla de Excel, ¡vuelva a ingresar!");
return;
}
// Leer una columna de datos y leerla fila por fila
if (!SS.ReadColumn(Column, iColumn))
{
AfxMessageBox(SS.GetLastError ());
return;
}
CString tmpStr;
for (int i = 0; i < Column.GetSize (); i++)
{
tmpStr.Format("Número de línea: %d, número de columna: %d, contenido: %s\n", i+1,iColumn ,Column.GetAt(i));
tempString += tmpStr;
}
AfxMessageBox(tempString);
}
else if(m_strRow != "" && m_strColumn == " ") // Consulta el número especificado de filas de datos
{
int iRow = atoi (m_strRow);
int iRows = SS.GetTotalRows();
p>if(i
Row > iRows) // Al realizar consultas más allá del rango de la tabla
{
CString str;
str.Format("El número total de filas en la tabla es: %d, ", iRows);
AfxMessageBox(str + "El número de filas de la consulta es mayor que el número total de filas en la tabla de Excel, ¡vuelva a ingresar!"); p>
return;
}
// Lee los datos de la fila especificada
if(!SS.ReadRow(Rows, iRow)) p>
{
AfxMessageBox (SS.GetLastError());
return;
}
CString tmpStr;
for (int i = 0; i < Rows.GetSize(); i++)
{
tmpStr.Format("Número de fila: %d, columna número: %d, contenido: %s\n", iRow , i+1, Rows.GetAt(i));
tempString += tmpStr;
}
AfxMessageBox(tempString);
}
else if(m_strRow != "" && m_strColumn != "") // Consulta los datos de la celda especificada
{
int iRow = atoi(m_strRow), iColumn = atoi(m_strColumn);
int iRows = SS.GetTotalRows(), iCols = SS.GetTotalColumns();
if(iColumn > iCols) // Al realizar consultas más allá del rango de la tabla
{
CString str;
str.Format( "El número total de columnas en la tabla es: %d, ", iCols) ;
AfxMessageBox(str + "El número de columnas de consulta es mayor que el número total de columnas en la tabla de Excel, por favor ¡vuelve a entrar!");
return;
} p>
else if(iRow > iRows)
{
CString str;
str.Format("El número total de filas en la tabla es: %d , ", iRows);
AfxMessageBox(str + "El número de filas de consulta es mayor que el número total de filas en la tabla de Excel, ¡vuelva a ingresar!");
return;
}
// Lea los datos de celda de fila y columna especificados
if(!SS.ReadCell(tempString, iColumn, iRow))
{
AfxMessageBox(SS.GetLastError( ));
return;
}
CString str;
str .Format("Número de fila: %d, número de columna : %d, contenido: %s", iRow,iColumn,tempString);
AfxMessageBox(str);
}
}
>
6. Guarde la conversión de Excel existente como un archivo de texto delimitado especificado
// Convierta el archivo de Excel original a texto delimitado por punto y coma y guárdelo como un archivo de texto con el mismo nombre
SS.Convert(";");
7. Eliminar tablas en Excel
SS.DeleteSheet() // Eliminar todas las tablas en el archivo de Excel
SS. DeleteSheet(" TestSheet "); // Eliminar la tabla TextSheet en Excel
8. Obtenga el número total de filas, el número total de columnas y la fila actual en Excel
int iCols = SS.GetTotalColumns(); // Número total de columnas
int iRows = SS.GetTotalRows(); // Número total de filas
int iCurRow = SS.GetCurrentRow(); // Número de fila actual
9. Obtener datos del encabezado de fila
CStringArray rowHeader;
SS.GetFieldNames(rowHeader);
CString tmpStr;
for (int i = 0; i < rowHeader.GetSize(); i++)
{
tmpStr. Format("Número de fila: %d, Número de columna: %d, contenido: %s\n", 1, i+1, rowHeader.GetAt(i));
tempString += tmpStr;
}
AfxMessageBox(tempString);
Finalmente, si desea conocer los detalles detallados de la implementación, puede verificar el código fuente cuidadosamente después de descargar el código fuente de muestra. código (se incluyen comentarios detallados).