leer - Cómo consultar el archivo de Excel en C#utilizando una consulta detallada
leer datos de un archivo excel c# (3)
El siguiente código devuelve los datos de una hoja de cálculo a una cuadrícula perfectamente
[
string excelConnectString = "Provider = Microsoft.Jet.OLEDB.4.0;" +
"Data Source = " + excelFileName + ";" +
"Extended Properties = Excel 8.0;";
OleDbConnection objConn = new OleDbConnection(excelConnectString);
OleDbCommand objCmd = new OleDbCommand("Select * From [Accounts$]", objConn);
OleDbDataAdapter objDatAdap = new OleDbDataAdapter();
objDatAdap.SelectCommand = objCmd;
DataSet ds = new DataSet();
objDatAdap.Fill(ds);
fpDataSet_Sheet1.DataSource = ds;//fill a grid with data
]
La hoja de cálculo que estoy usando tiene columnas nombradas de A, y así sucesivamente (solo nombres de columna estándar) y el nombre de la hoja es Cuentas.
Tengo un problema con la consulta ...
[OleDbCommand objCmd = new OleDbCommand("Select * From [Accounts$]", objConn);]
¿Cómo puedo hacer que la cadena de consulta sea así ...
"Select <columnA>,<columnB>,SUM<columnG> from [Accounts$] group by <columnA>,<columnB>"
..so que devuelve los resultados de esta consulta
Nota: la columna A es A en la hoja, la columna B es B en la hoja y la columna G es G en la hoja
Otras posibles alternativas:
- Tengo los datos de ese Excel distribuidos en un objeto DataTable, ¿cómo puedo consultar el objeto DataTAble?
- Leí acerca de un objeto DataView que puede tomar una tabla y devolver la tabla manipulada de acuerdo con (
<dataviewObject>.RowFilter = "where..."
), pero no sé cómo usar la consulta que quiero.
En su ejemplo, ¿SUM representa un nombre de columna potencial o un funcitón de SQL?
¿Está tratando de obtener su consulta para que pueda hacer referencia a la columna A, B, C, D, etc. ... desde la hoja de Excel como ColumnA, ColumnB, ColumnC, ColumnD, etc ... en su consulta SQL?
Supongo que quiero decir: ¿desea escribir su consulta como esta: "Seleccione Columna A, Columna B, Columna C de [Cuentas $]", en lugar de esto: "Seleccione * de [Cuentas $]"?
De ser así, puede colocar encabezados de columna en la primera fila de su hoja de Excel y tratarlos como los nombres de columna en la cadena de conexión. Para hacer esto, haz que tu línea de cadena de conexión se vea así:
excelConnectString = "Provider = Microsoft.Jet.OLEDB.4.0;" + "Data Source = " + excelFileName + ";" + "Extended Properties = Excel 8.0; HDR=Yes;";
La diferente es la porción "HDR = Yes" en la sección Propiedades Extendidas. Una vez que pueda hacer referencia a las columnas en su hoja de Excel utilizando nombres de columna, podrá usar el método Select de DataTable y la propiedad RowFilter de DataView como mencionó.
¿Esto ayuda o incluso aborda su pregunta?
¿Quieres algo como esto?
SELECT Sum([NameOfFieldAsPerHeader]) FROM [Accounts$]
O
SELECT [ForExampleEmployeeID], Sum([NameOfFieldAsPerHeader]) FROM [Accounts$]
GROUP BY [ForExampleEmployeeID]
O
SELECT [ForExampleEmployeeID], Year([SomeDate]), Sum([NameOfFieldAsPerHeader])
FROM [Accounts$]
GROUP BY [ForExampleEmployeeID], Year([SomeDate])
O
SELECT [ForExampleEmployeeID], Year([SomeDate]), Sum([NameOfFieldAsPerHeader])
FROM [Accounts$]
WHERE Year([SomeDate])>2000
GROUP BY [ForExampleEmployeeID], Year([SomeDate])
Si no desea agrupar, la clase DataTable tiene un método llamado Compute que ejecuta pocas funciones SQL.
Las siguientes funciones son compatibles: COUNT, SUM, MIN, MAX, AVG, STDEV, VAR .
string salary = empTable.Compute("SUM( Salary )", "").ToString();
string averageSalaryJan = empTable.Compute("AVG( Salary )", "Month = 1").ToString();
// Assuming you have month stored in Month column and Salary stored in Salary column
Otras alternativas que puedes explorar son:
Puede usar el artículo de Microsoft KB CÓMO: Implementar un grupo de DataSet GROUP BY Helper en Visual C # .NET
Si está usando .NET 3.5, puede usar Linq ref: LINQ DataTable Query - Group Aggregation