DataSet使用第一个值作为列标题

时间:2014-06-20 11:34:29

标签: c# dataset oledb

我有一段代码,我想从Excel工作表的A列中提取值。现在,这是我正在使用的代码,并遇到了问题:

m_connString = "Provider = Microsoft.ACE.OLEDB.12.0; Data Source = " + m_source + "; Extended properties = 'Excel 12.0; HDR = NO; IMEX = 1;';";

using (OleDbConnection conn = new OleDbConnection(m_connString)) 
{

  conn.Open();
  DataTable dt = conn.GetOleDbSchemaGuid(Tables, null);
  DataSet ds = new DataSet();
  string defaultSheet = ExcelSheets.Rows[0]["TABLE_NAME"].ToString();
  OleDbCommand comm = new OleDbCommand("SELECT * FROM [" + defaultSheet + "]", conn);
  OleDbDataAdapter adapter = new OleDbDataAdapter(comm);

  // Bug appears here
  adapter.fill(ds)


  // Fill a List<string> with the data found
  for (int r = 0; r < ds.Tables[0].Row.Count; r++)
  {
    m_list.Add(ds.Tables[0].Rows[r][0].ToString();
  }

}

如果我在A栏中有一个包含以下内容的Excel文件,那么会发生什么:

Row1
Row2
Row3
...
RowX

...我最终获得的是除第一个值(Row1)之外的所有值。事实证明,Row1被用作DataSet表的列名(?)。但是,我不希望有任何列名或标题,我在连接字符串中明确说明了这一点。

如何防止此行为,以便将所有数据放入列表中?或者,如果不这样做,我如何解决此问题并从该DataSet中提取Row1?

3 个答案:

答案 0 :(得分:1)

尝试这种方式:

    DataTable table = ds.Tables[0];

    foreach (DataColumn column in table.Columns)
    {
        string cName = table.Rows[0][column.ColumnName].ToString();
        if (!table.Columns.Contains(cName) && cName != "")
        {
            column.ColumnName = cName;
        }
    }

答案 1 :(得分:1)

选中Microsoft Reference以了解连接Extended Properties HDR=NO的工作原理:

  

列标题:默认情况下,假设您的第一行   Excel数据源包含可用作字段的列标题   名。如果不是这种情况,则必须关闭此设置,或   您的第一行数据“消失”以用作字段名称。这是   通过将可选的HDR =设置添加到扩展属性来完成   连接字符串。默认值,不需要   指定,是HDR =是。 如果您没有列标题,则需要   指定HDR =否;提供者为您的字段F1,F2等命名

以下是示例:

Excel文件数据(test.xlsx)

enter image description here

<强>代码

string m_source = "test.xlsx";    
string m_connString = @"Provider = Microsoft.ACE.OLEDB.12.0; 
                        Data Source = " + m_source + @"; 
                        Extended properties = 'Excel 12.0; 
                        HDR= NO; 
                        IMEX = 1;';";

using (OleDbConnection conn = new OleDbConnection(m_connString)) 
{
     conn.Open();         
     string squery = "SELECT f1, f2, f3 FROM [Sheet1$]"; 
     OleDbCommand comm = new OleDbCommand(squery, conn);
     OleDbDataAdapter adapter = new OleDbDataAdapter(comm);                
     DataSet ds = new DataSet();
     adapter.Fill(ds);        
}

DataSet Visualizer

enter image description here

答案 2 :(得分:0)

将sql更改为本

"SELECT * FROM [" + defaultSheet + "] Except  Select Top(1)"