2017-02-07 4 views
2

Ich habe die folgende Funktion, um eine FileStreamResult für meine ASP.NET MVC-Anwendung zurückgeben.Erstellen ZipArchiv von Excel XLSX-Datei mit EPPLUS C#

Die Funktion gibt etwas zurück, ist aber in einer XML-Split-Mode eher eine XLSX-Datei.

Ich möchte es eine ZIPPED einzelne Datei zurückgeben.

So sieht das aktuelle Ergebnis aus.

ZIP archive structure

die von @kuujinbo gegeben Hilfe verwendet Nachdem ich diese Funktion geschaffen haben. Bitte beachten Sie, dass FileContentResult aus irgendeinem Grund funktioniert und FileStreamResult nicht funktioniert.

 /// <summary> 
     /// Generates a FileStreamResult containing a zip file with the EXCEL file in it 
     /// </summary> 
     /// <typeparam name="T">Type of object in the object list parameter</typeparam> 
     /// <param name="objectList">The object list enumerable. This contains the data for the EXCEL file</param> 
     /// <param name="fileName">The file name of the EXCEL</param> 
     /// <returns>FileStreamResult</returns>   
     public FileContentResult CreateZipFileFileContentResult<T>(IEnumerable<T> objectList, string fileName) 
     { 
      var contentType = System.Net.Mime.MediaTypeNames.Application.Zip; 

      using (var memoryStream = new System.IO.MemoryStream()) 
      { 
       using (Ionic.Zip.ZipFile zip = new Ionic.Zip.ZipFile()) 
       { 
        using (var package = new OfficeOpenXml.ExcelPackage()) 
        { 
         var workSheet1 = package.Workbook.Worksheets.Add("Sheet1"); 
         workSheet1.Cells["A1"].LoadFromCollection<T>(objectList, true); 

         var firstRow = workSheet1.Row(1); 
         if (firstRow != null) 
          firstRow.Style.Font.Bold = true; 

         zip.AddEntry(fileName, package.GetAsByteArray()); 
         zip.Save(memoryStream); 
         var fcr = new FileContentResult(memoryStream.ToArray(), contentType); //NOTE: Using a File Stream Result will not work. 
         fcr.FileDownloadName = fileName + ".zip"; 
         return fcr; 
        } 
       } 
      } 
     } 
+0

sieht aus wie das ist, was es sein soll. xlsx-Dateien sind gezippte opendocument-Strukturen. Ich denke, Ihr Datei-Explorer zeigt nur den ZIP-Inhalt transparent in der Verzeichnishierarchie an (das Symbol in der oberen linken Ecke vorausgesetzt). Wenn Sie .zip in .xlsx umbenennen, können Sie es mit Excel öffnen. – dlatikay

+1

+ du schreibst nie etwas auf 'newEntryStream'? Diese Funktion scheint nur den EPPlus-Ausgabestream (der bereits intern ein ZIP ist und xlsx-Erweiterung haben soll) mit der Erweiterung .zip zurückzugeben. – dlatikay

+0

Es scheint, dass Sie richtig sind. Ich werde mal schauen. –

Antwort

3

Da EPPlus intern eine Version von DotNetZip verwendet, (werfen Sie einen Blick auf den Quellcode) versuchen, und das Gleiche tun. IMHO ihre Design-Entscheidung sagt viel darüber aus, warum einige wählen nichtZipArchive zu verwenden.

class TestObject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

IEnumerable<TestObject> objectList = new List<TestObject>() 
{ 
    { new TestObject() {Id = 0, Name = "zero" } }, 
    { new TestObject() {Id = 1, Name = "one" } } 
}; 
string ExcelName = "test.xlsx"; 
string ZipName = "test.zip"; 

public ActionResult DotnetZip() 
{ 
    using (var stream = new MemoryStream()) 
    { 
     using (ZipFile zip = new ZipFile()) 
     { 
      using (var package = new ExcelPackage()) 
      { 
       var sheet = package.Workbook.Worksheets.Add("Sheet1"); 
       sheet.Cells["A1"].LoadFromCollection<TestObject>(objectList, true); 
       zip.AddEntry(ExcelName, package.GetAsByteArray()); 
       zip.Save(stream); 
       return File(
        stream.ToArray(), 
        System.Net.Mime.MediaTypeNames.Application.Zip, 
        ZipName 
       ); 
      } 
     } 
    } 
} 

Getestet und Arbeiten:

enter image description here

+0

Hallo, ich versuche eine ZIP-Datei zu bekommen, keine EXCEL-Datei. Ich weiß bereits, wie man die EXCEL-Datei bekommt. :) –

+1

@DragosDurlut - Entschuldigung, mein Schlechter. Die Antwort wurde mit einer funktionierenden Lösung aktualisiert. – kuujinbo

+0

verwenden sie eine modifizierte (schnellere) Komprimierung? oder wie könnte ein zweiter Durchgang eine weitere ~ 20% Verpackung bekommen? – dlatikay