打开使用EPPlus生成的Excel文件时显示错误对话框

时间:2014-09-09 17:30:20

标签: c# asp.net excel epplus

我正在使用EPPlus库创建Excel文件。当我创建文件并打开文件时,以下弹出消息显示:

  

我们发现ExcelExmo.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问题?

8 个答案:

答案 0 :(得分:22)

一开始,您需要添加:

Response.Clear();

然后在最后添加一个

Response.End();

答案 1 :(得分:10)

就我而言,问题在于调用

package.Save();

并使用

Response.BinaryWrite(package.GetAsByteArray());

同时。

当你调用package.GetAsByteArray()时,它会在内部执行以下操作:

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

因此,在Excel中打开时,调用package.Save两次会导致此错误。

答案 2 :(得分:2)

我将分享我的解决方案。我正在使用模板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");

答案 3 :(得分:0)

我遇到这个问题是因为我在一个单元格中写入了一个大于32,767个字符的字符串。 Excel不喜欢这样,但是EPPlus不会阻止您这样做。

答案 4 :(得分:0)

我的代码已更新...并出现相同的错误...。我终于找到了解决方法

原始代码:

> merge(df1, df2)
location time color intensity
1        1    1     1         8
2        1    2     2         7
3        1    3     3         6
4        1    4     4         5
5        2    1     5         4
6        2    2     6         3
7        2    3     7         2
8        2    4     8         1

代码更新:

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());
            }
        }

成功!

答案 5 :(得分:0)

我遇到了这个问题,因为我保存了两次。

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

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

答案 6 :(得分:0)

我想出的一个解决方案就是在控制器中返回文件对象。第一个参数应为字节数组(文件),第二个参数为内容类型,最后一个参数为文件名(在我的情况下为“ report.xlsx”)。

return File(file, "application/octet-stream", fileName);

希望这会有所帮助。

答案 7 :(得分:0)

在我的情况下,问题出在我未设置的数据表名称上。

尝试一下,

dt.TableName = "ExcelSheet1";