2016-11-09 2 views
1

Je dois construire une méthode, qui recevra le modèle, construire excel à partir de lui (construction et réception partie est faite sans problèmes), puis exporter (laisser l'utilisateur le télécharger) en utilisant la mémoire flux (sans l'enregistrer sur le serveur). Je suis nouveau à ASP.NET et MVC donc j'ai trouvé Guide et construit ce projet comme un tutoriel:C# Asp.NET MVC téléchargement fichier Excel en utilisant FileStreamResult

public FileResult Download() 
    { 
     Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 

     Microsoft.Office.Interop.Excel.Workbook xlWorkBook; 
     Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet; 

     object misValue = System.Reflection.Missing.Value; 

     xlWorkBook = xlApp.Workbooks.Add(misValue); 
     xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

     xlWorkSheet.Cells[1, 1] = "ID"; 
     xlWorkSheet.Cells[1, 2] = "Name"; 
     xlWorkSheet.Cells[2, 1] = "1"; 
     xlWorkSheet.Cells[2, 2] = "One"; 
     xlWorkSheet.Cells[3, 1] = "2"; 
     xlWorkSheet.Cells[3, 2] = "Two"; 


     var path = "C:\\Work-Work\\TestFolder\\XCLbuildTry1\\csharp-Excel.xls"; 
     xlWorkBook.SaveAs(path); 
     xlWorkBook.Close(true, misValue, misValue); 
     xlApp.Quit(); 

     Marshal.ReleaseComObject(xlWorkSheet); 
     Marshal.ReleaseComObject(xlWorkBook); 
     Marshal.ReleaseComObject(xlApp); 
     return File(path, "application/vnd.ms-excel", "WidgetData.xlsx"); 
    } 

Maintenant, je dois changer ce code pour rendre cette méthode a envoyé mon fichier Excel sans enregistrer mon fichier Excel sur le serveur . J'ai essayé de google quelques guides et réponses ici, sur la pile, mais pour l'instant je ne peux pas trouver une solution, que je peux mettre en application.

Je pense que je devrais utiliser FileStreamResult, mais tous les guides ne donnent aucune information particulière sur la création et l'insertion de mon fichier dans le flux.

Répondre

5

Malheureusement, il ne semble pas que l'interface Microsoft.Office.Interop.Excel.Workbook (msdn) vous permettra de convertir votre classeur en flux de mémoire.

Cependant, dans le passé, j'ai utilisé une bibliothèque externe, EPPlus, qui a fonctionné de manière fantastique.

Voir ci-dessous pour le code utilisant EPPlus qui ne nécessite pas de sauvegarder le fichier sur le serveur.


BusinessLogic

public MemoryStream Download() { 
    MemoryStream memStream; 

    using (var package = new ExcelPackage()) { 
     var worksheet = package.Workbook.Worksheets.Add("New Sheet"); 

     worksheet.Cells[1, 1].Value = "ID"; 
     worksheet.Cells[1, 2].Value = "Name"; 
     worksheet.Cells[2, 1].Value = "1"; 
     worksheet.Cells[2, 2].Value = "One"; 
     worksheet.Cells[3, 1].Value = "2"; 
     worksheet.Cells[3, 2].Value = "Two"; 

     memStream = new MemoryStream(package.GetAsByteArray()); 
    } 

    return memStream; 
}  

Contrôleur

public FileStreamResult Download() { 
    var memStream = BusinessLogic.Download(); 
    result File(memStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
} 
+0

On dirait qu'il fonctionne très bien, mais mon 'worksheet' est bloqué par le mode 'lecture seule'. J'ai essayé quelques solutions sur la pile: http://stackoverflow.com/questions/20751808/make-column-or-cells-readonly-with-epplus -> Ne donne aucun résultat du tout, mais aucun avertissement aussi http: //stackoverflow.com/questions/19999531/how-to-create-readonly-excel-sheet-using-c-sharp-net -> Donne un avertissement 'No definition' http://stackoverflow.com/questions/18059979/create-an-excel-file-with-epplus-but-it-is-always-read-only -> Je ne sais pas, comment le navigateur peut faire VS donner des avertissements sur mon code (dernière réponse) – rainbowShiningUnicorn

+0

@rainbowShiningUnicorn feuille en lecture seule ou l'ensemble du classeur est-il lu uniquement lorsqu'il est sauvegardé? – Chawin

+0

La propriété 'Cells' n'a qu'une méthode' get'. – rainbowShiningUnicorn