我正在构建一个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文件。
如果您需要额外的信息或代码片段,我将编辑问题以更多地解释自己(我认为这个信息已经足够了)。
如果您遇到与此问题类似的问题,请在任何帮助下获得建议!!!
答案 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正在推断前几行中每列的数据类型。当它遇到与推断数据类型不匹配的值时,它会将其视为空。
资源:
如果要将列标题读入结果集(使用 即使有标题,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