#c# #excel #epplus #zipfile #dotnetzip
#c# #excel #epplus #zip #dotnetzip
Вопрос:
Мне нужно экспортировать несколько Excel, содержащих данные из базы данных. Для этого я использую EPPLUS. Поскольку я не могу вернуть несколько файлов из ActionResult, я должен заархивировать файлы Excel, а затем вернуть этот ZIP-файл. Я успешно заархивировал его и загрузил zip-файл, но когда я пытаюсь открыть любой файл Excel в zip-файле, он сообщает, что мой файл 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)
{
}
}
Комментарии:
1. Вы должны выйти
zip.Save(memoryStream)
за пределыforeach
цикла; непосредственно перед оператором return.2. Именно в этом и заключалась проблема!! Теперь все работает нормально 🙂
3. Разместил мои комментарии в качестве ответа
Ответ №1:
Проблема с вашим кодом в строке zip.Save(memoryStream);
, которая сохраняется в каждом файле.
Перемещение этой строки перед оператором return приведет к созданию одного zip-файла, содержащего все файлы. Преобразуйте следующим образом.
zip.Save(memoryStream);
return File(memoryStream.ToArray(), System.Net.Mime.MediaTypeNames.Application.Zip, "report.zip");