2017-10-26 3 views
1

빈 시트를 만드는이 컨트롤러가있어서 탐색기로 Excel 파일을 반환하고 싶습니다. 문제는 Excel 파일이 손상되었음을 나타냅니다.봄 - POI로 Excel 다운로드

내 컴퓨터에서 파일을 만들면 파일이 손상되지 않으므로 내 HSSFWorkbook이 유효합니다. 봄 문맥에 의해 추가 된 encodage/encapsulation의 문제가 보입니까?

@Controller 
public class ExportController { 

@RequestMapping(value = "/export/test/excel", method = RequestMethod.POST) 
public void downloadExcelTestFile(
     HttpServletRequest request, 
     HttpServletResponse response) throws IOException { 

    HSSFWorkbook wb = new HSSFWorkbook(); 

    wb.createSheet("Sheet1"); 

    //response.reset(); 
    //response.setStatus(HttpServletResponse.SC_OK); 
    response.setContentType("application/vnd.ms-excel"); 
    response.setHeader("Content-Disposition", "attachment; filename=test.xls"); 

    OutputStream out = response.getOutputStream(); 
    wb.write(out); 

    out.flush(); 
    out.close(); 
    wb.close(); 
} 

다운로드가 잘 시작되고 파일 test.xls가 표시되지만 열 수 없습니다. @Controller 내부에서 적절한 다운로드를 달성하기위한 Spring 방법이 있습니까?

나는 봄의 방법을 시도 4.2.4

UPDATE 1

봄을 사용하지만 그것은 작동하지 않습니다 더 나은

HSSFWorkbook wb = new HSSFWorkbook(); 

    wb.createSheet("Sheet1"); 

    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

    try { 
     wb.write(bos); 
    } finally { 
     bos.close(); 
    } 

    byte[] bytes = bos.toByteArray(); 

    HttpHeaders headers = new HttpHeaders(); 

    headers.set("Content-Type", "application/vnd.ms-excel;"); 
    headers.set("content-length",Integer.toString(bytes.length)); 
    headers.set("Content-Disposition", "attachment; filename=test.xls"); 

    return new ResponseEntity<byte[]>(bytes, headers, HttpStatus.CREATED); 

UPDATE 3

내가 발견 이유는 모르겠지만 그 이유는 모르겠다.

war 파일을 빌드하고 동일한 tomcat 7.0.70에 수동으로 배포하면 작동합니다. 내 Excel이 손상되지 않았습니다.

이클립스에서 dev environnement에서 다운로드하면 작동하지 않습니다. 바람둥이 + 일식 문제가 보입니다.

+0

파일을 입력으로 사용하는 org.springframework.core.io.FileSystemResource를 반환 할 수 있습니다. – mrkernelpanic

답변

0

그건 봄 문제가 아니고 바람둥이 문제도 아닙니다.

내 앞잡이 localhost : 9000을 다운로드하면 문제가 생겼습니다. 다운로드 한 파일이 손상되었습니다. war 파일에서 프로젝트를 빌드하거나 localhost : 8080 (서버와 동일한 포트)에서 "grunt serve"없이 프론트를 실행하면 프록시없이 작동합니다.

나는 꿀꺽 꿀꺽 거리며 문제를 해결하지 못했다 ... 나는 단지 그것을 무시하지만,이 대답은 시간을 절약 할 수있다.