打开用EPPlus生成的excel文件时显示的错误对话框
本文关键字:文件 显示 错误 对话框 excel EPPlus | 更新日期: 2023-09-27 18:21:10
我正在使用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();
在我的案例中,问题在于调用
package.Save();
并使用
Response.BinaryWrite(package.GetAsByteArray());
同时。
当你们叫包裹的时候。GetAsByteArray()在内部执行以下操作:
this.Workbook.Save();
this._package.Close();
this._package.Save(this._stream);
所以,呼叫包裹。在Excel中打开时,保存两次会导致此错误。
我将分享我的解决方案。我正在使用一个模板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");
在我的案例中,问题是我之前没有设置的数据表名称。
试试这个,
dt.TableName = "ExcelSheet1";
我遇到这个问题是因为我在一个单元格中写入了一个大于32767个字符的字符串。Excel不喜欢这样,但EPPlus不会阻止你这样做。
我的代码已经更新。。。得到了同样的错误。。。。我终于找到了我的解决方案
原始代码:
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());
}
}
成功了!
我提出的一个解决方案只是返回控制器中的文件对象。第一个参数应该是字节数组(文件),第二个参数是内容类型,最后一个参数是文件名(在我的例子中是"report.xlsx")
return File(file, "application/octet-stream", fileName);
希望这能有所帮助。