【问题标题】:Reading multiple Excel worksheets inside a single xlsx using c# [duplicate]使用c#在单个xlsx中读取多个Excel工作表[重复]
【发布时间】:2014-10-17 19:12:07
【问题描述】:

使用 c# 我可以成功打开一个 excel 文档并使用下面的代码读取第一个工作表中的数据。但是,我的 .xlsx 有多个工作表,所以我想遍历工作表集合,而不是硬编码每个工作表的名称。非常感谢。

       string path = @"C:\Extract\Extract.xlsx";
       string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

       string sql = "SELECT * FROM [Sheet1$]";

       using (OleDbDataAdapter adaptor = new OleDbDataAdapter(sql, connStr))
       {
           DataSet ds = new DataSet();
           adaptor.Fill(ds);

           DataTable dt = ds.Tables[0];
       }

【问题讨论】:

  • 我发现这段代码最有用。它有一个小错误,所以如果允许的话,我会在 Visual Studio 2013 中发布对我来说 100% 有效的东西。非常感谢

标签: c# excel


【解决方案1】:

我在此处的答案中使用了大部分代码 [Reading multiple excel sheets with different worksheet names,这是在对我的问题的评论中向我指出的。 它不会在 VS 2013 中为我编译,因为 DataRow 对象没有属性 Item(- r.Item(0).ToString 在该代码中)。所以我只是改变了一点。它还带回了一些名称中包含 Print_Area 无效的工作表,因此我将其排除在循环之外。这是对我有用的代码。

       string path = @"C:\Extract\Extract.xlsx";
       string connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";

       DataTable sheets = GetSchemaTable(connStr);

       string sql = string.Empty;
       DataSet ds = new DataSet();
       foreach (DataRow dr in sheets.Rows)
       {  //Print_Area
           string WorkSheetName = dr["TABLE_NAME"].ToString().Trim();

           if (!WorkSheetName.Contains("Print_Area"))
           {
               sql = "SELECT * FROM [" + WorkSheetName + "]";
               ds.Clear();
               OleDbDataAdapter data = new OleDbDataAdapter(sql, connStr);
               data.Fill(ds);

               DataTable dt1 = ds.Tables[0];

               foreach (DataRow dr1 in dt1.Rows)
               {
                   //parsing work
               }
           }
       }

    static DataTable GetSchemaTable(string connectionString)
    {
        using (OleDbConnection connection = new
                   OleDbConnection(connectionString))
        {
            connection.Open();
            DataTable schemaTable = connection.GetOleDbSchemaTable(
                OleDbSchemaGuid.Tables,
                new object[] { null, null, null, "TABLE" });
            return schemaTable;
        }
    }

【讨论】:

    【解决方案2】:

    我即将解决几乎相同的问题。 我发现http://www.dotnetperls.com/excel 的指南非常有用。

    简而言之,打开工作表编号。 3、打开excel工作簿后添加如下代码:

    var worksheet = workbook.Worksheets[3] as
            Microsoft.Office.Interop.Excel.Worksheet;
    

    希望这回答了你的问题。

    【讨论】:

      【解决方案3】:

      我建议使用 EPPlus(可通过 Nuget https://www.nuget.org/packages/EPPlus/ 获得),它是在 .Net 中处理 .xlsx 电子表格的绝佳包装工具。在其中,工作表是一个集合,因此您可以通过循环来做您想做的事情它们,无论名称或索引如何。

      例如,

      using (ExcelPackage package = new ExcelPackage(new FileInfo(sourceFilePath)))
      {
         foreach (var excelWorksheet in package.Workbook.Worksheets)
         ...
      }
      

      【讨论】:

        【解决方案4】:

        您应该尝试使用 Open XML 格式 SDK(Nuget:Link)。下面的链接解释了读取和写入 Excel 文档: http://www.codeproject.com/Articles/670141/Read-and-Write-Microsoft-Excel-with-Open-XML-SDK

        哦对了,office不一定要安装才能使用...

        【讨论】:

          猜你喜欢
          • 2023-01-26
          • 2020-08-19
          • 1970-01-01
          • 2011-05-09
          • 1970-01-01
          • 1970-01-01
          • 2018-11-18
          • 2014-11-30
          • 1970-01-01
          相关资源
          最近更新 更多