由于某种原因使用此代码时,它会跳过csv文件的第一行,即标题。我做错了什么?
string strFileName = path;
OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source = " + System.IO.Path.GetDirectoryName(strFileName) + "; Extended Properties = \"Text\"");
conn.Open();
OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + System.IO.Path.GetFileName(strFileName), conn);
DataSet ds = new DataSet("Temp");
adapter.Fill(ds);
DataTable tb = ds.Tables[0];
string data = null;
for (int j = 0; j <= tb.Rows.Count - 1; j++)
{
for (int k = 0; k <= tb.Columns.Count - 1; k++)
{
data = tb.Rows[j].ItemArray[k].ToString();
SaturnAddIn.getInstance().Application.ActiveWorkbook.ActiveSheet.Cells[j + 1, k + 1] = data;
}
}
答案 0 :(得分:1)
除非您使用:
,否则它将跳过第一行标题Extended Properties=Text;HDR=No;
但在这种情况下,它会将第一行视为数据行,这可能(在某个阶段)导致数据类型错误。
通常您会跳过第一行,并在Excel中手动创建标题。
答案 1 :(得分:0)
This comment注意到将FULL PATH传递给SELECT语句时的相同行为。由于文件目录在OleDbConnection
中提供,因此不需要再次提供。
有一些类似的注释at this answer (to a different question)表明路径也应该在连接中。
它还建议使用“真正的”CSV解析器。
答案 2 :(得分:0)
还发现当HDR = YES时,您可以使用table.Columns [0] .ColumnName并使用某种循环来获取第一列。