我有一段代码,我想从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?
答案 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):
<强>代码强>:
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 :
答案 2 :(得分:0)
将sql更改为本
行"SELECT * FROM [" + defaultSheet + "] Except Select Top(1)"