EPPlus: как мне получить 2 ExcelPackage.SaveAs?

Я использую EPPlus для функции экспорта в Excel. Мне нужно иметь 2 SaveAs, 1-й SaveAs, который представляет собой диалоговое окно сохранения, позволяющее пользователю открывать/Сохранить/SaveAs, и мой 2-й SaveAs, чтобы позволить файлу Excel быть сохраненным непосредственно в указанной папке на сервере в качестве резервной копии.

Таким образом, моя проблема заключается в том, что мой второй файл SaveAs не работает (во время отладки не появляется всплывающее окно с ошибкой, файлы не создаются ни для второго файла SaveAs).

Пожалуйста посоветуй. Спасибо!

ExcelPackage package = new ExcelPackage();
.....
code for loading data table
.....
var filename = @"REPORT_" + datetime.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx";

Приведенные ниже коды работают (мой 1-й SaveAs для пользователя, чтобы выбрать Open/Save/SaveAs):

Response.Clear();
package.SaveAs(Response.OutputStream);
Response.AddHeader("content-disposition", "attachment; filename=" + filename + ";");
Response.Charset = "";
Response.ContentType = "application/vnd.xlsx";
Response.End();

Приведенный ниже код не работает (мой второй SaveAs для сохранения файла непосредственно на сервер):

string path = @"C:\Users\testacc\Desktop\Test\" + filename +";";
Stream stream = File.Create(path);
package.SaveAs(stream);
stream.Close();
byte[] data = File.ReadAllBytes(path);

person James Boer    schedule 20.10.2015    source источник


Ответы (2)


Почему бы не посмотреть на это и не добиться другим путем, в обратном порядке. Сначала сохраните сгенерированный файл на сервере, а затем передайте сохраненный файл клиенту.

  1. Создать пакет

    ExcelPackage package = new ExcelPackage();
    .....
    code for loading data table
    .....
    var filename = @"REPORT_" + datetime.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx";
    
  2. Сохранить на сервер

    string path = @"C:\Users\testacc\Desktop\Test\" + filename +";";
    Stream stream = File.Create(path);
    package.SaveAs(stream);
    stream.Close();
    
  3. Передать сохраненный файл клиенту

    try {
        response.Clear();
        response.ContentType = "application/vnd.xlsx";
        response.AddHeader("content-disposition", "attachment; filename=" + filename + ";");
        response.TransmitFile(path);
        response.Flush();
    } catch (Exception ex) {
        // any error handling mechanism
    } finally {
        HttpContext.Current.ApplicationInstance.CompleteRequest();
    }
    
person haraman    schedule 20.10.2015
comment
package.SaveAs() запрашивает подтверждение.. есть ли способ его заблокировать? - person ; 16.11.2015
comment
@WashingtonGuedes Какое подтверждение? - person haraman; 16.11.2015
comment
Windows подсказывает, действительно ли я хочу сохранить файл. - person ; 16.11.2015
comment
Не уверен насчет такого подтверждения, я его не получил. Это подтверждение перезаписи файла или что-то еще? Если возможно, задайте вопрос вместе с соответствующим примером кода. - person haraman; 16.11.2015
comment
О, только что посмотрел на вашу награду, я подумал SaveAs подтверждение в контексте этого вопроса. Как обсуждалось в epplus.codeplex.com/discussions/230017, вы можете рассмотреть какое-либо решение, основанное на добавление макроса в файлы, как указано на support.microsoft.com /en-us/kb/213428 - person haraman; 16.11.2015

Каждый раз, когда вы вызываете .Save, .SaveAs или .GetAsByteArray() (могут быть и другие) в EPPlus, они имеют побочный эффект закрытия пакета. Поэтому вам нужно будет пересобрать свой пакет, выполнив что-то вроде package = new ExcelPackage.. и каким-то образом перечитав файл.

Поскольку у вас уже есть пакет в памяти, почему бы просто не скопировать байты и не сохранить их дважды, избегая дополнительных поездок на ввод-вывод. Что-то вроде этого:

ExcelPackage package = new ExcelPackage();
var workbook = package.Workbook;
var hoja = workbook.Worksheets.Add("Sheet1");

//Copy the package in memory
byte[] data = package.GetAsByteArray();

//Write to web
Response.OutputStream.Write(data, 0, data.Length);

//Write to file
var filename = @"REPORT_" + DateTime.Now.ToString("dd-MM-yyyy_hh-mm-ss") + ".xlsx";
path = @"C:\temp\" + filename + ";";
stream = File.Create(path);
stream.Write(data, 0, data.Length);
stream.Close();
person Ernie S    schedule 20.10.2015