我正在尝试使用ODBC将Excel数据读取到C#,这是我的代码
string lstrFileName = "Sheet1";
//string strConnString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq="+path+ ";Extensions=asc,csv,tab,txt;Persist Security Info=False";
string strConnString = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Dbq=E:\\T1.xlsx;Extensions=xls/xlsx;Persist Security Info=False";
DataTable ds;
using (OdbcConnection oConn = new OdbcConnection(strConnString))
{
using (OdbcCommand oCmd = new OdbcCommand())
{
oCmd.Connection = oConn;
oCmd.CommandType = System.Data.CommandType.Text;
oCmd.CommandText = "select A from [" + lstrFileName + "$]";
OdbcDataAdapter oAdap = new OdbcDataAdapter();
oAdap.SelectCommand = oCmd;
ds = new DataTable();
oAdap.Fill(ds);
oAdap.Dispose();
// ds.Dispose();
}
}
我的样本数据 A 1个 2 3 机管局 BB 其数据表读取的1,2,3和两个空白行 我可以理解,因为第一行决定了它的数据类型,但是我怎么能转换成String并读取所有行。 任何建议。 我已经尝试过CStr,但没有帮助。
答案 0 :(得分:0)
有关此处类似问题的先前讨论,请检查以下内容:
DBNull in non-empty cell when reading Excel file through OleDB
作为一种解决方法,您也可以将列设置为“文本”格式(即在Excel中,选择列,右键单击“设置单元格格式...”),但是如果您要处理大量文件或如果您一定不要触摸该文件。
答案 1 :(得分:0)
这部分是推测,但是当将Excel文档作为数据库读取时,适配器必须对数据类型做出判断,并且通常做得很好。但是,由于Excel允许使用混合数据类型(而数据库不允许),因此有时会出错。
我的建议是不要使用数据适配器,而只需将每个字段作为对象类型读取。从那里,您可以轻松地将它们转换为字符串(StringBuilder,ToString()等),甚至可以TryParse
转换为您怀疑它们应为字段的字段,而无需考虑ODBC数据类型。
类似的事情将是一个样板:
using (OdbcCommand oCmd = new OdbcCommand())
{
oCmd.Connection = oConn;
oCmd.CommandType = System.Data.CommandType.Text;
oCmd.CommandText = "select A from [" + lstrFileName + "$]";
using (OdbcDataReader reader = oCmd.ExecuteReader())
{
object[] fields = new object[reader.FieldCount];
while (reader.Read())
{
reader.GetValues(fields);
// do something with fields
}
}
}