Как запросить файл Excel в C #, используя подробный запрос - PullRequest
4 голосов
/ 16 октября 2008

Следующий код прекрасно возвращает данные из электронной таблицы в сетку

[
        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
]

Используемая мной электронная таблица имеет столбцы с именами от A и т. Д. (Только стандартные имена столбцов) и имя листа - Счета.

У меня проблема с запросом ...

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

Как сделать строку запроса подобной этой ...

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

.. чтобы он возвращал результаты этого запроса

Примечание: столбец A - это лист на листе, столбец B - это лист на листе, а столбец G - это лист на листе

Другие возможные альтернативы:

  1. У меня есть данные этого Excel, распространенные в объект DataTable, как я могу запросить объект DataTAble
  2. Я читал об объекте DataView, который может взять таблицу и вернуть таблицу, обработанную в соответствии с (<dataviewObject>.RowFilter = "where..."), но я не знаю, как использовать запрос, который я хочу.

Ответы [ 3 ]

4 голосов
/ 07 января 2009

Хотите что-то вроде:

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

Или

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

Или

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

Или

 SELECT [ForExampleEmployeeID], Year([SomeDate]), Sum([NameOfFieldAsPerHeader]) 
 FROM [Accounts$]
 WHERE Year([SomeDate])>2000
 GROUP BY [ForExampleEmployeeID], Year([SomeDate])
2 голосов
/ 07 января 2009

Если вы не хотите выполнять Группирование по , тогда в классе DataTable есть метод с именем Compute , который выполняет несколько функций SQL.
Поддерживаются следующие функции: 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

Другие альтернативы, которые вы можете изучить:

  1. Вы можете использовать статью Microsoft KB КАК: реализовать вспомогательный класс DataSet GROUP BY в Visual C # .NET

  2. Если вы используете .NET 3.5, вы можете использовать Linq ref: LINQ DataTable Query - объединение групп

0 голосов
/ 11 ноября 2008

В вашем примере SUM представляет потенциальное имя столбца или функцию SQL?

Вы пытаетесь получить свой запрос, чтобы иметь возможность ссылаться на столбцы A, B, C, D и т. Д. ... из листа Excel как ColumnA, ColumnB, ColumnC, ColumnD и т. Д. ... в своем SQL-запрос?

Полагаю, я имею в виду: вы хотите написать свой запрос следующим образом: «Выберите ColumnA, ColumnB, ColumnC из [Accounts $]» вместо этого: «Выбрать * из [Accounts $]»?

Если это так, вы можете поместить заголовки столбцов в первую строку таблицы Excel и обрабатывать их как имена столбцов в строке подключения. Для этого сделайте так, чтобы строка вашей строки подключения выглядела так:

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

Отличается часть "HDR = Да" в разделе расширенных свойств. Как только вы сможете ссылаться на столбцы на листе Excel, используя имена столбцов, вы сможете использовать метод Select в DataTable и свойство RowFilter в DataView, как вы упомянули.

Помогает ли это или даже отвечает на ваш вопрос?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...