使用c#在单个xlsx中读取多个Excel工作表

时间:2014-10-17 10:06:45

标签: c# excel

使用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];
       }

4 个答案:

答案 0 :(得分:1)

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

简而言之,打开工作表没有。 3,打开excel工作簿后添加以下代码:

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

希望这能回答你的问题。

答案 1 :(得分:0)

我建议使用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)
   ...
}

答案 2 :(得分:0)

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

哦顺便说一句,办公室不需要安装使用......

答案 3 :(得分:0)

我在答案中使用了大部分代码[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;
        }
    }