在Excel中打开工作簿时,OleDbConnection仅查找单元格值

我有一个程序(实际上是SSIS脚本任务,但我不认为这很重要),它创build了与Excel工作簿的OLE DB连接,并读取每个工作表中的单元格值,并将它们存储在SQL Server表中。

每个工作表都有几个行的部分,每个部分是一个单独的产品。 每个产品部分的前两行是四分之一行和一年行。 这里是一个屏幕截图:

在这里输入图像说明

我用一个“select*”命令OleDbDataReader读取每个表中的数据到一个DataTable。 我在我的SQL数据库中有一个名为“YearQuarter”的列,在这里我存储了年份行值和上一个季度行值的连接,并在两个string之间使用了一个连字符:

在这里输入图像说明

我的代码是这样的:

OleDbConnection oleExcelConnection = new OleDbConnection( "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + strWkbkFilePath + ";" + "Mode=Read;" + "Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\""); oleExcelConnection.Open(); DataTable dtCurrSheet = new DataTable(); // Name of table is in strLoadTblNm. OleDbCommand oleExcelCommand; OleDbDataReader oleExcelReader; oleExcelCommand = excel_conn.CreateCommand(); oleExcelCommand.CommandText = "Select * From [" + strLoadTblNm + "]"; oleExcelCommand.CommandType = CommandType.Text; oleExcelReader = oleExcelCommand.ExecuteReader(); // Load worksheet into data table dtSheet.Load(oleExcelReader); oleExcelReader.Close(); 

看着输出的数据,我注意到我得到了不一致的结果。 一些行将有一个YearQuarter列值,其中只有Year行值,而另一些行将具有两行的单元格值。 例如,我会有“2009 – 年终”,接下来是“2010”,没有“ – 第一季度”。 附加到它。

这是因为数据集可视化工具显示的那个四分之一的单元格从不加载到数据读取器中:

在这里输入图像说明

还要注意,在数据集中,缺less季度单元格值的列也有其他数值缺less其格式(无逗号)。

如果我将文件保存为.csv,则所有单元格值都将保留。

但是,我注意到这是不一致的。 有时我会运行我的包,同一行现在会有完整的价值。 所以,在上面的例子中,我会得到“2010 – 第一季度”。

我终于意识到, 只有在程序运行的同时,我碰巧在Excel中打开了工作簿 ,它才能按预期工作

为什么这会有所作为? 难道是由Excel执行的工作簿中存在一个macros或某些东西,但是只有通过OLE DB连接才能访问工作簿时,是不是这样? 在Excel中执行的事实会影响OLE DB获得的数据吗? 如果是这样的话,我该如何解决这个问题? 电子表格提供给我。 所以我不能修改它们。

我想你遇到了Excel尝试应用自动格式化的问题。 通过OLEDB连接,我无法看到如何打开表格修复您的问题(显然非常奇怪)。

尝试将IMEX = 1添加到连接选项中,将整个工作表视为文本,看看是否是您的问题。 从OLEDB连接拉不会从Excel表格中读取数据另外一个从外部网站的好post: 使用ADO.NET阅读Excel电子表格的技巧

此外,你从一个Excel工作表拉动数据,并将其写入另一个Excel工作表…相同的工作簿? 根据你的情况,我有几个更多的想法。

这个错误原来是一个“特征”,它应该带有一个大的警告标志。

这篇文章 (谢谢@ vb4all)解释说:“ADO.NET扫描前8行数据,并据此猜测每列的数据types ,然后试图强制从该列到该数据types的所有数据, 返回NULL每当胁迫失败!“

换句话说,它将工作表视为关系表,其中给定列中的所有值都是相同types的。 当然,工作表数据不受这个限制。

此行为可以通过在连接string选项中设置IMEX = 1 ,然后修改这些registry设置来获得:

HKEY_LOCAL_MACHINE / SOFTWARE /微软/喷气/ 4.0 /发动机/ EXCEL / ImportMixedTypes

HKEY_LOCAL_MACHINE / SOFTWARE /微软/喷气/ 4.0 /发动机/ EXCEL /典型值

(注意:registry键因32位与64位而异,例如,对于64位,第一个将是HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ Jet \ 4.0 \ Engines \ Jet 4.0)。

我认为这是一个非常冒险的devise,因为数据传输错误很容易被忽视。