不使用Interop.Excel通过C#修改Excel工作表

时间:2017-05-23 03:22:28

标签: c# excel ssis

我知道像这样的问题在堆栈中存在并且有第三部分库可以解决这个问题,但目前还没有一个能解决我的问题。所以这个问题。

我有一个Excel工作簿(.xlsx),其中包含由另一个系统生成的多个工作表。我必须通过SSIS读取数据并将其转储到SQL DB。

现在的问题是虽然Excel工作表包含数据,但是当我手动打开时,它打开时没有任何错误,当我使用脚本任务并使用OLEDB连接连接到excel并打开它时,数据显示连接已建立成功但在读取数据时,未选择列名称(我同样获得F1,F2)并且不读取任何数据行。我只是得到一个空白的行和那个。我尝试过HDR = YES和NO以及IMEX = 1和0,但总是结果相同。

有趣的是,如果我打开excel表做一些修改(比如更改工作表名称保存并更改工作表名称并保存并关闭),之后我尝试运行包,数据被选中而没有任何问题(我也注意到文件大小从164KB增加到196KB)。现在因为这个我想要做的是稍微修改文件并通过代码保存。

所以我尝试的第一步是通过使用Office.Interop.Excel,它在我的机器上就像一个魅力,但在服务器上没有OFFICE,所以它不工作。而且,IT人员永远不会安装访问引擎或excel或其他任何东西。

然后我尝试通过OpenXML和第三方库(如NPOI)甚至通过OLEDB连接来修改文件。在NPOI和OLEDB方法中,文件都发生了变化,但仍然没有被SSIS软件包正确地拾取(我注意到文件大小没有改变并保持在164kb)。在OpenXML中,它无法打开文件并抛出错误说"文档无法打开,因为存在意外内容类型的无效部分"。

所以现在我看不到任何正确的方法,并希望通过c#代码或任何其他可用的SSIS方法帮助解决这个问题。我使用的SSIS版本是2008年。

修改1

所以我注意到脚本任务能够从多张纸上读出第一张纸上的数据,但其他纸张是问题所在。所以某些地方的xml被打破了。无论如何,我可以将第一张纸的xml配置复制到其他纸张上吗?只是一个想法...

编辑2 所以第一张是ContentType" application / vnd.openxmlformats-officedocument.spreadsheetml.worksheet + xml"而所有其他工作表都是ContentType" application / xml"

1 个答案:

答案 0 :(得分:1)

最终最终使用了两个库。使用exceldatareader(http://exceldatareader.codeplex.com/)读取数据没有问题。使用此数据可以轻松地将数据读入数据集,然后使用epplus(http://epplus.codeplex.com/)将数据写入新的Excel文件。 之后,当通过SSIS包读取新的excel文件时,数据被选中而没有问题。希望这会帮助那里的人。