Spring Boot Build 관련 jar에서 file resource 처리

UI 는 VUE.JS 로 되어 있고.. 서버에 있는 엑셀 파일을 읽어서 첫번째 시트에만 데이터 넣고 다운로드 받는 방법

// 일반적으로 인터넷에 돌아 다니는 내용 여기저기 모아서 맞게 수정함

LinkedHashMap<String, Object> linkHashMap = (LinkedHashMap<String, Object>) result.getData(); //LinkedHashMap;
List<HashMap> rowData = (List<HashMap>) linkHashMap.get("rowData");
rowData = rowData.stream().sorted((o1, o2) -> o1.get("closeDate").toString().compareTo(o2.get("closeDate").toString()) ).collect(Collectors.toList());

// 실제 jar로 묶이면 위치 찾기가 안되는데.. 아래 ClassPathResource 를 사용하여 가져온다. 실제 JAR 에 VUE로 만든 UI static 경로가 아래 경로로 되어있다.
ClassPathResource classPathResource = new ClassPathResource("static/엑셀 파일 명");

InputStream is = classPathResource.getInputStream();

//엑셀파일 작성을 위한 임시데이터 저장용 기능
//최소 압축 비율을 지정한다.
ZipSecureFile.setMinInflateRatio(0);

// 파일 생성된 데이터 만들어서 넘겨주기 위해 선억
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

XSSFWorkbook xwb = new XSSFWorkbook(is);

// SXSSF 는 대용량에서 많이 사용한다고 한다.. 그리고 getRow로 읽어서 해당 위치에 set 으로 업데이트가 안된다. 
// set 을 사용하고 싶을땐 XSSF 를 선언하여 사용해야한다. (주로 서식을 유지 하고 싶을때.. 사용)

SXSSFWorkbook workbook = new SXSSFWorkbook(xwb);
SXSSFSheet sheet = workbook.getSheetAt(0); //EXCEL 시트 지정, 0은 첫번째 시트

//List<CellStyle> styleList = new LinkedList<>();

// 첫번째 시트에 첫번째 ROW에 서식 숨겨 놨음.. 해당 부분 가져옴
XSSFRow targetSheetRow = xwb.getSheetAt(0).getRow(0);

// 아래는 특정 위치에 있는 서식 가져와서 저장
//for (int i = 1; i < targetSheetRow.getLastCellNum(); i++) {
//            styleList.add(targetSheetRow.getCell(i).getCellStyle());
//      }

CellStyle dateCellStyle = workbook.createCellStyle();
dateCellStyle.setBorderTop(BorderStyle.DOTTED);
dateCellStyle.setBorderBottom(BorderStyle.DOTTED);
dateCellStyle.setBorderLeft(BorderStyle.THIN);
dateCellStyle.setBorderRight(BorderStyle.THIN);

CellStyle bodyCellStyle = workbook.createCellStyle();
bodyCellStyle.setBorderTop(BorderStyle.DOTTED);
bodyCellStyle.setBorderBottom(BorderStyle.DOTTED);
bodyCellStyle.setBorderLeft(BorderStyle.THIN);
bodyCellStyle.setBorderRight(BorderStyle.THIN);

// 원하는 위치에 값 넣는곳 
targetSheetRow = xwb.getSheetAt(0).getRow(1);
XSSFCell targetSheetCell = targetSheetRow.getCell(2);
targetSheetCell.setCellValue(Integer.valueOf(rowData.get(0).get("데이터키").toString()));

// 수식 관련 처리 되게 선언
FormulaEvaluator evaluator = xwb.getCreationHelper().createFormulaEvaluator();

//엑셀의 시작열은 0부터 시작한다.
int startRow = 5; //6번째 ROW를 사용한다는 뜻..
SXSSFRow row = null;

//startRow++;
for(HashMap rowDataMap : rowData) {
	row = sheet.createRow(startRow);

	row.createCell(1).setCellValue(rowDataMap.get("데이터키").toString()); // String 
	row.createCell(2).setCellValue(Integer.valueOf(rowDataMap.get("데이터키").toString()));  // int

	for(int i = 1; i < row.getLastCellNum(); i++) {
		if (i == 1){
			dateCellStyle.setAlignment(HorizontalAlignment.CENTER); // 첫번째만 정렬
			row.getCell(i).setCellStyle(dateCellStyle);
		} else {
			bodyCellStyle.setAlignment(HorizontalAlignment.RIGHT); // 나머지 우측 정렬
			row.getCell(i).setCellStyle(bodyCellStyle);
		}
	}

	startRow++;
}

// 수식 관련 처리 되게 처리
evaluator.evaluateAll();

// First step is to get at the CTWorksheet bean underlying the worksheet.
//CTWorksheet ctWorksheet = xwb.getSheetAt(0).getCTWorksheet();
// From the CTWorksheet, get at the sheet views.
//CTSheetViews ctSheetViews = ctWorksheet.getSheetViews();
// Grab a single sheet view from that array
//CTSheetView ctSheetView = ctSheetViews.getSheetViewArray(ctSheetViews.sizeOfSheetViewArray() - 1);
// Se the address of the top left hand cell.
//ctSheetView.setTopLeftCell("A1");
// Also, make sure that cell A1 is the active cell
//sheet.setActiveCell(new CellAddress("A1"));

outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);

workbook.close();
is.close();

// 

You may also like...

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다