오늘 내가 해결해야 하는 문제는 java에서 excel 다운로드를 했을 때
하단에 다운로드 과정이 보이는 로딩바가 필요하다.
나는 내가 지정한 경로에 다운로드 되는 것은 마무리 지었지만,
로딩바가 보이지 않는다.
이번 문제는 다솜언니한테도 주완선배한테도 물어봐서 해결을 해나가려고 했다.
덕분에 넓게 이해는 되었지만 깊게 이해는 되지 않았다.
이제 내 몫이겠지.. (;´༎ຶД༎ຶ`)
아무튼 오늘 해결 하는걸로
pom.xml 확인
<!-- excel xls -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.13</version>
</dependency>
<!-- excel xlsx -- >
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.13</version>
</dependency>
액셀 다운로드를 구현함에 있어서는
AbstractXlsxView 메서드를 상속 받아야 AbstractXlsxView 가능하다고 했다.
AbstractXlsxView 를 상속 받으니까 buildExcelDocument 를 Override 하라고 한다.
@Override
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
}
buildExcelDocument 에서 액셀 다운로드 기능을 구현하면 된다.
swagger 를 통해서 액셀 다운로드 테스트를 하는데,
다운로드 로딩바 까지는 성공을 했으나
xlsx 파일 형식을 열 수 없다는 안내문이 떴다.
다영선배 의견
의견 1 ) Swagger To Excel
Swagger To Excel 문제 일 것이라고 예상 했다 !
아래 사이트를 참조해보라고 보내줬다!
구글링에서도 Swagger To Excel 자료에 대한 글은 몇개는 있던데 내가 알아 듣지 못하는 말들 뿐이어서 걱정했는데
고맙습니다아 :)
https://github.com/AnkurJain01/SwaggerToExcel
의견 2 ) restAPI excel download
restAPI excel download 에 대해서도 구글링 해보기 !
1. 찾은 블로그는 ByteArrayInputStream 로 액셀문서를 생성한다.
이 문제는 아니겠지만 혹시나해서 아래 블로그에서 시키는 대로 따라했는데 로딩바는 생기나
역시나 확장자를 .xlsx 는 열리지 않는다.
역시나 확장자를 .xls로 했더니 열리기는 하나 데이터가 삽입되지 않는다.
https://blackdroid.tistory.com/30
Bin 삽질
방법 1 ) 여기서 뭔가 가능성이 보이는 방법을 찾았다.
org.jxls 라이브러리를 처음 봤지만 한번 들여다 볼 가치가 있는 것 같다.
1-1 . 프로젝트 내에 액셀 파일을 저장한다.
1-1. 그 액셀 파일을 읽어와 덮어 씌워서 생성한다.
ayoteralab.tistory.com/entry/Spring-Boot-09-Excel-Download-POI-JXLS
공식문서를 따라해봤는데 이 에러가 발생한다
http://jxls.sourceforge.net/samples/excel_formulas.html
java.lang.IllegalStateException: Cannot load XLS transformer. Please make sure a Transformer implementation is in classpath
여기서 답을 찾은거 같다!
설정 파일이 문제 인 것 같다!
https://stackoverflow.com/questions/39754573/cannot-load-xls-transformer-please-make-sure-a-transformer-implementation-is-in/43580535
하지만 우리 시스템 특성인 대용량을 생각하면 쓸 수 없다..
jxls 는 xls 만 지원하기 때문,
우리는 xlsx 가 필요하다.
현재 내 상황은AbstractXlsxView 로 구현한 상황만 되지 않는다.
로딩바가 필요하단 말이다......
AbstractXlsxView
다운로드 | 파일 열림 | 내용 들어감 | |
Swagger | O | X | X |
view | X | X | X |
@PostMapping("/excelDownload")
public ModelAndView excelDownload(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception {
request.setCharacterEncoding("utf-8");
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("ExcelDownloadTEST");
return modelAndView;
}
package com.rsn.POMS.api.lucy.action.service;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.view.document.AbstractXlsxView;
@Component("ExcelDownloadTEST")
public class excelText1 extends AbstractXlsxView {
@Override
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.out.println("==================== ExcelDownloadTEST 액셀 컴포넌트 buildExcelDocument에 들어왔습니다 ====================");
//파일 이름 생성
response.setContentType("ms-vnd/excel");
response.setHeader("Content-Disposition", "attachment; filename=test.xlsx");
response.setHeader("Content-Transfer-Encoding", "binary");
createSheetExcel(model, workbook);
workbook.write(response.getOutputStream());
workbook.close();
}
private void createSheetExcel(Map<String, Object> model, Workbook workbook) throws Exception {
System.out.println("==================== ExcelDownloadTEST 액셀 컴포넌트 createSheetExcel에 들어왔습니다 ====================");
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("TEST SHEET");
Row row = null;
Cell cell = null;
int rowNum = 0;
row = sheet.createRow(rowNum++);
cell = row.createCell(0);
cell.setCellValue("테스트");
}
}
FileOutputStream
다운로드 | 파일 열림 | 내용 들어감 | |
Swagger | O | O | O |
view | O | O | O |
private final String[] LogStatusTitle = new String[] { "No", "고객사", "사용자 이름"};
public void actionLogStatusExcel(List<actionLogVo> excelDataList) {
SXSSFWorkbook workbook = new SXSSFWorkbook();
SXSSFSheet sheet = workbook.createSheet("계정별 메뉴 사용현황");
CellStyle titleStyle = workbook.createCellStyle();
titleStyle = getTitlestyle(titleStyle);
int rowIndex = 0;
Row row = null;
Cell cell = null;
row = sheet.createRow(rowIndex);
for (int i = 0; i < LogStatusTitle.length; i++) {
sheet.setColumnWidth(i, 3100);
cell = row.createCell(i);
cell.setCellValue(LogStatusTitle[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.getCom_name());
}
try {
String home = System.getProperty("user.home");
File xlsFile = new File(home + "/Downloads/ACTION_LOG_STATUS.xls");
FileOutputStream fileOut = new FileOutputStream(xlsFile);
workbook.write(fileOut);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
workbook.close();
workbook.dispose();
} catch (IOException e) {
e.printStackTrace();
}
}
}
삽질 끝!
다시 정리하기 ! : (0)
'개발중 > Java' 카테고리의 다른 글
lombok / getter setter 대소문자 호환 오류 (0) | 2021.05.13 |
---|---|
액셀 / AbstractXlsxView - setContentType (0) | 2021.05.13 |
JAVA Exception / 에러 일부로 발생 시키기 (0) | 2021.05.04 |
java 에서 문자열이 date 형식인지 확인 후 20200101 형식으로 변환 (0) | 2021.05.03 |
카테고리 완성 기록 (0) | 2021.04.21 |