2011-04-21 8 views
0

몇 가지 조언을 찾고 있습니다. 다른 사람들이 쓴 C# 프로젝트의 추가 기능을 구축 중입니다. 프로젝트의 솔루션은 몇 개의 클래스 라이브러리가있는 MVC 웹 애플리케이션으로 구성됩니다.C# 클래스 라이브러리의 Excel 파일 다운로드

내가보고있는 것은 판매보고 기능입니다. 원래 빌드에서는 판매 보고서 요약이 웹 응용 프로그램에서 생성되었습니다. 사용자가 판매 보고서를 생성하면 Reporting 클래스가 C# 클래스 라이브러리 중 하나에서 호출됩니다. 사용자가 라디오 버튼을 선택하면 판매 보고서를 Excel 파일로 다운로드 할 수 있도록 노력하고 있습니다.

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; 
     } 

당신이 볼 수 그래서, reportRequest.Download == true의 경우, 클래스가 엑셀 파일을 만드는 과정을 시작합니다 : 여기

는보고 클래스 코드의 조각이다. 모든 GetAdminSales 함수는 linq 쿼리를 사용하여 웹 페이지에 표시되는 판매를 분류합니다.

그래서 나는 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" 
    }; 
} 

및 엑셀 시트를 포맷, 나는 NPOI 라이브러리를 사용하고, 내 포맷터 클래스과 같이 배치되어

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; 

     } 

앞에서와 마찬가지로 GetAdminSales (GetAdminProductSales 등)는 클래스 맨 아래에 포함되며 데이터를 수집하기위한 linq 쿼리 일뿐입니다.

그래서 이것을 실행할 때 명백한 오류가 발생하지 않습니다. 요약 판매 보고서는 정상적으로 화면에 표시되지만 Excel 문서를 다운로드하지 않아도됩니다. 내가 뭘했는지, 어떤 파일을 다운로드하기 위해 System.Web.Mvc dll을 참조했다. (필자는 다른 방법으로는하지 않았다. 그리고 그물을 읽은 후에 클래스 라이브러리에서 사용할 수있는 인상을 받았습니다.)

무슨 일이 일어나고 있는지 더 자세히 파악하기 위해 코드를 디버깅 할 때 모든 것이 정상적으로 작동하는 것처럼 보이지만 모든 올바른 데이터가 캡처되지만 바로 그 것을 처음 발견했습니다. MemoryStream ms = 새 메모리 스트림 내 포맷터 클래스의 선언 라인이 (매우 숨겨진 마음 당신)를 보여줍니다 '. ((System.IO.Stream) (MS)) ReadTimeout'

ReadTimeout을 유형 의 예외가 발생했습니다 'System.InvalidOperationException 'int {System.InvalidOperationException}

+ { "시간 초과가 지원되지 않습니다. 이 스트림에 테드. "} System.SystemException {System.InvalidOperationException}

내가 'WriteTimeout'에 대해 동일한를 얻을 수 ... explaination의 긴 windedness에 대한

죄송합니다. 누군가가 올바른 방향으로 나를 가리킬 수 있다면, 현재의 이슈를 해결하거나이 일을 대신 할 수있는 방법을 고맙게 생각합니다.

답변

2

세부 사항에서 수렁에 빠져들지 않고 명백한 오류는 GenerateCustomisedSalesFile에서 MemoryStream ms를 만들고 아무 것도하지 않고 반환한다는 것입니다.

+0

안녕하세요, Tim은 나에게 뭔가를 남기고 있음을 알고있었습니다. 나는 return ms 전에 다음을 추가하려고했다. - templateWorkbook.Write (ms); 및 ms.위치 = 0; 내 기억을 조깅 해 줘서 고마워! 그러나이 InvalidOperationException 여전히 점점 해요 추가했습니다. 더 이상 생각해? – 109221793

관련 문제