Excel 文件在使用 EPPLUS 生成多个 excel 文件并使用 C# 中的 ActionResult 使用 DotNetZip 压缩后损坏
Excel file is corrupted after generating multiple excel files using EPPLUS and Zipped using DotNetZip from an ActionResult in C#
我需要导出多个 excel 包含来自数据库的数据。我正在使用 EPPLUS 来做到这一点。因为我不能从一个 ActionResult 中 return 多个文件,所以我必须压缩 excel 个文件,然后 return 该 ZIP 文件。我已经成功压缩并下载了 zip 文件,但是当我尝试打开 zip 文件中的任何 excel 文件时,它说我的 excel 文件已损坏。如果 zip 文件中只有一个 excel 文件,它可以正常工作。
这是我的代码-
public ActionResult ExportExcel()
{
try
{
projects="project1,project2";
var memoryStream = new MemoryStream();
var zip = new ZipFile();
var arrProject = projects.Split(',');
foreach (var pro in arrProject)
{
var v = GetProjectData(pro);//method to get data from database
//Construct DataTable
var dt = new DataTable();
dt.Columns.Add("Model", typeof(string));
dt.Columns.Add("Color", typeof(string));
dt.Columns.Add("BarCode", typeof(long));
dt.Columns.Add("BarCode2", typeof(long));
//Load data to DataTable
foreach (var item in v)
{
var row = dt.NewRow();
row["Model"] = item.Model;
row["Color"] = item.Color;
row["BarCode"] = Int64.Parse(item.BarCode);
row["BarCode2"] = Int64.Parse(item.BarCode2);
dt.Rows.Add(row);
}
//transfer data from DataTable to worksheet
using (var package = new ExcelPackage())
{
var worksheet = package.Workbook.Worksheets.Add("IMEI");
worksheet.Cells["A1"].LoadFromDataTable(dt, PrintHeaders: true);
for (var col = 1; col < dt.Columns.Count + 1; col++)
{
worksheet.Column(col).AutoFit();
}
zip.AddEntry(pro + ".xlsx", package.GetAsByteArray());
zip.Save(memoryStream);
}
}
return File(memoryStream.ToArray(), System.Net.Mime.MediaTypeNames.Application.Zip, "report.zip");
}
catch (Exception ex)
{
}
}
第 zip.Save(memoryStream);
行的代码存在问题,该代码正在保存到每个文件中。
将该行移到 return 语句之前,将生成一个包含所有文件的 zip 文件。
转换为如下。
zip.Save(memoryStream);
return File(memoryStream.ToArray(), System.Net.Mime.MediaTypeNames.Application.Zip, "report.zip");
我需要导出多个 excel 包含来自数据库的数据。我正在使用 EPPLUS 来做到这一点。因为我不能从一个 ActionResult 中 return 多个文件,所以我必须压缩 excel 个文件,然后 return 该 ZIP 文件。我已经成功压缩并下载了 zip 文件,但是当我尝试打开 zip 文件中的任何 excel 文件时,它说我的 excel 文件已损坏。如果 zip 文件中只有一个 excel 文件,它可以正常工作。
这是我的代码-
public ActionResult ExportExcel()
{
try
{
projects="project1,project2";
var memoryStream = new MemoryStream();
var zip = new ZipFile();
var arrProject = projects.Split(',');
foreach (var pro in arrProject)
{
var v = GetProjectData(pro);//method to get data from database
//Construct DataTable
var dt = new DataTable();
dt.Columns.Add("Model", typeof(string));
dt.Columns.Add("Color", typeof(string));
dt.Columns.Add("BarCode", typeof(long));
dt.Columns.Add("BarCode2", typeof(long));
//Load data to DataTable
foreach (var item in v)
{
var row = dt.NewRow();
row["Model"] = item.Model;
row["Color"] = item.Color;
row["BarCode"] = Int64.Parse(item.BarCode);
row["BarCode2"] = Int64.Parse(item.BarCode2);
dt.Rows.Add(row);
}
//transfer data from DataTable to worksheet
using (var package = new ExcelPackage())
{
var worksheet = package.Workbook.Worksheets.Add("IMEI");
worksheet.Cells["A1"].LoadFromDataTable(dt, PrintHeaders: true);
for (var col = 1; col < dt.Columns.Count + 1; col++)
{
worksheet.Column(col).AutoFit();
}
zip.AddEntry(pro + ".xlsx", package.GetAsByteArray());
zip.Save(memoryStream);
}
}
return File(memoryStream.ToArray(), System.Net.Mime.MediaTypeNames.Application.Zip, "report.zip");
}
catch (Exception ex)
{
}
}
第 zip.Save(memoryStream);
行的代码存在问题,该代码正在保存到每个文件中。
将该行移到 return 语句之前,将生成一个包含所有文件的 zip 文件。 转换为如下。
zip.Save(memoryStream);
return File(memoryStream.ToArray(), System.Net.Mime.MediaTypeNames.Application.Zip, "report.zip");