2016-12-20 1 views
1

J'essaie d'avoir un site Web exporter un fichier .xlsm et je n'arrive pas à trouver quelque chose qui aide. Voici un exemple simple que j'utilise pour tester la construction d'un fichier .xlsx (qui fonctionne).Utilisez epplus pour créer un fichier .xlsm

@using OfficeOpenXml; 
<html> 
    <body> 
     <div id="page-wrapper"> 
     @{ 
      // Change file extension to xlsm to test 
      string fileExtension = "xlsm"; 
      ExcelPackage p = new ExcelPackage(); 
      p.Workbook.Worksheets.Add("Worksheet Name"); 
      int LatestWorksheetNumber = p.Workbook.Worksheets.Count; 
      ExcelWorksheet ws = p.Workbook.Worksheets[LatestWorksheetNumber]; 

      ws.Cells[1, 1].Value = "Test"; 

      //Generate A File 
      Byte[] bin = p.GetAsByteArray(); 
      string filename = "filename"; 
      try 
      { 
       //Download the file as an attachment 
       Response.Clear(); 
       Response.ClearContent(); 
       Response.ClearHeaders(); 
       Response.Cookies.Clear(); 

       string ContentType = ""; 
       if (fileExtension == "xlsx") 
       { 
        ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
       } 
       else 
       { 
        ContentType = "application/vnd.ms-excel.sheet.macroEnabled.12"; 
       } 
       Response.GetType(); 
       Response.ContentType = ContentType; 
       Response.AddHeader("content-disposition", "attachment; filename=" + filename + "." + fileExtension); 
       Response.BinaryWrite(bin); 
       Response.End(); 
       <p>File Created</p> 
      } 
      catch (Exception e) 
      { 
       <p>@e.Message</p> 
      } 

     } 
    </div> 
</body> 
</html> 

Après avoir modifié l'extension de fichier à .xlsm le fichier est généré, mais lorsque je tente d'ouvrir le fichier dans Excel j'obtenir une erreur indiquant que l'extension est correcte. Je pensais que la seule chose que je devrais changer serait l'en-tête de type de contenu, mais ce n'est évidemment pas le problème. Quoi d'autre ai-je manqué ??? Toute orientation serait appréciée!

+2

Avez-vous regardé le (https://github.com/pruiz/EPPlus/blob/master/SampleApp/Sample15.cs) [échantillon]? –

+1

Peut-être que vous avez oublié de créer un projet VBA avec 'p.Workbook.CreateVBAProject'. – Xiaoy312

+0

Dan, merci pour le lien. Je n'avais pas vu cet échantillon auparavant et je le mettrai définitivement en signet pour aider avec des questions futures. La suggestion de Xiaoy312 a résolu mon problème, cependant. Merci à vous deux! – Michael

Répondre

1

Xiaoy312 a résolu le problème! Ajouter p.Workbook.CreateVBAProject(); avant Byte[] bin = p.GetAsByteArray(); a résolu mon problème! Tout le reste est resté le même mais Excel va ouvrir les fichiers maintenant! Voici mon code final pour toute personne qui a la même question:

@using OfficeOpenXml; 
<html> 
    <body> 
     <div id="page-wrapper"> 
      @{ 
       // Change file extension to xlsm to test 
       string FileExtension = "xlsm"; 
       ExcelPackage p = new ExcelPackage(); 
       p.Workbook.Worksheets.Add("Worksheet Name"); 
       int LatestWorksheetNumber = p.Workbook.Worksheets.Count; 
       ExcelWorksheet ws = p.Workbook.Worksheets[LatestWorksheetNumber]; 
      ws.Cells[1, 1].Value = "Test"; 

      p.Workbook.CreateVBAProject(); 

      //Generate A File 
      Byte[] bin = p.GetAsByteArray(); 
      string filename = "filename"; 
      try 
      { 
       //Download the file as an attachment 
       Response.Clear(); 
       Response.ClearContent(); 
       Response.ClearHeaders(); 
       Response.Cookies.Clear(); 

       string ContentType = ""; 
       if (FileExtension == "xlsx") 
       { 
        ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
       } 
       else 
       { 
        ContentType = "application/vnd.ms-excel.sheet.macroEnabled.12"; 
       } 
       Response.GetType(); 
       Response.ContentType = ContentType; 
       Response.AddHeader("content-disposition", "attachment; filename=" + filename + "." + FileExtension); 
       Response.BinaryWrite(bin); 
       Response.End(); 
       <p>File Created</p> 
      } 
      catch (Exception e) 
      { 
       <p>@e.Message</p> 
      } 
     } 
    </div> 
</body> 
</html>