我有以下代码。我成功地从工作簿中的每个工作表中提取数据:
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);
我应该如何修改它?
答案 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;
}