【问题标题】:how to get data from datatable using column name如何使用列名从数据表中获取数据
【发布时间】:2013-02-20 10:49:41
【问题描述】:

我有一种情况,我用 excel 文件加载数据集。所有工作表都作为数据表加载,适当的工作表名称作为数据表名称。我想要做的是使用列名获取这个数据表值。但我没有得到错误说

“列'Execute'不属于表Sheet1”。

在将 excel 加载到数据表时,我使用了 HDR=YES 和 IMEX=1。我也尝试过使用 HDR=NO。没有任何工作。

下面的代码是将excel写入数据表

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 中的数据可以完美地加载到每张工作表中。但是按列名获取它是问题所在。

请给点建议

【问题讨论】:

  • 我不确定这与它有多大关系,但我想知道您为什么使用SQLDataAdapter 而不是OleDbDataAdapter?我刚刚尝试了您的代码,但使用 OleDbDataAdapter 并且效果很好(即我得到了列名)。
  • 其实我的代码是用于oledb的,我创建的对象是这样的 OleDbDataAdapter SQLAdapter = new OleDbDataAdapter();我知道这很疯狂......但是谢谢,你给出了答案并且它起作用了。
  • 对,我明白了。我以为你可能在使用this。无论如何,很高兴我能提供帮助。

标签: c# excel


【解决方案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 无法在每列的顶部单元格中找到文本,则它会恢复为F1F2F3... 缺少标题名称的表示法。因此,例如,如果我的 Excel 工作表如下所示:

Header1           Header3
Value1   Value3   Value5
Value2   Value4   Value6

然后在DataTable 中,我将得到名为Header1F2Header3 的列。

您还需要确保您指定为标题行的行在其上方的任何行中都没有文本,否则您会得到一堆Fn-type 标题,然后是其他意想不到的文本作为标题名称。例如:

      This is my table
Header1  Header2  Header3
Value1   Value3   Value5
Value2   Value4   Value6

将在 DataTable 中以 This is my tableF2F3 等标题结束。

【讨论】:

    【解决方案2】:

    尝试通过wsheet.Name.Columns 枚举(在调试模式和/或控制台中)并提取表的列名 - 确保它包含您期望的列名(以及您期望的格式)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      相关资源
      最近更新 更多