在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工作表单元具有绿色标志不读。

enter image description here

它说它是空。 那么我怎么读这样的细胞?

谢谢。

根据我过去的经验,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); 
     ... 
    } 
} 

还要确保您想要读取的工作表在工作簿被保存&关闭时处于活动状态。或者使其成为工作簿中唯一的工作表,如果可能的话。