使用C#访问Excel电子表格偶尔会返回某些单元格的空白值

11 c# oledb excel visual-studio-2008

我需要访问Excel电子表格并将电子表格中的数据插入SQL数据库.但是主键是混合的,大多数是数字的,有些是字母数字.

我遇到的问题是,当数字和字母数字键在同一个电子表格中时,字母数字单元格返回空白值,而所有其他单元格返回其数据没有问题.

我正在使用OleDb方法来访问Excel文件.使用Command字符串检索数据后,我将数据放入DataAdapter,然后填充DataSet.我遍历DataSet中第一个DataTable中的所有行(dr).

我使用dr ["..."]引用列.ToString()

如果我在Visual Studio 2008中调试项目并查看"扩展属性",将鼠标悬停在"dr"上我可以查看DataRow的值,但应该是字母数字的主键是{}.其他值用引号括起来,但空白值有大括号.

这是C#问题还是Excel问题?

有没有人曾经遇到过这个问题,或者可能找到了解决方法/修复方法?

提前致谢.

小智 26

解:

连接字符串:

Provider = Microsoft.Jet.OLEDB.4.0; Data Source = FilePath; Extended Properties ="Excel 8.0; HDR = Yes; IMEX = 1";

  1. HDR=Yes;表示第一行包含列名,而不是数据.HDR=No;表明相反.

  2. IMEX=1;告诉驱动程序始终将"混合"(数字,日期,字符串等)数据列读作文本.请注意,此选项可能会影响Excel工作表写入访问权限.

SQL语法SELECT * FROM [sheet1$].即excel工作表名称后跟a $并用[ ]括号括起来.

重要:

  • 查看位于注册表REG_DWORD"TypeGuessRows"的[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel].这是不让Excel仅使用前8行来猜测列数据类型的关键.将此值设置为0可扫描所有行.这可能会影响性能.

  • 如果Excel工作簿受密码保护,则无法打开它以进行数据访问,即使通过连接字符串提供正确的密码也是如此.如果您尝试,您收到以下错误消息:"无法解密文件."

  • 完善!帮我解决了同样的问题.转义双引号:扩展属性="Excel 8.0; HDR =是; IMEX = 1"变为扩展属性= \"Excel 8.0; HDR =是; IMEX = 1 \"并且所有问题都没问题! (2认同)

con*_*tor 1

{} 表示这是某种空对象,而不是字符串。当您将鼠标悬停在对象上时,您应该能够看到其类型。同样,当您使用 Quickwatch 查看 dr["..."] 时,您应该看到对象类型。您收到的对象是什么类型?