Экспорт файла Excel в PDF - застревание при попытке закрыть файл Excel - PullRequest
3 голосов
/ 07 марта 2012

У меня есть функция, которая берет 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, пока не уничтожу EXCEL.EXE в диспетчере задач.

Так что по какой-то причине мой файл Excel не закрываетсяпосле завершения создания PDF.Я что-то не так делаю в своем коде?

Ответы [ 4 ]

4 голосов
/ 07 марта 2012

Использование Interop на сервере (включая ASP.NET/IIS!) НЕ поддерживается MS - см. http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2

Поскольку в Windows Vista MS введено несколько мер безопасности, которые препятствуют работе WindowsСлужба (например, ASP.NET в IIS) для выполнения «настольных» операций (доступа к принтерам, доступа к сетевым ресурсам и т..

Для работы с файлами Excel без необходимости использования Office и т. Д. В сценарии сервера существует несколько вариантов (бесплатных и коммерческих):

Я могу порекомендовать Aspose.Ячейки и Flexcel - обе имеют функцию экспорта в PDF ... не пробовали SpreadsheetGear , но слышали + читали много хороших вещей об этом ...

Бесплатные опции (хотя только для более нового формата xlsx, не уверен, поддерживают ли они экспорт PDF!), Например OpenXML 2 от MS и EPPlus .

1 голос
/ 23 августа 2013

Я знаю, что на это «официально» ответили как «не поддерживается».Тем не менее, я столкнулся с этой же проблемой.

Фактическим исключением является разновидность красной сельди.Реальная проблема заключается в разрешениях.

Вы можете либо настроить веб-службу для работы под учетной записью пользователя с соответствующими правами (не всегда хорошая идея), либо вы можете зайти в DCOMCNFG и изменить разрешения Excelприложение, чтобы ваш системный пользователь имел право доступа.

Я надеюсь, что это поможет кому-то в будущем.

0 голосов
/ 07 июля 2014
  1. Установка пакета обновления 3 (SP3) для Microsoft Office 2007 http://www.microsoft.com/en-in/download/details.aspx?id=27838

  2. Установка надстройки Microsoft Office 2007: Microsoft Сохранить как PDF или XPS http://www.microsoft.com/en-in/download/details.aspx?id=7

Обязательно: Установить Microsoft XPS Document Writer в качестве принтера по умолчанию на сервере.Потому что ExportAsFixedFormat выполняет функцию Microsoft XPS Document Writer для преобразования Excel в PDF.

Это работает для меня.

0 голосов
/ 07 марта 2012

Вы можете использовать следующий код для экспорта файла 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...