从工作簿中获取工作表名称
本文关键字:工作 获取 工作簿 | 更新日期: 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;
}