从Excel文件中读取数据:一列正在检索System.DBNull值而不是实际值

时间:2015-12-10 04:43:54

标签: c# excel visual-studio oledbdatareader

我正在构建一个Windows窗体应用程序,它读取Excel 2013文件(* .xlsx)。 此文件包含类似表的数据。 我在此处描述了用于从此文件读取数据的方法:

How to read data from excel file using c# [duplicate]

此方法使用OleDbConnection对象以及连接字符串,例如连接到数据库。 还使用OleDbCommand对象提供查询以检索数据。 并且还使用OleDbDataReader对象来读取检索到的数据。

问题当我读取此Excel文件的某些特定行时,OleDbDataReader对象在某些列中检索的值正确,但在一列中特别是检索到当该列中确实存在数据时System.DBNull值!

例:
- 我的Excel文件:

ClientId    ClientName    Total     InvoiceNumber
---------------------------------------------------
...
4           CLIENT_4      400.00    EV1234
5           CLIENT_5      500.00    EV56.78
6           CLIENT_6      600.00    EV9012
...

逐行调试我的应用程序,在“检查1”窗口中添加表达式,当我到达第4行“CLIENT_4”时:值正在正确检索:

对于列ClientId ==>数据为4.0,类型为object{double}
对于列ClientName ==>数据为CLIENT_4,类型为object{String}
对于列Total ==>数据为400.00,类型为object{decimal}
对于列InvoiceNumber ==>数据为EV1234,类型为object{double}

但当我到达第5行“CLIENT_5”时:InvoiceNumber列值正在检索错误

对于列ClientId ==>数据为5.0,类型为object{double}
对于列ClientName ==>数据为CLIENT_5,类型为object{String}
对于列Total ==>数据为500.00,类型为object{decimal}
对于列InvoiceNumber ==>数据为{}且类型为object{System.DBNull},当Excel文件中的列值确实为“EV56.78”时

每个具有相同模式的列(带有数字和小数周期的字符串)都会发生这种情况。

1.当值类似于此模式而不是像OleDbDataReader那样读取时,为什么String对象将此列值取为NULL当datareader检索数据类型时,十进制周期是否与数据类型混乱? 2.我的Excel文件中的单元格格式是否与数据类型混乱??? “InvoiceNumber”列中的整列和所有单元格都具有“常规”格式 3.我是否必须向OleDbDataReader对象添加一个额外的参数来解析列值或类似的东西???

我正在开发Visual Studio 2010 Ultimate Edition; 64位O.S。;从MS-Office 2013中读取Excel文件。
如果您需要额外的信息或代码片段,我将编辑问题以更多地解释自己(我认为这个信息已经足够了)。


如果您遇到与此问题类似的问题,请在任何帮助下获得建议!!!

2 个答案:

答案 0 :(得分:0)

在连接字符串中添加IMEX=1

即。

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcelFile.xlsx;
Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";

原因:

Excel正在推断前几行中每列的数据类型。当它遇到与推断数据类型不匹配的值时,它会将其视为空。

资源:

来自ConnectionStrings

  

如果要将列标题读入结果集(使用   即使有标题,HDR = NO)并且列数据是数字,   使用IMEX = 1以避免崩溃。

     

总是使用IMEX = 1是一种更安全的方法   检索混合数据列的数据。考虑一个方案   Excel文件可能正常工作,因为该文件的数据导致驱动程序   猜测一种数据类型,而另一个文件包含其他数据   驱动程序猜测另一种数据类型。这可能会导致您的应用   崩溃。

答案 1 :(得分:0)

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsx;
Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";

如果要将文件中的所有数据视为文本,请使用上面的一个,覆盖Excels列类型“常规”以猜测列中的数据类型。

总是使用IMEX=1是检索混合数据列数据的更安全的方法。考虑一个Excel文件可能正常工作的情况,因为文件的数据导致驱动程序猜测一种数据类型,而另一个包含其他数据的文件导致驱动程序猜测另一种数据类型。这可能会导致您的应用崩溃。 Excel connection strings