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

C# 打开使用EPPlus生成的excel文件时显示错误对话框,c#,asp.net,excel,epplus,C#,Asp.net,Excel,Epplus,我正在使用EPPlus库创建Excel文件。创建文件并打开文件时,会显示以下弹出消息: 我们发现“ExcelDemo.xlsx”中的某些内容存在问题。你想让我们尽力恢复吗?如果您信任此工作簿的来源,请单击“是” 我正在使用以下代码 using (ExcelPackage pck = new ExcelPackage()) { //Create the worksheet ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Demo")

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

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

首先,您需要添加一个:

Response.Clear();
然后在末尾添加一个

Response.End();

我将分享我的解决方案。我正在使用模板excel文件,然后从中创建新的excel

收到相同的错误。我的密码是

使用(Stream newFileStream=File.Open(this.tempFilePath、FileMode.OpenOrCreate、FileAccess.ReadWrite、FileShare.ReadWrite))
使用(Stream originalFile=File.Open(this.initialFilePath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite))
使用(ExcelPackage ExcelPackage=新的ExcelPackage(新文件、模板))
{
//…在这里工作吗
}
我必须将代码更改为:

FileInfo intialInfo=newfileinfo(this.initialFilePath);
FileInfo tempFileInfo=newfileinfo(this.tempFilePath);
使用(ExcelPackage ExcelPackage=新的ExcelPackage(tempFileInfo,intialInfo))
{
//…在这里工作吗
}
此外,我正在使用ASP MVC,响应为:

byte[]result=exporter.GetBytesFromGeneratedExcel();
返回此.File(结果,“application/vnd.openxmlformats of icedocument.spreadsheetml.sheet”、“Test.xlsx”);

在我的案例中,问题在于呼叫

package.Save();
和使用

Response.BinaryWrite(package.GetAsByteArray());
同时,

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

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

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

我遇到此问题,因为我正在将大于32767个字符的字符串写入单个单元格。Excel不喜欢这样做,但ePlus不会阻止您这样做。

我的代码已更新。。。并且得到了同样的错误。。。。我终于找到了解决办法

原始代码:

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

成功了

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


希望这能有所帮助。

在我的例子中,问题是我之前没有设置的数据表名

试试这个

dt.TableName = "ExcelSheet1";

我发现这表明您只能对导致您看到的问题的数字使用
Cell.Value
属性。我也遇到了同样的问题,这很容易就解决了!谢谢你的帮助!有了这个问题,我按照这个解决方案为我的银行工作!摆脱Save()就解决了这个问题
return File(file, "application/octet-stream", fileName);
dt.TableName = "ExcelSheet1";