2013-09-06 3 views
6

스프링 컨트롤러가있어서 Excel 파일을 만들어서 브라우저에서 다운로드하도록 반환하고 싶습니다.Excel에서 다운로드 할 수있는 파일을 Spring에서 반환하십시오.

저는 JEXcelApi를 사용하고 있습니다.

이 내 컨트롤러 코드 내가 그렇게 어떻게

@RequestMapping(value="/excel/cols/{colString}/rows/{rowString}/", method = RequestMethod.GET) 
@ResponseBody 
public ResponseEntity<String> exportExcel(HttpServletResponse response, 
    @PathVariable List<String> colString, 
    @PathVariable List<String> rowString) throws JSONException, IOException, WriteException { 
    WritableWorkbook workbook = Workbook.createWorkbook(new File("exported.xls")); 
    WritableSheet sheet = workbook.createSheet("Exported",0); 
    String[] cols = colString.get(0).split(","); 
    String[] rows = rowString.get(0).split(","); 
    for(int i = 0; i < cols.length;i++){ 
     Label label = new Label(i,0, cols[i]); 
     sheet.addCell(label); 
    } 
    int excelCol = 0; 
    int excelRow = 1; 
    for(int i = 0; i < rows.length;i++){ 
     Label label = new Label(excelCol,excelRow, rows[i]); 
     sheet.addCell(label); 
     excelCol++; 
     if((i+1) % cols.length == 0){ 
      excelCol = 0; 
      excelRow++; 
     } 
    } 
    workbook.write(); 
    workbook.close(); 
    return null; 
} 

입니까? 내가 설정할 수있는 콘텐츠 헤더가있는 것 같습니다. 한 가지 방법은 Spring의 추상 Excel보기 클래스를 사용하는 것이지만 더 간단한 방법이 있습니까?

답변

8

Content-Disposition 헤더를 설정해야합니다.

response.setHeader("Content-disposition","attachment; filename=" + yourFileName); 

OutputStream에 직접 바이트를 기록하십시오. 위의

File xls = new File("exported.xls"); // or whatever your file is 
FileInputStream in = new FileInputStream(xls); 
OutputStream out = response.getOutputStream(); 

byte[] buffer= new byte[8192]; // use bigger if you want 
int length = 0; 

while ((length = in.read(buffer)) > 0){ 
    out.write(buffer, 0, length); 
} 
in.close(); 
out.close(); 

은 상대적으로 오래되었습니다. ResponseEntityFileSystemResource으로 만들 수 있습니다. ResourceHttpMessageConverter은 위에서 제안한 것처럼 바이트를 복사합니다. Spring MVC는 Servlet 사양의 인터페이스와 상호 작용하는 것이 아니라 사용자를 위해 더 간단하게 만듭니다.

+0

어떻게 바이트를 씁니까? – praks5432

+0

@ praks5432 파일에서 바이트를 읽고 응답 출력 스트림에 씁니다. –

+0

그래서 통합 문서 개체에서 수행 될 것입니까? – praks5432

관련 문제