【问题标题】:How to query excel file in C# using a detailed query如何使用详细查询在 C# 中查询 excel 文件
【发布时间】:2008-10-16 07:32:58
【问题描述】:

以下代码完美地将电子表格中的数据返回到网格中

[
        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 命名的列等等(只是标准列名) 工作表名称是 Accounts。

我的查询有问题...

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

我怎样才能使查询字符串像这样......

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

..以便它返回此查询的结果

注意:A 列是工作表上的 A,B 列是工作表上的 B,G 列是工作表上的 G

其他可能的替代方案:

  1. 我将那个 excel 的数据分散到一个 DataTable 对象中,我如何查询 DataTAable 对象
  2. 我读到了一个 DataView 对象,它可以获取一个表并返回根据 (&lt;dataviewObject&gt;.RowFilter = "where...") 操作的表,但我不知道如何使用我想要的查询。

【问题讨论】:

    标签: c# excel


    【解决方案1】:

    你想要类似的东西:

     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】:

      如果您不想进行 Group by,那么 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 知识库文章HOW TO: Implement a DataSet GROUP BY Helper Class in Visual C# .NET

      2. 如果您使用的是 .NET 3.5,您可以使用 Linq 参考:LINQ DataTable Query - Group Aggregation

      【讨论】:

        【解决方案3】:

        在您的示例中,SUM 是否代表潜在的列名或 SQL 函数?

        您是否尝试获取查询,以便能够在 SQL 查询中将 Excel 工作表中的 Column A, B, C, D, etc... 引用为 ColumnA, ColumnB, ColumnC, ColumnD, etc...

        我想我的意思是:你想把你的query写成这样:Select ColumnA, ColumnB, ColumnC from [Accounts$],而不是这样:Select * from [Accounts$]

        如果是这样,您可以将列标题放在 Excel 工作表的第一行,并将其视为 connection string 中的列名。为此,请让您的 connection string 行如下所示:

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

        不同的是扩展属性部分中的HDR=Yes 部分。一旦您能够通过使用列名来引用 Excel 工作表中的列,您应该能够使用 DataTable 的 Select 方法和您提到的 DataView's RowFilter property

        这是否有助于甚至解决您的问题?

        【讨论】:

          猜你喜欢
          • 2010-11-12
          • 1970-01-01
          • 2019-05-19
          • 1970-01-01
          • 2022-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-02-13
          相关资源
          最近更新 更多