package egovframework.util.excel; import org.checkerframework.checker.nullness.qual.Nullable; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; /** * 단일 시트 엑셀 파일 생성 클래스 * *
이 클래스는 {@link BaseSxssfExcelFile}을 상속하여 단일 시트 엑셀 파일을 생성합니다. * HTTP 응답으로 엑셀 파일을 다운로드하거나, OutputStream으로 파일을 출력할 수 있습니다.
* *사용 예제 1: HTTP 응답으로 엑셀 다운로드
*{@code
* @GetMapping("/download.xlsx")
* public void downloadExcel(HttpServletRequest request, HttpServletResponse response) {
* List dataList = userService.selectUserList();
* ExcelSheetData sheetData = ExcelSheetData.of(dataList, UserVO.class, "사용자 목록");
* new SxssfExcelFile(sheetData, request, response, "사용자목록.xlsx");
* }
* }
*
* 사용 예제 2: 암호화된 엑셀 파일 다운로드
*{@code
* @GetMapping("/download-encrypted.xlsx")
* public void downloadEncryptedExcel(HttpServletRequest request, HttpServletResponse response) {
* List dataList = userService.selectUserList();
* ExcelSheetData sheetData = ExcelSheetData.of(dataList, UserVO.class, "사용자 목록");
* new SxssfExcelFile(sheetData, request, response, "사용자목록.xlsx", "password123");
* }
* }
*
* 사용 예제 3: OutputStream으로 출력
*{@code
* try (FileOutputStream fos = new FileOutputStream("output.xlsx")) {
* List dataList = userService.selectUserList();
* ExcelSheetData sheetData = ExcelSheetData.of(dataList, UserVO.class);
* new SxssfExcelFile(sheetData, fos, null);
* }
* }
*
* VO 클래스 예제:
*{@code
* @ExcelSheet(name = "사용자")
* public class UserVO {
* @ExcelColumn(headerName = "이름", headerWidth = 20)
* private String userName;
*
* @ExcelColumn(headerName = "이메일", headerWidth = 30)
* private String email;
*
* @ExcelColumn(headerName = "전화번호")
* private String phone;
* }
* }
*
* @see BaseSxssfExcelFile
* @see ExcelSheetData
* @see ExcelColumn
* @author eGovFrame
*/
public class SxssfExcelFile extends BaseSxssfExcelFile {
// ==================== 생성자 (HTTP 응답 다운로드) ====================
/**
* HTTP 응답으로 엑셀 파일을 다운로드합니다 (암호화 없음).
*
* 이 생성자는 암호화 없이 엑셀 파일을 HTTP 응답으로 다운로드합니다. * 파일명은 브라우저 종류에 따라 적절하게 인코딩됩니다.
* * @param data 엑셀 시트 데이터 (데이터 리스트, 타입, 제목) * @param request HTTP 요청 객체 (브라우저 정보 확인용) * @param response HTTP 응답 객체 * @param fileName 다운로드될 파일명 (확장자 포함, 예: "사용자목록.xlsx") * @throws RuntimeException 파일 생성 또는 출력 중 오류 발생 시 */ public SxssfExcelFile(ExcelSheetData data, HttpServletRequest request, HttpServletResponse response, String fileName) { this(data, request, response, fileName, null); } /** * HTTP 응답으로 엑셀 파일을 다운로드합니다 (암호화 지원). * *이 생성자는 선택적으로 암호화하여 엑셀 파일을 HTTP 응답으로 다운로드합니다. * 파일명은 브라우저 종류에 따라 적절하게 인코딩됩니다.
* * @param data 엑셀 시트 데이터 (데이터 리스트, 타입, 제목) * @param request HTTP 요청 객체 (브라우저 정보 확인용) * @param response HTTP 응답 객체 * @param fileName 다운로드될 파일명 (확장자 포함, 예: "사용자목록.xlsx") * @param password 암호화 비밀번호 (null이면 암호화하지 않음) * @throws RuntimeException 파일 생성 또는 출력 중 오류 발생 시 */ public SxssfExcelFile(ExcelSheetData data, HttpServletRequest request, HttpServletResponse response, String fileName, @Nullable String password) { try { setDownloadHeaders(request, response, fileName); ExcelMetadata metadata = ExcelMetadataFactory.getInstance().createMetadata(data.getType()); renderSheetContent(data, metadata); writeWithEncryption(response.getOutputStream(), password); } catch (IOException e) { throw new RuntimeException("HTTP 응답으로 엑셀 파일 출력 중 오류가 발생했습니다.", e); } } // ==================== 생성자 (OutputStream 출력) ==================== /** * OutputStream으로 엑셀 파일을 출력합니다. * *이 생성자는 선택적으로 암호화하여 엑셀 파일을 OutputStream으로 출력합니다. * 파일 시스템에 직접 저장하거나 다른 스트림 처리 용도로 사용할 수 있습니다.
* * @param data 엑셀 시트 데이터 (데이터 리스트, 타입, 제목) * @param outputStream 출력 스트림 * @param password 암호화 비밀번호 (null이면 암호화하지 않음) * @throws RuntimeException 파일 생성 또는 출력 중 오류 발생 시 */ public SxssfExcelFile(ExcelSheetData data, OutputStream outputStream, @Nullable String password) { ExcelMetadata metadata = ExcelMetadataFactory.getInstance().createMetadata(data.getType()); renderSheetContent(data, metadata); writeWithEncryption(outputStream, password); } // ==================== private 헬퍼 메서드 ==================== /** * HTTP 응답 헤더를 설정하여 엑셀 파일 다운로드를 준비합니다. * *브라우저 종류에 따라 파일명을 적절하게 인코딩하여 Content-Disposition 헤더를 설정합니다: *