【发布时间】:2014-09-12 19:19:24
【问题描述】:
我有一个程序(实际上是 SSIS 脚本任务,但我认为这并不重要),它创建与 Excel 工作簿的 OLE DB 连接,并读取每个工作表中的单元格值,将它们存储在 SQL Server 表中。
每个工作表都有几个行部分,每个部分代表一个单独的产品。每个产品部分的前两行是四分之一行和一年行。这是一个屏幕截图:
我使用带有“Select *”命令的 OleDbDataReader 将每张工作表中的数据读入 DataTable。我的 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 列值,其中仅包含 Year 行值,而其他行将具有两行中的单元格值。例如,我有“2009 - Year End”,后跟“2010”,没有“ - 1st Qtr”。附加到它。
这是因为该四分之一单元格值从未加载到数据读取器中,如 Dataset Visualizer 所示:
另请注意,在数据集中,缺少 Quarter 单元格值的列也有其他数字值缺少格式(无逗号)。
如果我将文件另存为 .csv,则所有单元格值都会保留。
但是,我注意到它并不一致。有时我会运行我的包,而同一行现在将具有全部价值。所以,在上面的例子中,我会得到“2010 - 1st Qtr”。
我终于意识到它可以按预期工作只有在程序运行的同时我碰巧在 Excel 中打开了工作簿!
为什么这会有所作为?可能是 Excel 执行的工作簿中存在宏或其他内容,但仅通过 OLE DB 连接访问工作簿时没有?它在 Excel 中执行的事实会影响 OLE DB 获得的数据吗?如果是这种情况,我该如何解决?电子表格已提供给我。所以我不能修改它们。
【问题讨论】:
-
这不是解决问题的方法,但您是否考虑过导出为 CSV、TXT 或更具可读性的格式?
-
strLoadTblNm的值是多少? -
如上所述,如果我将文件保存为 .csv,则所有单元格值都会保留。但是,这不是该项目的选项。说明问题的工作簿在这里:onedrive.live.com/...。如果您下载它,您可以看到示例中的问题单元格 - F12 - 是 DT_R8 而不是 DT_WSTR,这很可能是一个问题。
-
@vba4all - strLoadTblNm 是 .xls 文件的完整文件路径。您可以在此处下载 .xls 文件的副本:onedrive.live.com/…