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();
			}
		}
	}

}

-- 지정해준 경로에 엑셀 생성 확인