从工作簿中获取工作表名称

本文关键字:工作 获取 工作簿 | 更新日期: 2023-09-27 18:02:20

我有以下代码。我成功地从工作簿中的每个工作表中提取数据:

foreach (var sheetName in GetExcelSheetNames(connectionString))
{
    if (sheetName.Contains("_"))
    {
    }
    else
    {
         using (OleDbConnection con = new OleDbConnection(connectionString))
         {
             var dataTable = new DataTable();
             string query = string.Format("SELECT * FROM [{0}]", sheetName);
             con.Open();
             OleDbDataAdapter adapter = new OleDbDataAdapter(query, con);
             adapter.Fill(dataTable);
             ds.Tables.Add(dataTable);
         }
    }
}

我的目标是提取ds中的sheetname。

我尝试下面的代码,但它不工作

string query = string.Format("SELECT sheetName, * FROM [{0}]", sheetName);

从工作簿中获取工作表名称

这对我来说似乎是一件无用的事情,但这应该可以工作:

string.Format("SELECT '{0}' as sheetName, * FROM [{0}]", sheetName);

它只是传递工作表名称作为查询中的第一个字段。

将假定您已经知道名称,这使得该方法无用。OLEDB没有在Excel中获取工作表名称的方法,因此如果您不知道名称,则需要另一种方法。


对于单引号表单名,使用如下:

string.Format("SELECT '{1}' as sheetName, * FROM [{0}]", sheetName, sheetName.Replace("'", "'''"));

如何使用OfficeOpenXml?

 using (var pck = new OfficeOpenXml.ExcelPackage(file))
 {
     List<string> sheets = pck.Workbook.Worksheets.Select(x=>x.Name).ToList();
     var ws = pck.Workbook.Worksheets[sheet];
     DataTable tbl = new DataTable();
     foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column])
     {
          tbl.Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column));
     }
     var startRow = hasHeader ? 2 : 1;
     for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++)
     {
         var wsRow = ws.Cells[rowNum, 1, rowNum, tbl.Columns.Count];
         var row = tbl.NewRow();
         foreach (var cell in wsRow)
         {
             row[cell.Start.Column - 1] = cell.Text;
         }
         tbl.Rows.Add(row);
     }
     return tbl;
 }