将Excel文件导出为PDF - 在尝试关闭Excel文件时卡住了

3
我有一个函数,它接收一个指向Excel文件的URL,并将其导出为PDF文件:
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。但是页面会长时间挂起,然后在我的pdf代码中的 excelWorkbook.Close(); 处给我一个错误:

远程过程调用失败。 (HRESULT 为 0x800706BE 的异常)

实际上这些文件已经被创建了。但是,如果我进入文件目录,就会发现有一个临时Excel文件(我的Excel文件名前面带有 ~$)。
如果我试图删除我的Excel文件,那么就会出现一个错误,指出文件正在被另一个进程使用,直到我在任务管理器中结束EXCEL.EXE进程,才能删除Excel文件。
因此,由于某种原因,在完成创建pdf后,我的Excel文件无法关闭。我在代码中做错了什么吗?
4个回答

4
在服务器上使用Interop(包括ASP.NET/IIS)不受MS支持-请参阅http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2
自Windows Vista以来,MS引入了几项与安全相关的措施,防止Windows服务(如IIS上的ASP.NET)执行“桌面类”操作(访问打印机、访问网络共享等)...这意味着您必须规避多项安全措施才能使其正常工作(不建议!)。
在服务器场景下处理Excel文件而无需Office等软件,有几个选择(免费和商业):
我可以推荐Aspose.CellsFlexcel -两者都具有PDF导出功能...没有尝试SpreadsheetGear,但听说很不错...

免费选项(仅适用于较新的xlsx格式,不确定是否支持PDF导出!)包括 OpenXML 2 from MSEPPlus


很不幸,我无法支付那些产品的费用,而免费选项不支持PDF导出。实际上,这里有一篇帖子,其中一个微软员工建议使用Interop功能(http://social.msdn.microsoft.com/Forums/pl/oxmlsdk/thread/26d9879a-6c1f-4a71-8dde-d6a1d9b0b110)。我在其他地方查找时也发现了同样的建议。所以我得到了各种矛盾的意见。我宁愿不使用Interop - 你知道我还有其他方法吗? - Steven
@Steven 抱歉,我不知道其他的方法。Interop 绝对不支持 ASP.NET(请参见我的答案中的第一个链接 - 它是来自微软知识库的官方链接)... - Yahia
谢谢,我最终使用itextsharp创建了PDF。 - Steven

1
我知道这个问题“官方上”被回答为“不支持”。尽管如此,我也遇到了同样的问题。
实际上,异常信息有点误导人。真正的问题是权限。
您可以将Web服务设置为在具有足够权限的用户身份下运行(并非总是一个好主意),或者进入DCOMCNFG并更改Excel应用程序的权限,以便您的System用户具有正确的访问权限。
希望这能帮助未来的某些人。

0

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接