C# 将Excel文件导出为PDF-尝试关闭Excel文件时遇到问题

C# 将Excel文件导出为PDF-尝试关闭Excel文件时遇到问题,c#,asp.net,file-io,com-interop,office-interop,C#,Asp.net,File Io,Com Interop,Office Interop,我有一个函数,它将url导入Excel文件,然后将其导出为pdf: public static void ExportFromExcel(string url) { // Create COM Objects Application excelApplication = new Application(); Workbook excelWorkbook = excelApplication.Workbooks.Open(HttpContext.Curre

我有一个函数,它将url导入Excel文件,然后将其导出为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。但是页面挂起很长时间,然后在
excelWorkbook.Close()处出现错误在我的pdf代码中:

远程过程调用失败。(HRESULT的例外:0x800706BE)

这些文件实际上是被创建的。但是如果我转到文件目录,也会有一个临时Excel文件(我的Excel文件名前面有
~$

如果我尝试删除我的Excel文件,我会收到一个错误,说明该文件正被另一个进程使用,并且在任务管理器中杀死Excel.EXE之前,我无法删除我的Excel文件


因此,由于某些原因,我的Excel文件在创建完pdf后不会关闭。我的代码是否出错?

MS不支持在服务器(包括ASP.NET/IIS!)上使用互操作-请参阅

由于Windows Vista MS引入了一些与安全相关的措施,这些措施可防止Windows服务(如IIS上的ASP.NET)执行“类似桌面”的操作(访问打印机、访问网络共享等)。。。这意味着您必须绕过几个安全措施才能使其正常工作(不推荐!)

要处理Excel文件而无需任何Office等。在服务器场景中,有几个选项(免费和商业):

我可以推荐和-两者都带有PDF导出功能。。。没有尝试,但听到并阅读了很多关于它的好东西


免费选项(尽管仅适用于较新的xlsx格式,但不确定它们是否支持PDF导出!)例如和。

您可以使用以下代码将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
我知道这个“官方”的回答是“不支持”。也就是说,我遇到了同样的问题

实际的例外有点像是在转移视线。真正的问题是权限

您可以将web服务设置为以具有足够权限的用户身份运行(这并不总是一个好主意),也可以进入DCOMCNFG并更改Excel应用程序的权限,以便您的系统用户具有正确的访问权限

我希望这对将来的人有所帮助

  • 安装2007 Microsoft Office Suite Service Pack 3(SP3)

  • 安装2007 Microsoft Office加载项:Microsoft另存为PDF或XPS

  • 必填项:将Microsoft XPS Document Writer设置为服务器中的默认打印机。 因为ExportAsFixedFormat函数执行Microsoft XPS Document Writer将Excel转换为PDF


    这对我有用。

    不幸的是,我付不起这些产品的费用,而且免费选项不支持PDF导出。实际上,这里有一篇帖子,MSFT说要使用互操作功能()。我看过的其他地方也都说要使用互操作。所以我到处都有矛盾的意见。我不想使用互操作-你知道我可以用什么其他方法吗?@Steven抱歉,我不知道其他方法。ASP.NET绝对不支持Interop(请参阅我答案中的第一个链接-这是他们知识库中的官方MSFT链接)…谢谢,我刚刚使用itextsharp创建了pdf