从工作簿获取图纸名称

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

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; }