2012-01-13 47 views
4

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

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

  1. 创建预先存在.xslm文件(模板)的复印件(目标)
  2. 通过Excel的互操作
  3. 填充靶细胞,改变无线电按钮状态
  4. 与图像的工作表没有被修改
  5. 关闭靶
  • 打开靶3210

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

    在生产机器上 - 所有东西都被填充,但图像不存在。 取而代之,在它的位置出现以下错误: 注意:在生产计算机上,它作为服务运行,其中本地服务帐户。

    the image part with relationship ID rId1 was not found in the file

    整个工作簿通过下面的代码打开“与关系ID RID1图像部分在文件中未找到”:

    var workbook = workbooks.Open(targetPath 
        0, false, 5, Type.Missing, Type.Missing, false, XlPlatform.xlWindows, "", 
        true, false, 0, true, false, false); 
    

    请注意,该工作表图像不在代码中操作。

    工作簿(和单个工作表)受到保护。但是,受保护的模板在dev中正确处理,但不在生产中。我不认为保护与它有任何关系(但是谁知道,对吗?这是Interop,呃)。

    该文件由另一方创建,并且所有组件(即图像)驻留在.xslm结构中,而不是作为另一个服务器的链接。

    我已验证该图像在模板文件中的生产机器上可见,但未处理文件中。

    为了确认这在打开生产文件时不是问题,我给自己发了一个电子邮件副本,图像仍然不存在。

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

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

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

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

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

  • +0

    任何机会Windows服务或ASP.NET应用程序是这样吗? – Yahia 2012-01-13 15:41:59

    +0

    这是一个Windows服务。啊。互操作服务。 – 2012-01-13 15:46:11

    +0

    这是您的问题的一部分 - MS不支持Interop服务(请参阅http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2)。 – Yahia 2012-01-13 15:54:44

    回答

    5

    正如评论(在编辑的问题,并最终)中说明,该代码在生产作为服务正在运行,与本地服务帐户。

    我现在不确定为什么选择了这个帐户 - 在我的研究中,我发现在获取Interop作为服务正确运行期间发现了这个问题?

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

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

    ”允许服务与桌面交互“可能不需要;关于自动化Interop的其他说明表明其他桌面设置是必需的,但是我做了一个安装,在那些先决条件被设置的地方,但是这个值没有被选中;应用程序仍然工作......

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

    +1

    谢谢我遇到了同样的问题,并解决了这个问题。令人惊讶的是,这不会引发任何COM异常。 – 2012-02-10 14:15:58

    2

    Interop is not supported in sever-scenarios by MS

    有很多选择阅读/编辑/制作的Excel文件,而无需互操作性:

    MS提供免费的OpenXML SDK 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.CellsSpreadsheetGearLibXLFlexcel

    这是很难说是否你的具体情况(ActiveX控件)任何的完全支持上述......这是你需要测试的东西......

    即使ActiveX控件受到任何库的支持,ActiveX控件本身在Windows服务(权限等)中都不起作用。

    编辑 - 按评论:

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

    • 你有没有真正的考验上述所有库?
    • 您是否检查过ActiveX控件的实现者,ActiveX控件是否理论上可以在Windows服务场景中工作?

    编辑3 - 从OP的更新后:

    .emf是一个矢量文件格式... IIRC GDI +是用来使其在当前的Windows版本... .emf已经发展了一下随着时间的推移所以较旧的操作系统和/或Office版本有时可能会出现问题,呈现较新的.emf文件...这反过来意味着问题是Windows服务中的“丢失的桌面”和/或您的.emf文件对于生产“太新”机。

    +0

    请看到原来的问题 - 我找到的OpenXML库都不行,因为必须使用文件中的ActiveX控件。我检查过的所有库(并经过测试)都不适用于ActiveX对象,因为它们在设计上可以与XML一起工作。而ActiveX对象是这些包中的二进制blob,而不是XML。 – 2012-01-13 16:06:16

    +0

    OpenXML SDK本身无法处理ActiveX控件(据我所知),因此我尝试的包装器库(EPPlus,ClosedXml)都没有。 – 2012-01-13 16:17:12

    +0

    我知道服务器场景中不支持Interop。然而,它对于SO上的数百人来说“起作用”(就像Interop“工作”一样)。它也适用于我,除了图像删除。 – 2012-01-13 16:18:02

    0

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

    您提到的ActiveX控件是一个红旗 - 也许您的一些ActiveX控件需要Excel在具有个人资料的帐户下运行?

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

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

    我通过复制与模板图片的幻灯片面临着在桌面上的PowerPoint相同的问题(而不是服务)。 (当获得约200复制粘贴在1演示文稿,但1300张幻灯片相同的图片工作正常吗?)

    这很难得到这个问题,我认为这是硬件相关的,像RAM错误,但不知道

    只有百位客户端得到这个错误,所以我认为它是硬件相关的。

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

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

    0

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

    (B)无论如何,如果你必须这样做(并不能给desktop access to your process, as suggested in the accepted answer),你可以惹的内容和权限C:\Windows\System32\config\systemprofile,如this answer所示。

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

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