C# 使用第一个值作为列标题的数据集
我有一段代码,我想从Excel工作表的a列中提取值。现在,以下是我正在使用并遇到问题的代码:C# 使用第一个值作为列标题的数据集,c#,dataset,oledb,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_connSt
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();
}
}
…我最终得到的是除第一个值(第1行)之外的所有值。结果表明,行1被用作数据集表的列名(?)。但是,我不希望有任何列名或标题,我在连接字符串中特别声明了这一点
如何防止这种行为,以便将所有数据都放在列表中?或者,如果做不到这一点,我如何解决这个问题并从该数据集中提取行1?将sql更改为与此类似的内容
"SELECT * FROM [" + defaultSheet + "] Except Select Top(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;
}
}
检查以了解连接的扩展属性如何工作:
列标题:默认情况下,假定
Excel数据源包含可以用作字段的列标题
名字。如果情况并非如此,则必须关闭此设置,或者
第一行数据“消失”用作字段名。这是
通过将可选的HDR=设置添加到
连接字符串。默认值,不需要
如果指定,则HDR=是如果没有列标题,则需要
指定HDR=否;提供者将您的字段命名为F1、F2等。
下面是一个例子:
Excel文件数据(test.xlsx):
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);
}
代码:
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);
}
数据集可视化工具:
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);
}
我尝试在SQL命令中使用F1而不是*,但是当我尝试填充数据集时,我得到以下OLEDBEException:“没有为一个或多个必需参数提供值”。代码似乎仍然将第一行视为列标题,就像我将Excel文件的A1单元格更改为“F1”时一样,该命令工作正常。有什么建议吗?你能展示你正在使用的原始代码吗?有问题的代码似乎无效。“adapter.fill”和“datatable.Row”不应该编译。我对上述代码有一些问题。1) 为什么要创建
DataTable dt
,以及GetOleDbSchemaGuid
的用法是什么?2) 什么是ExcelSheets
?语法错误:1)适配器。填充(ds)
行未以结尾代码>和填充应为fill
。2) ds.Tables[0]。行
应为ds.Tables[0]。for循环条件中的行
。