我使用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()方法有什麼問題。
[Office Interop在服務器環境中不受支持](http://support.microsoft.com/kb/257757)。 Microsoft目前不推薦並不支持來自任何無人蔘與的非交互式客戶端應用程序或組件(包括ASP,ASP.NET,DCOM和NT服務)的Microsoft Office應用程序的自動化,因爲Office可能表現出不穩定的行爲和/或者Office在此環境中運行時出現死鎖。 –
你是對的,但我在我的預生產服務器上完美地使用它,我非常有信心它可以在我們的生產服務器上工作.. 我當時知道微軟的建議.. 因爲我正在閱讀所有它我想我會嘗試使用其中的一種方法,看看它是否適合我。 – BujinRikimaru