2017-10-08 3 views
0

NPOI, angular2 및 web API를 사용하여 데이터 테이블에서 데이터를 내보내려고합니다. 내가 따르는 단계는 다음과 같다. 1. 데이터 테이블의 데이터를 XLSX에 쓰고 서버에 임시로 파일을 저장한다. 2. 이것을 메모리 스트림으로 읽어 들여 반환한다. 그 브라우저가 사용자에게 파일을 다운로드하라는 메시지를 표시하면 파일이 다운로드되면 파일이 손상되었다는 오류 메시지가 나타납니다. 그러나 1 단계 이후에 파일을 열면 파일이 완벽하게 열리 며 파일 탐색기를 통해 다운로드 한 후 파일을 열면 정상적으로 작동합니다. 다운로드 후 브라우저에서 파일을 열 때 왜 이런 일이 발생하는지 이해할 수 있도록 도와 주시겠습니까?NPOI Excel 파일 다운로드가 손상됨

웹 API 코드 :

public HttpResponseMessage ExportReport(ReportPostModel ReportModel) 
      { 
       try 
       { 
        var dt = _IReportRepositoryObj.ExportToExcel(ReportModel.CommentsToExport, ReportModel.SelectedColumns); 
        var headers = dt.Columns.Cast<DataColumn>().Select(x => x.ColumnName).ToArray(); 
        ICellStyle cellStyle; 
        XSSFWorkbook workbook = new XSSFWorkbook(); 
        cellStyle = workbook.CreateCellStyle(); 
        XSSFFont hFont = (XSSFFont)workbook.CreateFont(); 
        hFont.FontHeightInPoints = 12; 
        hFont.FontName = "Arial"; 

        hFont.Boldweight = (short)NPOI.SS.UserModel.FontBoldWeight.Bold; 
        cellStyle.SetFont(hFont); 

        var sheet = workbook.CreateSheet("sheet1"); 

        var headerRow = sheet.CreateRow(0); 

        //Create header row 
        for (int i = 0; i < headers.Length; i++) 
        { 
         ICell cell = headerRow.CreateCell(i); 
         cell.SetCellValue(headers[i].ToString()); 
        } 

        //dump data into the excel 
        for (int i = 0; i < dt.Rows.Count; i++) 
        { 
         IRow row = sheet.CreateRow(i + 1); 
         for (int j = 0; j < dt.Columns.Count; j++) 
         { 
          ICell cell = row.CreateCell(j); 
          cell.SetCellValue(dt.Rows[i][headers[j]].ToString()); 
         } 
        } 
        string fileName = "temp" + DateTime.Now.ToString("yyyyMMddHHmmssfff")+ ".xlsx"; 
        string filePath = System.Web.HttpContext.Current.Server.MapPath("~/Temp/"); 
        filePath += fileName; 

        using (FileStream FWriteStream = new FileStream(filePath, FileMode.Create, FileAccess.Write)) 
        { 
         workbook.Write(FWriteStream); 
        } 

        //write excel into memory stream 
        using (var exportData = new MemoryStream()) 
        { 
         using (FileStream FreadStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) 
         { 
          byte[] bytes = new byte[FreadStream.Length]; 
          FreadStream.Read(bytes, 0, (int)FreadStream.Length); 

          FreadStream.Seek(0, SeekOrigin.Begin); 
          exportData.Write(bytes, 0, (int)FreadStream.Length); 


          HttpResponseMessage message = new HttpResponseMessage(); 
          message.Content = new ByteArrayContent(bytes.ToArray()); 
          message.Content.Headers.Add("x-filename", "temp.xlsx"); 
          message.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
          message.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); 
          message.Content.Headers.ContentDisposition.FileName = "temp.xlsx"; 
          message.StatusCode = HttpStatusCode.OK; 
          return message; 
         } 
        } 
       } 
       catch (Exception ex) 
       { 
        throw ex; 
       } 

      } 

angular service code: 

    ExportReport(CommentSpecificationModel: any, SelectedColumns: any) { 
      return Observable.create((observer: any) => { 
       debugger; 
       let req = new XMLHttpRequest(); 
       req.open('POST', apiBaseUrl ; 
       let ReportModel = { 
        "CommentsToExport" : CommentSpecificationModel, 
        "SelectedColumns" : SelectedColumns 
       } 


       req.setRequestHeader("Content-Type", "application/json"); 
       req.withCredentials = true; 
       req.responseType = "blob"; 
       req.onreadystatechange = function() { 
        if (req.readyState == 4 && req.status == 200) { 
         debugger; 
         var contentType = req.getResponseHeader("content-type"); 
         var blob = new Blob([req.response], { type: contentType }); 
         observer.next(blob); 
         observer.complete(); 
        } 
       }; 
       req.send(JSON.stringify(ReportModel)); 
      }); 
     } 

각도 구성 요소 코드 :

ExportDatatoExcel() { 
     debugger; 
     this.reportService.ExportSpecificationCommentReport(this.SpecificationCommentsModel, this.SelectedColumns). 
      subscribe((data: any) => { 
       debugger; 
       var link = document.createElement('a'); 
       link.href = window.URL.createObjectURL(data); 
       link.download = "Export.xlsx"; 
       link.click(); 
      } 
      ); 
    } 

편집 : 내가 사용하고있는 코드에서 아무 문제가없는 것을 볼

, 문제는 mcAfee 엔드 포인트 보안이 크롬에 설치되었습니다. 내 다운로드를 보안 소프트웨어와 호환되게하려면 어떻게합니까?

답변

1

주위를 파고 들자 마자 크롬에 Mcaffee 플러그인을 사용하지 않도록 설정하여 Excel을 다운로드 할 수있었습니다.