액셀 다운로드 - '~~.xlsx' 의 내용에 문제가 있습니다

2021. 5. 13. 10:02·개발중/Java
목차
  1. 근데 나는 삽질 중이었다.
  2. 이거가 필요 없는 코드다!!!!!!!!!!!!!
728x90
반응형


난 아래 처럼 구현 했는데

더보기
package com.rsn.POMS.api.lucy.action.service.excelComponent;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.document.AbstractXlsxView;

import com.rsn.POMS.api.lucy.action.vo.ActionLogVo;

/**
 * @author 정수빈
 * 2021 05 12
 * 
 * Action Log - 키워드 검색 현황
 */
@Component("actionLog.keywordStatus")
public class ActionKeywordStatus extends AbstractXlsxView {

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

		createExcel(workbook, model);

		SimpleDateFormat dateFormat = new SimpleDateFormat( "yyMMdd_HHmm");
		Date time = new Date();
		String date = dateFormat.format(time);
		
		String fileName = "Lucy2.0_ActionKeywordStatus_"+date+".xlsx";
		fileName = URLEncoder.encode(fileName, "UTF-8");
		
		response.setCharacterEncoding("UTF-8");
		response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");

		try {
			ServletOutputStream out = response.getOutputStream();
			workbook.write(out);
			out.flush();

		} catch (IOException e) {
			throw new RuntimeException("IOException / 액셀 파일 생성 실패" + e.getMessage());
		}

	}

	private final String[] Title = new String[] { "No", "검색 기록" };

	private void createExcel(Workbook workbook, Map<String, Object> model) {

		ExcelStyle style = new ExcelStyle();
		
		CellStyle titleStyle = workbook.createCellStyle();
		titleStyle = style.getTitlestyle(titleStyle);

		Map<Integer, List<ActionLogVo>> excelDataMap = (Map<Integer, List<ActionLogVo>>) model.get("excelDataMap");

		String sheetTitle = "";

		for (int key : excelDataMap.keySet()) {

			List<ActionLogVo> excelDataList = excelDataMap.get(key);

			for (ActionLogVo logVo : excelDataList) {
				sheetTitle = "검색로그_" + logVo.getUser_email() + "(" + logVo.getUser_name() + ")";
				break;
			}

			Sheet sheet = workbook.createSheet(key + 1 + ")" + sheetTitle);

			int rowIndex = 0;
			Row row = null;
			Cell cell = null;

			row = sheet.createRow(rowIndex);

			for (int i = 0; i < Title.length; i++) {
				sheet.setColumnWidth(i, 5000);
				cell = row.createCell(i);
				cell.setCellValue(Title[i]);
				cell.setCellStyle(titleStyle);
			}

			for (ActionLogVo logVo : excelDataList) {
				row = sheet.createRow(++rowIndex);

				cell = row.createCell(0);
				cell.setCellValue(rowIndex);

				cell = row.createCell(1);
				cell.setCellValue(logVo.getSearch_data());
			}
		}
	}
}

 

이게 잘못!

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

 

 

out.close();

out 이를 닫아줘야 해

ServletOutputStream out = response.getOutputStream();
workbook.write(out);
out.flush();
out.close();

다영선배 TIP !

여기서 한가지 더, 
아마 flush()를 선언해주고 close()를 선언하는 개발자가 있을것이다.
위 코드를 분석하면서 한가지 알아낸 사실은, 

close() 하나만 선언해도 선언되지않은 flush() 메소드도 실행된다는 것이다.


근데 나는 삽질 중이었다.


삽질 전

@Override
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
	createExcel(workbook, model);
	
	SimpleDateFormat dateFormat = new SimpleDateFormat( "yyMMdd_HHmm");
	Date time = new Date();
	String date = dateFormat.format(time);
	
	String fileName = "Lucy2.0_ActionIpLoginStatus_"+date+".xlsx";
	fileName = URLEncoder.encode(fileName, "UTF-8");
	
	response.setCharacterEncoding("UTF-8");
	response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");
	
	try {
		ServletOutputStream out = response.getOutputStream();
		workbook.write(out);
		out.flush();
		out.close();
	} catch (IOException e) {
		throw new RuntimeException("IOException / 액셀 파일 생성 실패" + e.getMessage());
	} 
	

 

삽질 후

@Override
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
	createExcel(workbook, model);
	
	SimpleDateFormat dateFormat = new SimpleDateFormat( "yyMMdd_HHmm");
	Date time = new Date();
	String date = dateFormat.format(time);
	
	String fileName = "Lucy2.0_ActionIpLoginStatus_"+date+".xlsx";
	fileName = URLEncoder.encode(fileName, "UTF-8");
	
	response.setCharacterEncoding("UTF-8");
	response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");
	
}
	

이거가 필요 없는 코드다!!!!!!!!!!!!!

try {
	ServletOutputStream out = response.getOutputStream();
	workbook.write(out);
	out.flush();
	out.close();
} catch (IOException e) {
	throw new RuntimeException("IOException / 액셀 파일 생성 실패" + e.getMessage());
} 

 

728x90
반응형
저작자표시 (새창열림)

'개발중 > Java' 카테고리의 다른 글

LOMBOK - NoArgsConstructor/AllArgsConstructor 사용  (0) 2021.05.14
액셀 / 액셀 파일 한글 깨져요.  (0) 2021.05.13
lombok / getter setter 대소문자 호환 오류  (0) 2021.05.13
액셀 / AbstractXlsxView - setContentType  (0) 2021.05.13
Excel 로딩바 -AbstractXlsxView  (0) 2021.05.06
  1. 근데 나는 삽질 중이었다.
  2. 이거가 필요 없는 코드다!!!!!!!!!!!!!
'개발중/Java' 카테고리의 다른 글
  • LOMBOK - NoArgsConstructor/AllArgsConstructor 사용
  • 액셀 / 액셀 파일 한글 깨져요.
  • lombok / getter setter 대소문자 호환 오류
  • 액셀 / AbstractXlsxView - setContentType
Binsoo
Binsoo
내 트러블 슈팅
  • Binsoo
    정수빈 기술블로그임.
    Binsoo
  • 전체
    오늘
    어제
    • 빈수 개발자 개발 일기 (930)
      • 개발중 (632)
        • Spring Boot (95)
        • Spring Security (2)
        • Spring Batch (6)
        • Spring Boot & Redis (13)
        • Java Persistence API (JPA) (28)
        • Web (42)
        • Rest Api (7)
        • Spring Concurrency Control (3)
        • Redis (8)
        • Kubernetes (k8s) (4)
        • MYSQL (35)
        • AirFlow (15)
        • Docker (2)
        • Git (22)
        • Linux (9)
        • JSON Web Tokens (JWT) (4)
        • Troubleshooting (87)
        • Swagger (0)
        • Vue.js (52)
        • Java (74)
        • html (12)
        • C (5)
        • jQuery (15)
        • JavaServer Pages (JSP) (17)
        • Arduino (1)
        • JavaScript (35)
        • Amazon Web Services (AWS) (11)
        • Algorithm (9)
        • 참고 기능 (16)
        • mongo (2)
      • PROJECT (27)
        • 스프링부트+JPA+몽고 API 개발 (3)
        • MINI (2)
        • 게시판 (3)
        • vue 프로젝트 (1)
        • JPA 사이드 프로젝트 기록 (17)
      • TEAM STUDY (156)
        • 가상 면접 사례로 배우는 대규모 시스템 설계 기초 (8)
        • 한 권으로 읽는 컴퓨터 구조와 프로그래밍 (12)
        • NAVER DEVELOPER (4)
        • LINUX (23)
        • PYTHON (19)
        • SERVER (8)
        • 알고리즘 코딩 테스트 스터디 (31)
        • 쿠버네티스 (40)
        • 대세는 쿠버네티스 [초급~중급] (11)
      • BOOK (0)
      • 자격증 (61)
        • 리눅스 1급 - 필기 기록 (19)
        • 네트워크 관리사 (2)
        • 네트워크 관리사 2급 - 실기 기록 (21)
        • 네트워크 관리사 2급 - 필기 기록 (16)
        • 정보처리 (2)
      • 직장인 대학원 (17)
        • 기록 (1)
        • 캐글 스터디 (3)
        • R (12)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    네트워크 관리사 학점
    리눅스 마스터 1급 정리
    docker
    파이썬 알고리즘
    springboot
    파이썬
    VUE
    리눅스 마스터 1급 요약
    리눅스 1급 요약
    쿠버네티스 스터디
    redis
    스프링
    네트워크 관리사 자격증
    알고리즘
    리눅스 마스터 요약
    리눅스 마스터
    리눅스 마스터 1급
    네트워크 관리사
    네트워크 관리사 2급 실기
    네트워크 관리사 실기
    쿠버네티스
    BackendDevelopment
    java
    Git 저장소
    jpa
    네트워크 관리사 요약
    네트워크 관리사 2급
    Spring
    REST API
    git
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
Binsoo
액셀 다운로드 - '~~.xlsx' 의 내용에 문제가 있습니다

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.