Language/Java
[spring] DTO 사용하여 (object) 엑셀 HEADER, VALUE 만들기
도토리즈
2023. 7. 17. 21:47
getDTO 메소드를 활용하여 object 조회 시 조회된 값을 엑셀로 export 하는 경우 사용
1. test1 dto 생성
package com.study.excel.test2.dto;
import org.apache.ibatis.type.Alias;
import lombok.Data;
@Data
@Alias("test1")
public class Test1DTO {
private String id;
private String name;
private String age;
}
2. controller 로직 작성
package com.study.excel.test2.controller;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.lang.reflect.Field;
import com.study.excel.test2.dto.Test1DTO;
import com.study.excel.test2.mapper.TestRepository;
import lombok.RequiredArgsConstructor;
@RestController
@RequestMapping("tc")
@RequiredArgsConstructor
public class TestController {
private final TestRepository tRep;
@RequestMapping("getTable")
public byte[] getTable(@RequestBody Test1DTO test1) throws IOException {
// POSTMAN request value
// {
// "id" : 3
// }
// ID값을 받아서 mapper의 getTest1 select 실행
Test1DTO test = tRep.getTest1(test1);
// <select id="getTest1" parameterType="com.study.excel.test2.dto.Test1DTO"
// resultType="com.study.excel.test2.dto.Test1DTO">
// select * from python.table1 where id = #{id}
// </select>
// workbook 객체 생성
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("테이블 정보"); // 원하는 시트 이름
// sheet, test로 엑셀에 들어갈 row 생성
createExcelRows(sheet, test);
// 바이너리로 변환
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
workbook.write(outputStream);
workbook.close();
byte[] excelBytes = outputStream.toByteArray();
// 엑셀로 변환하는 부분 (한글 깨짐 확인 용)
// 프론트에 전달해주는 경우 saveExcelFile() 메소드 타는 로직 제외하고 바이너리로 retrun 해줌
saveExcelFile(excelBytes);
return excelBytes;
}
// 시트 및 row 생성
public void createExcelRows(Sheet sheet, Test1DTO test1) {
int rowIndex = 0;
// 엑셀 header 설정
Row headerRow = sheet.createRow(rowIndex++);
// row 설정
Row dataRow = sheet.createRow(rowIndex++);
int cellIndex = 0;
//test1의 field만큼 반복하면서 변수 => header / 값 => value로 넣어줌
for (Field field : test1.getClass().getDeclaredFields()) {
field.setAccessible(true);
String fieldName = field.getName();
Object fieldValue;
try {
fieldValue = field.get(test1);
} catch (IllegalAccessException e) {
fieldValue = null;
}
headerRow.createCell(cellIndex).setCellValue(fieldName);
dataRow.createCell(cellIndex).setCellValue(String.valueOf(fieldValue));
cellIndex++;
}
}
public void saveExcelFile(byte[] excelBytes) throws IOException {
FileOutputStream fos = null;
// 엑셀 파일 저장 경로
String filePath = "엑셀 파일 저장 경로";
try {
fos = new FileOutputStream(filePath);
fos.write(excelBytes);
System.out.println("저장성공!");
} catch (IOException e) {
System.out.println("Error saving Excel file: " + e.getMessage());
} finally {
if (fos != null) {
fos.close();
}
}
}
}
-- 지정해준 경로에 엑셀 생성 확인