c# - OleDbConnection 仅当工作簿也在 Excel 中打开时才查找单元格值

标签 c# excel ssis oledb

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

每个工作表都有多个行部分,每个部分针对一个单独的产品。每个产品部分的前两行是季度行和年份行。这是屏幕截图:

enter image description here

我使用带有“Select *”命令的 OleDbDataReader 将每个工作表中的数据读取到数据表中。我的 SQL 数据库中有一个名为“YearQuarter”的列,其中存储年份行值和前一季度行值的串联,并在两个字符串之间使用连字符:

enter image description here

我的代码是这样的:

  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”,没有“- 第一季度”。附加到它。

这是因为四分之一单元格的值永远不会加载到数据读取器中,如数据集可视化工具所示:

enter image description here

另请注意,在数据集中,缺少“季度”单元格值的列也有其他缺少格式的数值(无逗号)。

如果我将文件另存为 .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/

相关文章:

c# - 如何使用 ASP.NET Core 下载 png 文件

c# - 在 C# 中设置 for 循环迭代次数的限制

excel - 如何在 Azure Data Lake、Azure SQL、Azure Data Lake Analytics 和 Azure SQL VM 之间做出决定?

sql-server - 指定平面文件数据类型与使用数据转换

deployment - 在网络外部署 SSIS (SQL Server 2012) 项目

继承属性类的 c# OO 建议

c# - 如何将电子邮件从 Outlook 拖放到 .NET 应用程序中?

Excel 崩溃,VBA 用户窗体无法保存

c# - 可以编译为 DLL 并可以在 Linux Web 服务器后端使用的现代语言?

SSIS 控制流 : Wait till all tasks complete