在C#中读取excel表格单元格

时间:2013-05-12 23:43:16

标签: c# asp.net

我尝试使用c#读取.xls文件。

这是我的代码

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

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

谢谢。

2 个答案:

答案 0 :(得分:1)

根据我过去的经验,Excel可能会对每个列的数据类型做出最好的猜测,有时会出错。任何与假定数据类型不匹配的内容都将返回null。请看下面的内容,特别是关于IMEX设置。

http://www.connectionstrings.com/excel#microsoft-jet-ole-db-4-0

答案 1 :(得分: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);
        ...
    }
}

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