在C中读取excel表单元格#
问题描述:
我尝试使用c#读取.xls文件。在C中读取excel表单元格#
这是我的代码
OleDbCommand command = new OleDbCommand("Select [Id], [Name], [Email] from [sheet$]", connection);
OleDbDataAdapter objAdapter = new OleDbDataAdapter();
objAdapter .SelectCommand = command;
DataSet objDataset = new DataSet();
objAdapter .Fill(objDataset1);
DataView dv = objDataset .Tables[0].DefaultView;
for (int i = 0; i < dv.Count; i++)
{
if (dv[i][0] != DBNull.Value)
{
}
}
但在Excel工作表单元具有绿色标志不读。
它说它是空。 那么我怎么读这样的细胞?
谢谢。
答
根据我过去的经验,Excel可能会对每一列的数据类型做出最好的猜测,有时会出错。任何与推测的数据类型不匹配的内容都将返回为null。看下面的内容,尤其是关于IMEX设置。
http://www.connectionstrings.com/excel#microsoft-jet-ole-db-4-0
答
当从OleDbCommand
工作表中读取Excel表格必须格式化为一个表,与行1列标题和数据下(你的小屏幕截图似乎并没有遵循这一点)。我不知道在没有像这样设置工作表时你会得到什么样的阅读,但DBNull.Value
听起来像是一个合理的可能性。
至于绿色标记,单元格可能是格式化为文本 - 从内存我会说如果你鼠标悬停在该绿色标记Excel说“数值被格式化为文本”;如果你只有几个你可以尝试Ctrl + F1来修复格式(使其通用)和F2 + Enter(输入单元格/确认条目)来修复值。当然,如果有5000行数据,这不是你想要做的事情 - 你可以将值(即不是格式)复制并粘贴到新的工作表中。
如果你的数据在$A$1
开始,还是你得到的是DBNull.Value
,那么我会尝试这样的事情,假设所有你从OLE驾驶员得到的是object
:
for (int i = 0; i < dv.Count; i++)
{
var value = dv[i][0].ToString();
if (!string.IsNullOrEmpty(value))
{
var intValue = Convert.ToInt32(value);
...
}
}
还要确保您想要读取的工作表在工作簿被保存&关闭时处于活动状态。或者使其成为工作簿中唯一的工作表,如果可能的话。