为什么Excel Interop会在处理文件后删除图像?

Excel Interop正在从已处理的文件中删除图像。

我正在使用Excel Interop,没有第三方组件(我知道)。 工作流程是 – 创建文件(模板)的副本(目标),填充单元格,更改单选按钮状态

  1. 创建预先存在的.xslm文件(模板)的副本(目标)
  2. 通过Excel Interop打开目标
  3. 填充目标单元格,更改单选按钮状态
  4. 带有图像的工作表不会被修改
  5. 关闭目标

在我的开发机器上,目标文件看起来很棒 – 所有内容都已填充,图像存在。 注意:在我的开发机器上,我正在运行VS2010 IDE中的代码。

在生产机器上 – 一切都已填充,但图像不存在。 相反,会出现以下错误: NB:在生产计算机上,它作为服务运行,具有本地服务帐户。

“在文件中找不到关系ID为rId1的图像部分” 在文件中找不到关系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结构中,而不是作为另一个服务器的链接。

我已经validation图像在模板文件中的生产计算机上可见,但在已处理的文件中不可见。

为了确认这不是在制作中打开文件的问题,我通过电子邮件发送了一份副本,图像仍然不存在。

我还确认,在我的开发机器上,处理过的文件确实有可见的图像。

我不保护工作表,并解压缩文件结构。 .jpg文件确实不存在于生产机器的已处理目标中。

还有一点需要注意 – Office 2010安装在我的开发机器上,但是在生产机器上安装了Office 2007。 结果,我正在使用Office 12 Interop。 在任一环境中都不会生成运行时错误。

我正在使用Interop(而不是OpenXml库),因为存在必须填充的ActiveX控件。 但请注意,没有任何ActiveX控件存在任何问题 – 它们工作正常。 它只是从处理过的文件中消失的图像文件(它们在模板文件中呈现得很好)。

更新说明:还有其他四个图像文件,所有.emf在不同的工作表上; 他们都被剥夺了。

正如评论中所解释的那样(最终是对问题的编辑),代码在生产中作为服务运行,使用本地服务帐户。

我现在不确定为什么我选择了这个帐户 – 这是我在研究让Interop正确运行作为服务时发现的东西?

但是,一旦我从本地服务帐户切换到本地系统帐户(并选中“允许服务与桌面交互”),它就可以工作。 自动的。

  1. services.msc
  2. 选择服务
  3. 右键单击,选择“属性”
  4. 选择“登录”选项卡
  5. 选择“本地系统帐户”并选中“允许服务与桌面交互”

可能不需要“允许服务与桌面交互”; 关于自动化Interop的其他说明建议需要其他桌面设置,但是我进行了安装,其中设置了先决条件,但未选中此值; 应用还在工作……

http://i.imgur.com/k6Qwy.png

MS在服务器方案中不支持Interop 。

没有Interop,有很多选项可以读取/编辑/创建Excel文件:

MS提供免费的OpenXML SDK V 2.0 – 请参阅http://msdn.microsoft.com/en-us/library/bb448854%28office.14%29.aspx (仅限XLSX)

这可以读取+写入MS Office文件(包括Excel)。

另一个免费选项见http://www.codeproject.com/KB/office/OpenXML.aspx (仅限XLSX)

如果你需要更多像处理旧的Excel版本(如XLS,不仅仅是XLSX),渲染,创建PDF,公式等,那么有不同的免费和商业库,如ClosedXML (免费,仅限XLSX), EPPlus (免费,仅限XLSX) , Aspose.Cells , SpreadsheetGear , LibXL和Flexcel等。

很难说你的具体案例(ActiveX控件)是否完全支持以上任何一个……这是你需要测试的东西……

即使任何库支持ActiveX控件,ActiveX控件本身也可能无法在Windows服务中工作(权限等)。

编辑 – 根据评论:

我理解ActiveX问题,我从2点开始解决它:

  • 你真的测试了上面提到的所有库吗?
  • 你有没有检查ActiveX控件的实现者是否理论上ActiveX控件甚至可以在Windows服务方案中工作?

编辑3 – 从OP更新后:

.emf是一种矢量文件格式… IIRC GDI +用于在当前的Windows版本上呈现它… .emf随着时间的推移已经发展了一段时间,因此较旧的操作系统和/或Office版本有时会在呈现较新的.emf文件时出现问题。 ..这反过来意味着问题是Windows服务中的“缺少桌面”和/或您的.emf文件对于生产机器来说“太新”了。

您可能是自己的,因为@Yahia正确指出服务器环境中不支持Excel。

你提到ActiveX控件是一个红旗 – 也许你的一些ActiveX控件需要Excel在一个带有配置文件的帐户下运行?

您所能做的就是自己调试,最好在开发和生产环境中消除不同行为的可能来源。

  • 尝试在两种环境中使用相同的Office版本
  • 您是否在开发环境中使用Cassini? (即在您自己的登录下运行)如果是这样,也许尝试在没有配置文件的服务帐户下运行IIS
  • 尝试逐个删除ActiveX组件,看看其中一个是否有影响…等…

通过从模板复制带有图片的幻灯片,我在桌面(而非服务)上遇到了与powerpoint相同的问题。 (当在1个演示文稿中获得大约200个复制粘贴时,但具有相同图片的1300个幻灯片工作正常???)

很难得到这个问题,我认为它与硬件有关,比如RAM错误,但不确定

只有1个百客户端得到这个错误,所以我认为它与硬件有关。

请注意,我有一个提供Excel自动化的网站,它完美地工作,即使“它不支持MS等等……”!

您的excel文件似乎已损坏,您必须找到如何。

(a)不支持,不要这样做https://support.microsoft.com/en-gb/kb/257757

(b)无论如何,如果你必须这样做(并且不能按照接受的答案的建议给桌面访问你的进程 ),你可以搞乱C:\Windows\System32\config\systemprofile的内容和权限,如这个答案建议。

我必须创建并允许DesktopINetCache文件夹的权限。 在Process Monitor的帮助下检查(并解决)以C:\Windows\System32\config\systemprofile开头的路径中的失败访问尝试是让我摆脱恼人的问题并指出INetCache权限是插入失败的原因的图像。

您只需将C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache添加到C:\Windows\SysWOW64\config\systemprofile\AppData\Local\Microsoft\Windows\INetCacheC:\Windows\System32\config\systemprofile\AppData\Local\Microsoft\Windows\INetCache (取决于在您的系统版本上)将显示文件夹和图像