Spring Boot 기준으로 build.gradle에 poi를 추가해줍니다.
implementation 'org.apache.poi:poi:5.2.3'
implementation 'org.apache.poi:poi-ooxml:5.2.3'
그 후, Excel 관련 컨트롤러를 생성
생성 된 컨트롤러에서 가져올 데이터를 paraMap으로 조회 후 rstMap에 담고
리스트 형식으로 컬럼을 넣을 경우 map에 순서 및 컬럼명을 입력해준다.
@GetMapping(value = "/excel/getTestExcel ")
public ModelAndView getStudentExcel (HttpServletRequest req, HttpServletResponse resp) throws Exception {
Map<String, Object> paraMap = getParam(req);
Map<String, Object> rstMap = new HashMap<>();
String fileName = URLEncoder.encode("학생_명부"", "UTF-8") + ".xlsx";
resp.setHeader("Content-disposition", "attachment; filename=" + fileName);
testService.getTestInfo(paraMap, rstMap);
// 순서 및 컬럼이름
Map<String, Object> map = new LinkedHashMap<>();
map.put("student_id", "학번");
map.put("student_year", "학년");
map.put("student_name", "이름");
map.put("student_sex", "성별");
map.put("student_specialty", "전공");
rstMap.put("column", map);
rstMap.put("sheetTitle", "학생 명부");
return new ModelAndView(new StudentExcelView(), "rstMap", rstMap);
}
위 내용을 입력 하고 하단 부분의 StudentExcelView를 호출
public class StudentExcelView extends AbstractExcelPOIView {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Override
protected Workbook createWorkbook() {
return new XSSFWorkbook();
}
@Override
protected void buildExcelDocument(Map<String, Object> model, Workbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String, Object> rstMap = (Map<String, Object>) model.get("rstMap");
Sheet sheet;
if (rstMap.get("sheetTitle") != null) {
sheet = workbook.createSheet(rstMap.get("sheetTitle").toString());
} else {
sheet = workbook.createSheet("");
}
Row row = null;
Cell cell = null;
int r = 0;
int c = 0;
// create header cells
row = sheet.createRow(r++);
// column title
Map<String, Object> column = (Map<String, Object>) rstMap.get("column");
for (String key : column.keySet()) {
cell = row.createCell(c++);
cell.setCellStyle(styleOfBoardFillFontRedBold14);
cell.setCellValue(column.get(key).toString());
}
sheet.setColumnWidth(0, 1000);
// row data
List<Map<String, Object>> list = (List<Map<String, Object>>) rstMap.get("list");
for (int i = 0; i < list.size(); i++) {
row = sheet.createRow(r++);
c = 0;
Map<String, Object> map = list.get(i);
for (String key : column.keySet()) {
cell = row.createCell(c++);
cell.setCellStyle(styleOfBoardFontBlack11);
if (!CommonUtil.isEmpty(map.get(key))) {
cell.setCellValue(map.get(key).toString());
} else {
cell.setCellValue("");
}
}
sheet.autoSizeColumn(i, true);
}
row = sheet.createRow(r++);
}
}
위와 같은 방식으로 작업하면 아래 표 처럼 엑셀이 완성된다

※ 추가적인 내용으로 엑셀 양식을 만들다보면 병합해야하는 경우가 생긴다.
그럴때는 아래 와 같은 소스를 sheet에 추가해주면 된다.
// 가로 병합
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2)); // 열시작, 열종료, 행시작, 행종료
// 세로 병합
sheet.addMergedRegion(new CellRangeAddress(1, 4, 1, 1)); // 열시작, 열종료, 행시작, 행종료
셀 사이즈를 조절하는 방식은 아래의 방식으로 하면 된다
// i는 몇번째 셀인지, 5000은 사이즈
sheet.setColumnWidth(i, 5000);
'개발자 > Java' 카테고리의 다른 글
| POI를 이용한 대용량 엑셀 다운로드(SXSSF 방식 + sqlSessionFactory + ResultHandler + VO 활용) (1) | 2024.10.18 |
|---|---|
| [Java] 숫자, 금액을 한글로 변환 (0) | 2024.06.26 |
| [Java] Collections.frequency() 사용법 (0) | 2024.06.13 |
| [Java] Jaspersoft Studio 출력 방식(PDF, 바로 프린트) (0) | 2024.06.12 |
| [Java] URL에 jsessionid가 따라 붙을 경우 (0) | 2023.04.20 |