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

时间:2015-07-13 11:21:52

标签: c# excel

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

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中提取工作表名称。

我尝试以下代码,但它不起作用

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

我应该如何修改它?

2 个答案:

答案 0 :(得分:1)

这对我来说似乎没用,但这应该有效:

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

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

这会假设您已经知道名称,这使得该方法无用。 OLEDB无法在Excel中获取工作表名称,因此如果您不知道名称,则需要使用其他方法。

要获得单引号工作表名称,请使用:

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

答案 1 :(得分:0)

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