Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка под ASP.NET > Download документа Excel


Автор: SKrivosein 3.7.2013, 03:05
Возникла такая проблема. По данным с базы, на сайте (WebForm) создается Excel. На сервере Excel создается коректно, с правильным названием и в правильной директории.
При дальнейшей попытке его скачать, вот так ....
Код

            string savePath = Server.MapPath("~/");
            DirectoryInfo dirInfo = new DirectoryInfo(savePath + "Login\\Admin\\documents\\excel");

            if (!dirInfo.Exists)
            {
                dirInfo.Create();
            }

            string urlExcel = хххх.ExcelGen(savePath);  //с метода все возвращается коректно

            FileInfo fi = new FileInfo(urlExcel);

            if (fi.Exists)
            {
                try
                {
                    Response.ContentType = "application/vnd.ms-excel";
                    Response.AppendHeader("Content-Disposition", "attachment; filename=" + ExcelName(urlExcel));
                    Response.TransmitFile(urlExcel);
                    Response.End();
                }
                catch (Exception ex)
                {
                    string msg = ex.Message;
                }
            }


... скачивается непонятное отображение HTML страницы в Excel. Причем иногда(10%), скачивает то что надо. 
Файлы PDF, тоже сгенерированые на сайте, так скачиваются нормально.
Менял настройки Response, долбался часа два... и результат никакой.  smile 

Автор: jonie 3.7.2013, 18:16
а что в заголовках написано про Content-Size ?

Автор: SKrivosein 4.7.2013, 02:17
Проблема частично решена. С помощью Process Explorera и отладчика VS установил что поток создания Excel (как я понимаю COM) не успевал закрыться перед началом скачивания документа.

Код

Excel.Application excelApp = new Excel.Application();

......

try
{
    excelSheet.SaveAs(savePath);
}
catch (Exception ex)
{
    string msg = ex.Message;
}
 finally
{
    excelApp.Quit();    // вот здесь
}


Помогло добавление Thread.Sleep(100)  И кстати использование GC.Collect() тоже желательно, предотвращает появление потоков клонов, как показал Process Explorer...
Вообщем буду ещё разбираться, искать элегантное решение.

Автор: jonie 9.7.2013, 22:55
если формат XSLX, то можно юзать openxml sdk, а не Excel - быстрее и удобнее.
Есть еще у DevExpress-а платная либа - Document Server называется, тоже умеет эксель

Автор: SKrivosein 20.7.2013, 18:54
Цитата(jonie @ 9.7.2013,  22:55)
если формат XSLX, то можно юзать openxml sdk, а не Excel - быстрее и удобнее.

Спасибо, читаю... очень занятно.
От первого варианта отказался всвязи с проблемами с Excel на сервере. Нашел простое решение с помощью XSL.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)