2008-10-16 8 views
3

Le code suivant renvoie les données à partir d'une feuille de calcul dans une grille parfaitementComment fichier excel interroger en C# en utilisant une requête détaillée

[ 
     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 feuille de calcul J'utilise a des colonnes nommées de A et ainsi de suite (juste norme noms de colonnes) et le nom de la feuille est Comptes.

J'ai un problème avec la requête ...

[OleDbCommand objCmd = new OleDbCommand("Select * From [Accounts$]", objConn);] 

Comment puis-je faire la chaîne de requête comme ça ...

"Select <columnA>,<columnB>,SUM<columnG> from [Accounts$] group by <columnA>,<columnB>" 

..so qu'il renvoie les résultats de cette requête

note: COLUMNA est une sur la feuille, ColumnB est B sur la feuille et columnG est G sur la feuille

Autres alternatives possibles:

  1. j'ai les données qu'Excel se propagent dans un objet DataTable, comment puis-je interroger l'objet DATATABLE
  2. j'ai lu sur un objet DataView qu'il peut prendre une table et retourner la table manipulé selon (<dataviewObject>.RowFilter = "where..."), mais je ne sais pas comment utiliser la requête que je veux.

Répondre

0

Dans votre exemple, SUM représente-t-il un nom de colonne potentiel ou une fonction SQL? Essayez-vous d'obtenir votre requête afin que vous puissiez référencer les colonnes A, B, C, D, etc ... de la feuille Excel comme ColumnA, ColumnB, ColumnC, ColumnD, etc ... dans votre requête SQL? Je suppose que je veux dire: voulez-vous écrire votre requête comme ceci: "Sélectionnez ColumnA, ColumnB, ColumnC de [Accounts $]", plutôt que ceci: "Select * from [Accounts $]"? Si tel est le cas, vous pouvez placer les en-têtes de colonne dans la première ligne de votre feuille Excel et les traiter comme les noms de colonne dans la chaîne de connexion. Pour ce faire, regardez votre ligne faire de la chaîne de connexion comme ceci:

excelConnectString = "Provider = Microsoft.Jet.OLEDB.4.0;" + "Data Source = " + excelFileName + ";" + "Extended Properties = Excel 8.0; HDR=Yes;"; 

Les différentes est la partie « HDR = Oui » dans la section Propriétés étendues. Une fois que vous êtes en mesure de référencer les colonnes dans votre feuille Excel en utilisant des noms de colonnes, vous devriez être en mesure d'utiliser la méthode Select de DataTable et la propriété RowFilter de DataView comme vous l'avez mentionné.

Est-ce que cela aide ou même répond à votre question?

2

Si vous ne voulez pas faire Group par classe alors DataTable a une méthode appelée Compute qui exécute quelques fonctions SQL.
Les fonctions suivantes sont prises en charge: COMPT, SOMME, 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 

D'autres alternatives que vous pouvez explorer sont les suivants:

  1. Vous peut utiliser l'article Microsoft KB HOW TO: Implement a DataSet GROUP BY Helper Class in Visual C# .NET

  2. Si vous utilisez .NET 3.5, vous pouvez utiliser LINQ ref: LINQ DataTable Query - Group Aggregation

4

Voulez-vous donc mething comme:

SELECT Sum([NameOfFieldAsPerHeader]) FROM [Accounts$] 

Ou

SELECT [ForExampleEmployeeID], Sum([NameOfFieldAsPerHeader]) FROM [Accounts$] 
GROUP BY [ForExampleEmployeeID] 

Ou

SELECT [ForExampleEmployeeID], Year([SomeDate]), Sum([NameOfFieldAsPerHeader]) 
FROM [Accounts$] 
GROUP BY [ForExampleEmployeeID], Year([SomeDate]) 

Ou

SELECT [ForExampleEmployeeID], Year([SomeDate]), Sum([NameOfFieldAsPerHeader]) 
FROM [Accounts$] 
WHERE Year([SomeDate])>2000 
GROUP BY [ForExampleEmployeeID], Year([SomeDate]) 
Questions connexes