0

我尝试使用 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 工作表单元格中有一个绿色标记,它不读取。

在此处输入图像描述

它说它是空的。那么我如何阅读像这样的单元格?

谢谢你。

4

2 回答 2

1

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

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

于 2013-05-12T23:55:24.757 回答
0

OleDbCommand您的工作表中读取 Excel 工作表时,必须将其格式化为表格,第 1 行中的列标题和下方的数据(您的小屏幕截图似乎没有遵循这一点)。我不知道当工作表不是这样设置时你会得到什么样的阅读,但DBNull.Value听起来是一种合理的可能性。

至于绿色标记,该单元格可能已格式化为文本-从内存中我会说,如果您将鼠标悬停在该绿色标记上,Excel 会说“数值被格式化为文本”;如果您只有其中一个,您可以尝试 Ctrl+F1 修复格式(使其成为General)和 F2+Enter (输入单元格/确认输入)来修复值。当然,如果有 5,000 行数据,这不是您想要做的事情 - 您可以将(即不使用格式)复制并粘贴到新工作表中。

如果您的数据开始于$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);
        ...
    }
}

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

于 2013-05-13T01:02:30.227 回答