我有一种情况,我用excel文件加载数据集。所有工作表都作为数据表加载,并将相应的工作表名称作为数据表名称。我想要做的是使用列名获取此数据表值。但我没有得到错误说
“列'执行'不属于表Sheet1”。
虽然已加载到数据库,但我使用了HDR = YES和IMEX = 1。我也试过HDR = NO。什么都没有用。
下面的代码是将excel写入datatable
foreach (Microsoft.Office.Interop.Excel.Worksheet wsheet in workbook.Worksheets)
{
string sql1 = "SELECT * FROM [" + wsheet.Name + "$]";
OleDbCommand selectCMD1 = new OleDbCommand(sql1, SQLConn);
SQLAdapter.SelectCommand = selectCMD1;
SQLAdapter.Fill(dataset.Tables.Add(wsheet.Name));
}
来自excel的数据可以完美地加载到每张纸上。但是按列名称获取它是个问题。
请提出任何建议
答案 0 :(得分:1)
尝试通过wsheet.Name.Columns
枚举(在调试模式和/或控制台中)并提取表的列名 - 确保它包含您期望的列名(以及您期望的格式)< / p>
答案 1 :(得分:1)
对于它的价值,这是我使用的代码,它运行正常。我假设您正在使用Interop循环遍历工作表,以确保按顺序获取它们。
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filename +
"; Extended Properties=\"Excel 12.0 XML;HDR=YES\"";
DataSet dsValues = new DataSet();
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
conn.Open();
using (OleDbCommand cmd = conn.CreateCommand())
{
using (OleDbDataAdapter adapter = new OleDbDataAdapter())
{
foreach (Excel.Worksheet wsheet in workbook.Worksheets)
{
cmd.CommandText = "SELECT * FROM [" + wsheet.Name + "$]";
adapter.SelectCommand = cmd;
adapter.Fill(dsValues.Tables.Add(wsheet.Name));
}
}
}
}
如果OleDbDataAdapter
无法在每列的顶部单元格中找到文字,则会恢复为F1
,F2
,F3
...标题名称。因此,例如,如果我的Excel工作表如下所示:
Header1 Header3
Value1 Value3 Value5
Value2 Value4 Value6
然后在DataTable
我会收到名为Header1
,F2
,Header3
的列。
您还需要确保您指定为标题行的行在其上方的任何行中没有文本,否则您将获得一堆Fn
- 类型标题,然后是其他意外文本作为标题名称。例如:
This is my table
Header1 Header2 Header3
Value1 Value3 Value5
Value2 Value4 Value6
最终将使用This is my table
,F2
,F3
等标题在DataTable中结束。