【发布时间】:2012-02-09 18:21:44
【问题描述】:
Excel Interop 正在从已处理的文件中删除图像。
我正在使用 Excel 互操作,不存在第三方组件(据我所知)。 工作流程是——创建文件(模板)的副本(目标)、填充单元格、更改单选按钮状态
- 为预先存在的 .xslm 文件(模板)创建副本(目标)
- 通过 Excel 互操作打开目标
- 填充目标单元格,更改单选按钮状态
- 带有图像的工作表未修改
- 关闭目标
在我的开发机器上,目标文件看起来很棒——所有内容都已填充,图像存在。 注意:在我的开发机器上,我从 VS2010 IDE 运行代码。
在生产机器上 - 一切都已填充,但图像不存在。 相反,以下错误出现在其位置: 注意:在生产机器上,它作为服务运行,使用 Local Service 帐户。
“在文件中未找到关系 ID 为 rId1 的图像部分”
通过以下代码打开整个工作簿:
var workbook = workbooks.Open(targetPath
0, false, 5, Type.Missing, Type.Missing, false, XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
请注意,带有图像的工作表未在代码中进行处理。
工作簿(和单个工作表)受到保护。但是,受保护的模板在开发中得到了正确处理,但在生产中却没有。我不认为保护与它有任何关系(但谁知道,对吧?这是 Interop。呃)。
文件是由另一方创建的,所有组件(即图像)都驻留在 .xslm 结构中,而不是作为到另一台服务器的链接。
我已验证该图像在模板文件中的生产机器上可见,但在处理后的文件中不可见。
为了确认这不是在制作中打开文件时出现的问题,我通过电子邮件给自己发送了一份副本,但图像仍然不存在。
我还确认,在我的开发机器上,处理过的文件确实有可见的图像。
我取消了工作表的保护,并解压缩了文件结构。 .jpg 文件确实不存在于生产机器的已处理目标中。
还有一点需要注意——我的开发机器上安装了 Office 2010,而生产机器上安装了 Office 2007。因此,我使用的是 Office 12 Interop。两种环境都不会产生运行时错误。
我使用的是 Interop(而不是 OpenXml 库),因为存在必须填充的 ActiveX 控件。但是请注意,所有 ActiveX 控件都没有任何问题——它们工作正常。它只是从处理过的文件中消失的图像文件(它们在模板文件中渲染得很好)。
更新注意:还有四个其他图像文件,所有 .emf 在不同的工作表上;它们也都被剥离了。
【问题讨论】:
-
这是 Windows 服务或 ASP.NET 应用程序吗?
-
这是一个 Windows 服务。啊。服务中的互操作。
-
这是您的问题的一部分 - MS 不支持服务中的互操作(请参阅support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2)。
-
请看下面我的回答...
标签: c# excel-2007 excel-2010 excel-interop