我有一个功能,需要一个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)
不幸的是,我不能支付这些产品,而免费选项不提供对PDF导出的支持。其实,这里有一篇帖子,MSFT表示要使用interop功能(http://social.msdn.microsoft.com/Forums/pl/oxmlsdk/thread/26d9879a-6c1f-4a71-8dde-d6a1d9b0b110)。 我看过的其他地方也说只是使用互操作。 所以我在各地都发生了冲突。我宁愿不使用互操作 - 你知道我能做到这一点吗? – Steven 2012-03-06 21:15:22
@Steven对不起,我不知道任何其他方式。 Interop绝对不支持ASP.NET(请参阅我的答案中的第一个链接 - 它是来自其知识库的官方MSFT链接)... – Yahia 2012-03-07 05:52:00
谢谢,我刚刚结束了使用itextsharp创建pdf – Steven 2012-03-17 19:04:15