我有一个程序(实际上是 SSIS 脚本任务,但我认为这并不重要),它创建与 Excel 工作簿的 OLE DB 连接,并读取每个工作表中的单元格值,将它们存储在 SQL Server 表中。
每个工作表都有多个行部分,每个部分针对一个单独的产品。每个产品部分的前两行是季度行和年份行。这是屏幕截图:
我使用带有“Select *”命令的 OleDbDataReader 将每个工作表中的数据读取到数据表中。我的 SQL 数据库中有一个名为“YearQuarter”的列,其中存储年份行值和前一季度行值的串联,并在两个字符串之间使用连字符:
我的代码是这样的:
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 列值,其中仅包含“年份”行值,而其他行则包含两行中的单元格值。例如,我有“2009 - 年末”,后跟“2010”,没有“- 第一季度”。附加到它。
这是因为四分之一单元格的值永远不会加载到数据读取器中,如数据集可视化工具所示:
另请注意,在数据集中,缺少“季度”单元格值的列也有其他缺少格式的数值(无逗号)。
如果我将文件另存为 .csv,所有单元格值都会保留。
但是,我注意到它并不一致。有时我会运行我的包,同一行现在将具有完整的值。因此,在上面的示例中,我会得到“2010 - 第一季度”。
我终于意识到,只有当我碰巧在程序运行的同时在 Excel 中打开工作簿时,它才能按预期工作!
为什么这会产生影响?难道是工作簿中有一个由 Excel 执行的宏或其他东西,但仅通过 OLE DB 连接访问工作簿时却没有?如果在Excel中执行的话,会影响OLE DB获取的数据吗?如果是这样的话,我该如何解决这个问题?电子表格已提供给我。所以我无法修改它们。
最佳答案
我认为您在 Excel 尝试应用的自动格式设置方面遇到了问题。通过 OLEDB 连接,我看不出如何打开工作表来解决您的问题(显然非常奇怪)。
尝试将 IMEX = 1 添加到连接选项中,将整个工作表视为文本,看看这是否是您的问题。取自 OLEDB connection does not read data from excel sheet还有来自外部站点的另一个好帖子:Tips for reading Excel spreadsheets using ADO.NET
此外,您正在从 Excel 工作表中提取数据并将其写入另一个 Excel 工作表...相同的工作簿?根据您的情况,我还有一些想法可以提供给您。
关于c# - OleDbConnection 仅当工作簿也在 Excel 中打开时才查找单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25815336/