Java 애플리케이션에서 Word 문서를 템플릿 기반으로 자동 생성하고 내보내는 작업은 Apache POI와 POI-TL(POI Template Language) 라이브러리를 통해 효율적으로 구현할 수 있습니다. Apache POI는 Microsoft Office 문서를 다루기 위한 강력한 Java API이며, POI-TL은 이 POI 위에 구축되어 Word 문서 생성을 위한 직관적인 템플릿 엔진을 제공합니다. 이 두 라이브러리를 함께 사용하면 정형화된 Word 문서를 동적으로 생성하는 과정을 간소화할 수 있습니다.
다음은 POI와 POI-TL을 사용하여 Word 템플릿에서 문서를 생성하는 구체적인 절차입니다.
준비 단계
-
프로젝트에 필요한 의존성을 추가합니다. Maven 또는 Gradle을 사용하여 POI 및 POI-TL 라이브러리를 포함시킬 수 있습니다. Maven을 사용하는 경우,
pom.xml파일에 아래와 같은 의존성을 추가합니다.<!-- Apache POI 핵심 라이브러리 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>X.Y.Z</version> </dependency> <!-- OOXML 형식 (docx, xlsx 등) 지원 라이브러리 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>X.Y.Z</version> </dependency> <!-- POI-TL 템플릿 엔진 라이브러리 --> <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>A.B.C</version> </dependency>(참고:
X.Y.Z와A.B.C는 현재 사용 가능한 최신 버전으로 대체해야 합니다.) -
Word 템플릿 파일 (예:
my_report_template.docx)을 생성합니다. 이 템플릿 문서에는 동적으로 채워질 내용을 표시하기 위한 특별한 플레이스홀더를 포함할 수 있습니다. POI-TL은 기본적으로{{key}}형태의 플레이스홀더를 사용하여 데이터가 삽입될 위치를 지정합니다.예시 템플릿 내용:
보고서 제목: {{reportTitle}} 작성자: {{authorName}} 주요 내용: {{mainContent}} 날짜: {{generationDate}}
Java 코드 구현을 통한 문서 생성
-
Java 클래스에서 먼저 Word 템플릿 파일을 로드합니다.
import com.deepoove.poi.XWPFTemplate; import java.io.IOException; // ... public class WordDocumentGenerator { public static void main(String[] args) { String templatePath = "src/main/resources/my_report_template.docx"; XWPFTemplate docTemplate = null; try { docTemplate = XWPFTemplate.compile(templatePath); } catch (IOException e) { System.err.println("템플릿 파일을 불러오는 중 오류가 발생했습니다: " + e.getMessage()); // 예외 처리 로직 추가 (예: 프로그램 종료, 기본 템플릿 사용 등) return; } // ... 다음 단계로 이동 ... } } -
템플릿 내의 플레이스홀더를 채울 데이터를 담는 데이터 모델을 생성합니다. 이 모델은 일반적으로 Map 형태를 사용하여 키-값 쌍으로 데이터를 관리하며, 키는 템플릿의 플레이스홀더 이름과 일치해야 합니다.
import java.util.HashMap; import java.util.Map; import java.time.LocalDate; import java.time.format.DateTimeFormatter; // ... (main 메서드 내부 또는 별도 메서드) ... Map<String, Object> renderingData = new HashMap<>(); renderingData.put("reportTitle", "월간 프로젝트 진행 보고서"); renderingData.put("authorName", "김철수"); renderingData.put("mainContent", "이번 달에는 신규 기능 개발을 성공적으로 완료하였으며, 다음 달에는 사용자 테스트 단계에 진입할 예정입니다."); renderingData.put("generationDate", LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy년 MM월 dd일"))); // ... -
POI-TL을 사용하여 템플릿의 플레이스홀더를 데이터로 대체하고, 최종 Word 문서를 지정된 경로에 저장합니다.
import java.io.FileOutputStream; import java.io.IOException; // ... (main 메서드 내부 또는 별도 메서드) ... if (docTemplate != null) { // 데이터로 문서 렌더링 docTemplate.render(renderingData); // 결과 문서를 파일로 저장 String outputFilePath = "output/generated_monthly_report.docx"; try (FileOutputStream out = new FileOutputStream(outputFilePath)) { docTemplate.write(out); System.out.println("Word 문서가 성공적으로 생성되었습니다: " + outputFilePath); } catch (IOException e) { System.err.println("문서 저장 중 오류가 발생했습니다: " + e.getMessage()); // 예외 처리 로직 추가 } finally { // 템플릿 리소스 닫기 try { docTemplate.close(); } catch (IOException e) { System.err.println("템플릿 리소스 닫는 중 오류 발생: " + e.getMessage()); } } }
위 단계를 거치면 지정된 Word 템플릿과 제공된 데이터를 기반으로 완전히 새로운 Word 문서가 생성됩니다. 이 과정에서 핵심은 코드의 논리적 정확성을 확보하고, 템플릿 내 플레이스홀더 이름이 데이터 모델의 키와 정확히 일치하는지 확인하는 것입니다. POI-TL은 단순 텍스트 대체 기능을 넘어 이미지, 표, 목록 등 복잡한 문서 요소를 처리하는 기능을 제공하여 문서 생성의 유연성을 크게 높여줍니다. 이러한 접근 방식은 보고서, 송장, 계약서 등 반복적으로 생성되는 다양한 Word 문서를 자동화하고, 일관되고 정확한 문서를 대량으로 만들어야 하는 시나리오에 특히 유용합니다.