2011-04-21 2 views
0

Je suis à la recherche de conseils. Je construis sur une fonctionnalité supplémentaire à un projet C# que quelqu'un d'autre a écrit. La solution du projet consiste en une application web MVC, avec quelques bibliothèques de classes.C# Fichiers Excel téléchargeables de la bibliothèque de classes

Ce que je suis en train d'éditer, c'est la fonction de reporting des ventes. Dans la version d'origine, un résumé des rapports de vente a été généré sur l'application Web. Lorsque l'utilisateur génère le rapport sur les ventes, une classe Reporting est appelée dans l'une des bibliothèques de classes C#. J'essaie de rendre les rapports de ventes téléchargeables dans un fichier Excel lorsque l'utilisateur sélectionne un bouton radio.

Voici un extrait de code de la classe de rapports:

public AdminSalesReport GetCompleteAdminSalesReport(AdminSalesReportRequest reportRequest) 
     { 
      AdminSalesReport report = new AdminSalesReport(); 
      string dateRange = null; 
      List<ProductSale> productSales = GetFilteredListOfAdminProductSales(reportRequest, out dateRange); 

      report.DateRange = dateRange; 

      if (titleSales.Count > 0) 
      { 
       report.HasData = true; 

       report.Total = GetTotalAdminSales(productSales); 

       if (reportRequest.Type == AdminSalesReportRequest.AdminSalesReportType.Complete) 
       { 
        report.ProductSales = GetAdminProductSales(productSales); 

        report.CustomerSales = GetAdminCustomerSales(productSales); 

        report.ManufacturerSales = GetAdminManufacturerSales(productSales); 

        if (reportRequest.Download) 
        { 
         FileResult ExcelDownload = GetExcelDownload(productSales); 
        } 

       } 
      } 

      return report; 
     } 

Comme vous pouvez le voir, si reportRequest.Download == true, la classe devrait commencer le processus de création du fichier Excel. Toutes les fonctions GetAdminSales utilisent les requêtes linq pour trier les ventes si elles sont affichées sur la page Web.

J'ai donc ajouté ce ainsi que les fonctions GetAdminSales:

private FileResult GetExcelDownload(List<TitleSale> titleSales) 
{ 
    CustomisedSalesReport CustSalesRep = new CustomisedSalesReport(); 

    Stream SalesReport = CustSalesRep.GenerateCustomisedSalesStream(productSales); 

    return new FileStreamResult(SalesReport, "application/ms-excel") 
    { 
     FileDownloadName = "SalesReport" + DateTime.Now.ToString("MMMM d, yyy") + ".xls" 
    }; 
} 

et formater la feuille Excel, j'utilise la bibliothèque NPOI, et ma classe formatter est disposé comme si:

public class CustomisedSalesReport 
    { 
     public Stream GenerateCustomisedSalesStream(List<ProductSale> productSales) 
     { 
      return GenerateCustomisedSalesFile(productSales); 
     } 

     private Stream GenerateCustomisedSalesFile(List<ProductSale> productSales) 
     { 
      MemoryStream ms = new MemoryStream(); 
      HSSFWorkbook templateWorkbook = new HSSFWorkbook(); 

      HSSFSheet sheet = templateWorkbook.CreateSheet("Sales Report"); 

      HSSFRow dataRow = sheet.CreateRow(0); 
      HSSFCell cell = dataRow.CreateCell(0); 

      cell = dataRow.CreateCell(0); 
      cell.SetCellValue(DateTime.Now.ToString("MMMM yyyy") + " Sales Report"); 

      dataRow = sheet.CreateRow(2); 

      string[] colHeaders = new string[] { 
       "Product Code", 
       "Product Name", 
       "Qty Sold", 
       "Earnings", 
      }; 

      int colPosition = 0; 

      foreach (string colHeader in colHeaders) 
      { 
       cell = dataRow.CreateCell(colPosition++); 
       cell.SetCellValue(colHeader); 
      } 

      int row = 4; 

      var adminTotalSales = GetAdminProductSales(productSales); 


      foreach (SummaryAdminProductSale t in adminTotalSales) 
      { 
       dataRow = sheet.CreateRow(row++); 
       colPosition = 0; 

       cell = dataRow.CreateCell(colPosition++); 
       cell.SetCellValue(t.ProductCode); 

       cell = dataRow.CreateCell(colPosition++); 
       cell.SetCellValue(t.ProductName); 

       cell = dataRow.CreateCell(colPosition++); 
       cell.SetCellValue(t.QtySold); 

       cell = dataRow.CreateCell(colPosition++); 
       cell.SetCellValue(t.Total.ToString("0.00")); 
      } 

      } 
     templateWorkbook.Write(ms); 
     ms.Position = 0; 

      return ms; 

     } 

Comme précédemment, les GetAdminSales (GetAdminProductSales, etc.) sont contenues dans le bas de la classe et ne sont que des requêtes linq pour rassembler les données. Donc quand j'exécute ça, je n'ai pas d'erreurs évidentes. Le rapport de vente récapitulatif apparaît à l'écran comme d'habitude, mais aucun téléchargement de documents Excel. Ce que j'ai fait, ce qui est peut-être en train de mettre ça dans ma bibliothèque de classe, j'ai référé la DLL System.Web.Mvc pour télécharger le fichier (je ne l'ai pas fait autrement - et après avoir lu sur le net J'ai eu l'impression que je pouvais l'utiliser dans une bibliothèque de classe).

Lorsque je débogue à travers le code pour obtenir une image plus précise de ce qui se passe, tout semble bien fonctionner, toutes les bonnes données sont capturées mais je l'ai trouvé dès le début - MemoryStream ms = new Memory Stream ligne de déclaration dans ma classe formatter montre cette (esprit très caché vous):. ((System.IO.Stream) (ms)) ReadTimeout '

de ReadTimeout a jeté une exception de type « System.InvalidOperationException 'int {System.InvalidOperationException}

+ {"Les délais d'attente ne sont pas pris en charge ted sur ce flux. "} {System.SystemException System.InvalidOperationException}

je reçois la même chose pour 'WriteTimeout' ...

Toutes mes excuses pour le long windedness du explaination. Je serais reconnaissant si quelqu'un pouvait me diriger dans la bonne direction, soit pour résoudre mon problème actuel, ou une autre façon de faire ce travail.

Répondre

2

Sans s'embourber dans les détails, l'erreur évidente est que dans GenerateCustomisedSalesFile vous créez un MemoryStream ms, ne faites rien avec lui, puis renvoyez-le.

+0

Bonjour Tim, je savais que j'avais oublié quelque chose. Je voulais ajouter ce qui suit avant de retourner ms; - templateWorkbook.Write (ms); et ms.Position = 0; Merci de faire du jogging dans ma mémoire! Après avoir ajouté ceci cependant je reçois toujours la même InvalidOperationException. Plus de pensées? – 109221793

Questions connexes