Файл Excel поврежден после создания нескольких файлов Excel с помощью EPPLUS и архивирования с помощью DotNetZip из ActionResult в C#

#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");