2012-11-05 50 views
1

我使用Microsoft.Office.Interop.Excel.Workbooks.Open()用於打開.XML文件,然後使用方法保存文件作爲PDF Microsoft.Office.Interop.Excel.Workbook.ExportAsFixedFormat()將打開的.XML文件發佈(保存)爲.PDF文件的方法。使用的Microsoft.Office.Interop.Excel

現在我的發展和預生產環境的一切運作良好,但我們的生產服務器上它似乎在呼籲Microsoft.Office.Interop.Excel.Workbooks.Open()由該方法執行時則(甚至不在我的日誌文件或事件查看器中),並且最終沒有任何明顯的.PDF文件保存在任何地方。

這裏是我的代碼:

using ExcelApp = Microsoft.Office.Interop.Excel; 

public static void ToPdf() 
{   
     // Declare the Excel Application object and set it in null state 
     ExcelApp.Application activeExcel = null; 
     // Declare the Workbook to be used within the Excel Application object 
     ExcelApp.Workbook openWorkBook = null; 
     // Used for passing parameter for the attribute of opening the .XML file 
     object tMiss = Type.Missing; 

     // .XML file location 
     string xmlPathName = "C:/Windows/Temp/XmlFile.xml"; 

     try 
     { 
      // Instanitating the Excel.Application to a new valid Instance object 
      activeExcel = new ExcelApp.Application(); 
      // Open Excel as Hiden 
      activeExcel.Visible = false; 
      // Open Excel w/o alerts 
      activeExcel.DisplayAlerts = false; 

      // 
      // Log this line 
      // 
      LogTxt.LogCreator("Set Excel GUI to be open Hiden with no Alerts"); 

      // Open an Excel instance and passing the .XML file Path 
      openWorkBook = activeExcel.Workbooks.Open(xmlPathName, 0, false, tMiss, tMiss, 
                 tMiss, true, tMiss, tMiss, tMiss, 
                   true, tMiss, false, false); 

      // 
      // Log this line 
      // 
      LogTxt.LogCreator("Excel Application Opend"); 

      // Publishing the opened workbook (.xml file) as .pdf file 
      openWorkBook.ExportAsFixedFormat(ExcelApp.XlFixedFormatType.xlTypePDF, pdfPathName); 

      // 
      // Log this line 
      // 
      LogTxt.LogCreator("Excel to .PDF published"); 
      } 
      catch (Exception ee) 
      { 
       LogTxt.LogCreator(string.Format("Error is {0}", ee.InnerException.Message)); 
      } 
      finally 
      { 
       // Flag for finding the Excel process or not 
       //bool foundExcel = false; 

       if (openWorkBook != null) 
       { 
        // Closing the workbook 
        openWorkBook.Close(false, tMiss, tMiss); 
        // here we say that this object is not going to be called anymore 
        Marshal.ReleaseComObject(openWorkBook); 
       } 
       if (activeExcel != null) 
       { 
        // Closing the Excel 
        activeExcel.Quit(); 
        // here we say that this object is not going to be called anymore 
        Marshal.ReleaseComObject(activeExcel); 

        // 
        // Log this line 
        // 
        LogTxt.LogCreator("Excel Procces Closed"); 
       } 

       GC.GetTotalMemory(false); 
       // Calling to GC go through all gen 
       GC.Collect(); 
       // Stops the corrent thread untill the Finalizers empty the queue 
       GC.WaitForPendingFinalizers(); 
       // Calling the GC to go through all gen 
       GC.Collect(); 
       GC.GetTotalMemory(true); 
} 

注 - 我登錄到我的日誌文件,所以我就可以看到部署後執行哪一行代碼。

我還確保我有權在組件服務管理下的COM安全選項卡中執行COM組件,方法是將\ Users和網絡服務用戶添加到訪問權限默認值以及啓動和激活權限。
如解釋here

我問的是,如果你們有任何想法瞭解Open()方法有什麼問題。

+6

[Office Interop在服務器環境中不受支持](http://support.microsoft.com/kb/257757)。 Microsoft目前不推薦並不支持來自任何無人蔘與的非交互式客戶端應用程序或組件(包括ASP,ASP.NET,DCOM和NT服務)的Microsoft Office應用程序的自動化,因爲Office可能表現出不穩定的行爲和/或者Office在此環境中運行時出現死鎖。 –

+1

你是對的,但我在我的預生產服務器上完美地使用它,我非常有信心它可以在我們的生產服務器上工作.. 我當時知道微軟的建議.. 因爲我正在閱讀所有它我想我會嘗試使用其中的一種方法,看看它是否適合我。 – BujinRikimaru

回答

-1

我想看看用這個來讀取Excel文件

http://exceldatareader.codeplex.com/

那麼這將讓你打印到PDF。

http://pdfsharp.codeplex.com/

它的開源和免費在商業應用中使用。

不是一個完整的解決方案,但它的一個開始。然後,您在服務器環境中不使用Com

+0

我當時正在嘗試Aspose,但它沒有爲我工作,所以我用Office Introps來代替。 我知道那裏有很多XML 2 PDF解決方案,我會在嘗試微軟的方法之後嘗試它@第十九花評論 – BujinRikimaru

相關問題