2012-03-06 94 views
2

我有一個功能,需要一個URL到一個Excel文件,然後將其導出爲PDF:導出Excel文件爲PDF - 陷入試圖關閉Excel文件

public static void ExportFromExcel(string url) 
{ 
    // Create COM Objects 
    Application excelApplication = new Application(); 
    Workbook excelWorkbook = 
     excelApplication.Workbooks.Open(HttpContext.Current.Server.MapPath(url)); 

    try 
    { 
     // Call Excel's native export function 
     excelWorkbook.ExportAsFixedFormat(
      XlFixedFormatType.xlTypePDF, 
      HttpContext.Current.Server.MapPath(url.Replace(".xlsx", ".pdf"))); 
    } 
    catch (Exception ex) 
    { 

    } 
    finally 
    { 
     // Close the workbook, quit Excel, and clean up regardless of the results 
     excelWorkbook.Close(); // HANGS AND FAILS HERE 
     excelApplication.Quit(); 

     excelApplication = null; 
     excelWorkbook = null; 
    } 
} 

我在做什麼是創建一個Excel文件,然後馬上從該文件中創建PDF:

using (FileStream fs = File.Create(HttpContext.Current.Server.MapPath(filePath))) 
{ 
    byte[] data = pck.GetAsByteArray(); 
    fs.Write(data, 0, data.Length); 
} 

Pdf.ExportFromExcel(filePath); 

它會創建一個Excel文件就好了,而且它還會創建PDF。但網頁掛了很久,然後給了我在excelWorkbook.Close();錯誤在我的PDF代碼:

的遠程過程調用失敗。 (來自HRESULT的異常:0x800706BE)

雖然文件實際上已被創建。但是,如果我去文件目錄,還有一個臨時的Excel文件(我的Excel文件名前面有~$)。

如果我嘗試刪除我的Excel文件,我得到一個錯誤,說該文件正在被另一個進程使用,並且我無法刪除我的Excel文件,直到我殺死了任務管理器中的EXCEL.EXE。

因此,出於某種原因,我的Excel文件在完成創建PDF後不會關閉。我在代碼中做錯了什麼? (!包括ASP.NET/IIS)

回答

3

在服務器上使用互操作不被微軟支持 - 看http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2

由於Windows Vista中引入了MS幾個安全有關的措施,防止Windows服務(如ASP .NET在IIS上)做「類似桌面」的事情(訪問打印機,訪問網絡共享等)......這意味着你將不得不繞過幾個安全措施才能使其工作(不推薦!)。

爲了應對Excel文件沒有在服務器方案需要任何辦公室等有多種選擇(免費和商業)那裏:

我可以推薦Aspose.CellsFlexcel - 都來與PDF導出功能...沒有嘗試SpreadsheetGear,但聽到+讀了很多有關它的好東西...

自由選項(雖然只是較新的xlsx格式,不知道它們是否支持PDF導出!)是例如OpenXML 2 from MSEPPlus

+0

不幸的是,我不能支付這些產品,而免費選項不提供對PDF導出的支持。其實,這裏有一篇帖子,MSFT表示要使用interop功能(http://social.msdn.microsoft.com/Forums/pl/oxmlsdk/thread/26d9879a-6c1f-4a71-8dde-d6a1d9b0b110)。 我看過的其他地方也說只是使用互操作。 所以我在各地都發生了衝突。我寧願不使用互操作 - 你知道我能做到這一點嗎? – Steven 2012-03-06 21:15:22

+0

@Steven對不起,我不知道任何其他方式。 Interop絕對不支持ASP.NET(請參閱我的答案中的第一個鏈接 - 它是來自其知識庫的官方MSFT鏈接)... – Yahia 2012-03-07 05:52:00

+0

謝謝,我剛剛結束了使用itextsharp創建pdf – Steven 2012-03-17 19:04:15

0

您可以使用下面的代碼導出excel文件爲PDF格式:

// Saving an XLS file in Aspose.Pdf xml format 
Workbook wb = new Workbook(); 
wb.Open("C:\\book1.xls); 
wb.Save("C:\\xls2pdf.xml", FileFormatType.AsposePdf); 

// Converting XLS file to PDF through Aspose.Pdf using Aspose.Pdf xml file as a medium 
Aspose.Pdf.Pdf pdf = new Aspose.Pdf.Pdf(); 
pdf.BindXML("c:\\xls2pdf.xml", null); 
pdf.Save("C:\\xls2pdf.pdf"); 


You can download Aspose.pdf from the following link 
http://www.aspose.com/community/files/51/.net-components/aspose.pdf-for-.net/category1184.aspx 

You can download Aspose.cells from the following link 
http://www.aspose.com/community/files/51/.net-components/aspose.pdf-for-.net/category1184.aspx 
1

我知道,這個「offically」已經回答爲「不支持」。這就是說,我遇到了同樣的問題。

實際的例外是一種紅鯡魚。真正的問題是權限。

您可以將Web服務設置爲以具有足夠權限的用戶身份運行(不總是一個好主意),或者您可以進入DCOMCNFG並更改Excel應用程序的權限,以便系統用戶擁有權利訪問。

我希望這可以幫助未來的人。