2012-01-13 44 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(取決於你的系統版本)文件夾,圖像將顯示