반응형
excelController 및 excelService 클래스를 사용하여 엑셀 파일을 생성하고 다운로드 한다.
1. Controller
클라이언트 요청을 처리하고 엑셀 파일 다운로드를 처리한다.
// 엑셀 파일 다운로드
@RequestMapping("/DownloadExcel")
public ResponseEntity<ByteArrayResource> DownloadExcel (@RequestBody HashMap<String, Object> map) throws Exception {
List<HashMap<String, Object>> HeaderList = mapper.convertValue(map.get("Header"),
new TypeReference<List<HashMap<String, Object>>>() {
});
List<HashMap<String, Object>> DataList = mapper.convertValue(map.get("Data"),
new TypeReference<List<HashMap<String, Object>>>() {
});
// 엑셀파일을 생성한다.
ByteArrayOutputStream byteStream = excelService.ExcelOut(HeaderList, DataList);
ByteArrayResource resource = new ByteArrayResource(byteStream.toByteArray());
String FileName = ConvStr("ExcelOutput.xlsx"); // 파일명 한글깨짐 방지 처리
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + FileName)
.contentType(new MediaType("application", "vnd.ms-excel")) //
.contentLength(byteStream.size()) //
.body(resource);
}
// 파일명 한글깨짐 방지
private String ConvStr(String str) {
// 파일명 한글깨짐 방지
try {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (c > '~') {
sb.append(URLEncoder.encode("" + c, "UTF-8"));
} else {
sb.append(c);
}
}
String encodedFilename = sb.toString();
return encodedFilename;
} catch (Exception ex) {
log.error(ex.getMessage(), ex);
}
return "";
}
2. Service
service는 엑셀 파일을 생성하는 작업을 수행한다.
// 엑셀파일 정보를 반환.
public ByteArrayOutputStream ExcelOut(List<HashMap<String, Object>> HeaderList,
List<HashMap<String, Object>> DataList) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
SXSSFWorkbook workbook = new SXSSFWorkbook(); // 워크북 생성
Sheet sheet = workbook.createSheet("Sheet1"); // 시트 생성
SheetInput(sheet, HeaderList, DataList);
workbook.write(out);
out.close();
workbook.close();
return out;
}
// 엑셀 생성
private void SheetInput(Sheet sheet, List<HashMap<String, Object>> HeaderList,
List<HashMap<String, Object>> datas) {
int rowNum = 0;
Row Header_row = sheet.createRow(rowNum++); // 해더 생성
int Header_cellNum = 0;
for (Map<String, Object> HeadItem : HeaderList) {
Cell cell = Header_row.createCell(Header_cellNum++);
cell.setCellValue(HeadItem.get("text").toString());
}
// 해더 생성 끝
// 데이터를 한개씩 조회해서 한개의 행으로 만든다.
for (Map<String, Object> data : datas) {
// row 생성
Row row = sheet.createRow(rowNum++);
int cellNum = 0;
for (Map<String, Object> HeadItem : HeaderList) {
Cell cell = row.createCell(cellNum++);
String HeaderKey = HeadItem.get("value").toString();
String HeaderType = "";
if (HeadItem.containsKey("type")) {
HeaderType = HeadItem.get("type").toString();
}
if (data.containsKey(HeaderKey)) {
if (CommonUtil.isNullOrEmpty(HeaderType)) {
if (data.get(HeaderKey) instanceof String) {
cell.setCellValue((String) data.get(HeaderKey));
} else if (data.get(HeaderKey) instanceof Integer) {
cell.setCellValue((Integer) data.get(HeaderKey));
} else if (data.get(HeaderKey) instanceof Double) {
cell.setCellValue((Double) data.get(HeaderKey));
} else {
cell.setCellValue(data.get(HeaderKey).toString());
}
} else {
if (HeaderType.equals("Double")) {
String temp = data.get(HeaderKey).toString();
cell.setCellValue(Double.valueOf(temp));
} else {
cell.setCellValue(data.get(HeaderKey).toString());
}
}
} else {
cell.setCellValue("");
}
}
}
위의 코드를 사용하여 엑셀 파일 다운로드 기능을 구현할 수 있다. 클라이언트가 /excel/download 엔드포인트로 POST 요청을 보내면 엑셀 파일이 생성되어 다운로드된다. 코드를 사용할 때 필요에 따라 예외 처리 및 보안 검토를 추가해야 한다.
반응형
'IT > JAVA' 카테고리의 다른 글
JAVA HOME 설정 / 'java'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는배치 파일이 아닙니다. (0) | 2023.03.27 |
---|---|
자바 hashmap Decimal 형태로 변환 (0) | 2023.03.13 |
java.lang.NullPointerException 해결 (0) | 2023.02.08 |
mybatis if begin 대체 (0) | 2023.01.17 |
mybatis 프로시저 호출 (0) | 2023.01.17 |