본문 바로가기

개발중/troubleshooting

java.io.IOException: Cannot write data, document seems to have been closed already 에러

728x90
반응형

액셀 로딩바를 해결했는데

이건 또 뭐람

https://soobindeveloper8.tistory.com/390

위에서처럼 제대로 할 일을 해주는데 에러는 왜 뜨는 것일까


java.io.IOException: Cannot write data, document seems to have been closed already

데이터를 쓸 수 없습니다. 문서가 이미 닫혀 있는 것 같습니다.


블로그 삽질

검색어 : getOutputStream Cannot write data, document seems to have been closed already

 

아래에서 해결 !

입출력 닫는 다양한 예제

 

아래 처럼 바꾸고 성공 !

@Override
protected void buildExcelDocument( Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response)   {

	createExcel(workbook, model); 
    
	response.setContentType("ms-vnd/excel");
	response.setHeader("Content-Disposition", "attachment;filename=example.xlsx");
	
	try {
		
		ServletOutputStream out = response.getOutputStream();
		workbook.write(out);
		out.flush();
		
	} catch (IOException e) {
		e.printStackTrace();
	}  
}

 

원래는 한 줄로 끝내려 들었는데

workbook.write(response.getOutputStream());

 

getOutputStream 을 깊숙히 들어가보니까 

  1. ServletOutputStream 그릇에 responce 의 getOutputStream 을 담고
  2. workbook 에 쓰고
  3. ServletOutputStream 그릇을 다썼으니까 씻어서 정리한다는 의미로 닫아줘야 한다.

내 순서는 너무 뒤죽박죽이었다.


변경전

더보기
workbook.write(response.getOutputStream());
workbook.close();

변경후

더보기
ServletOutputStream out = response.getOutputStream();
workbook.write(out);
out.flush();

 

728x90
반응형