2012-03-06 196 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应用程序的权限,以便系统用户拥有权利访问。

我希望这可以帮助未来的人。