Диалог ошибок отображается при открытии файла excel, сгенерированного с помощью EPPlus

Я создаю файл Excel, используя библиотеку EPPlus. Когда я создаю файл и открываю файл, появляется следующее всплывающее сообщение:

Мы обнаружили проблему с некоторым контентом в "ExcelDemo.xlsx". Вы хотите, чтобы мы попытались восстановить как можно больше? Если вы доверяете источнику этой книги, нажмите "Да"

Я использую следующий код

using (ExcelPackage pck = new ExcelPackage())
{
    //Create the worksheet
    ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo");

    //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
    ws.Cells[1, 2].Value = "Excel Download";

    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    Response.AddHeader("content-disposition", "attachment;  filename=ExcelDemo.xlsx");
    Response.BinaryWrite(pck.GetAsByteArray());
}

Есть ли проблема в моем коде или это проблема Excel?

Ответ 1

Вначале вам нужно добавить:

Response.Clear();

Затем в конце добавьте

Response.End();

Ответ 2

В моем случае проблема заключалась в вызове

package.Save();

и используя

Response.BinaryWrite(package.GetAsByteArray());

в то же время.

Когда вы вызываете package.GetAsByteArray(), он выполняет следующие операции внутри:

this.Workbook.Save();
this._package.Close();
this._package.Save(this._stream);

Итак, вызов package.Save два раза приводит к этой ошибке при открытии в Excel.

Ответ 3

Я поделюсь своим решением. Я использую шаблон excel файла, а затем создаю из него новый excel.

Получение той же ошибки. Мой код был

 using (Stream newFileStream = File.Open(this.tempFilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
 using (Stream originalFile = File.Open(this.initialFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
 using (ExcelPackage excelPackage = new ExcelPackage(newFile, template))
 {
      // ... Do work here
 }

Мне пришлось сменить код на:

FileInfo intialInfo = new FileInfo(this.initialFilePath);
FileInfo tempFileInfo = new FileInfo(this.tempFilePath);
using (ExcelPackage excelPackage = new ExcelPackage(tempFileInfo, intialInfo))
{
     //... Do work here
}

Также я использую ASP MVC, и ответ:

byte[] result = exporter.GetBytesFromGeneratedExcel();
return this.File(result, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "Test.xlsx");

Ответ 4

У меня была эта проблема, потому что я записывал строку размером более 32 767 символов в одну ячейку. Excel не нравится это, но EPPlus не остановит вас от этого.

Ответ 5

Мой код был обновлен... и получал ту же ошибку.... и я наконец нашел свое решение

Оригинальный код:

public static void ExportToExcel(HttpContext ctx, DataTable tbl, string fileName)
        {
            try
            {
                using (ExcelPackage pck = new ExcelPackage())
                {
                    //Create the worksheet
                    ExcelWorksheet ws = pck.Workbook.Worksheets.Add(fileName);

                    //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1
                    ws.Cells["A1"].LoadFromDataTable(tbl, true);

                    int rowCount = tbl.Rows.Count;
                    List<int> dateColumns = new List<int>();
                    foreach (DataColumn d in tbl.Columns)
                    {
                        if (d.DataType == typeof(DateTime))
                            dateColumns.Add(d.Ordinal + 1);
                    }

                    CultureInfo info = new CultureInfo(ctx.Session["Language"].ToString());

                    foreach (int dc in dateColumns)
                        ws.Cells[2, dc, rowCount + 1, dc].Style.Numberformat.Format = info.DateTimeFormat.ShortDatePattern;

                    //Write it back to the client
                    ctx.Response.Clear();
                    ctx.Response.AddHeader("content-disposition", "attachment;  filename=" + fileName + ".xlsx");
                    ctx.Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                    ctx.Response.Buffer = false;
                    ctx.Response.BufferOutput = false;
                    ctx.Response.BinaryWrite(pck.GetAsByteArray());
                    ctx.Response.End();
                }
            }
            catch (Exception EX)
            {
                ctx.Response.Write(EX.ToString());
            }
        }

Обновление кода:

catch (Exception EX)
{
    if (!(EX is System.Threading.ThreadAbortException))
    {
        ctx.Response.Write(EX.ToString());
    }
}

ЭТО СРАБОТАЛО!

Ответ 6

Я получил эту проблему, потому что я спас два раза.

//Wrong
package.Save();
var data = package.GetAsByteArray();

//Correct
//package.Save();
var data = package.GetAsByteArray();