Excel은 데이터 분석과 계산에 강점을 가진 반면, Word는 문서 작성과 보고서 발간에 특화되어 있습니다. 따라서 분석이 완료된 Excel 데이터를 보고서 형식의 Word 문서에 표로 포함시켜야 하는 경우가 자주 발생합니다. 단순히 데이터를 복사하여 붙여넣는 것뿐만 아니라, 셀 병합, 글꼴, 정렬, 테두리 등의 서식까지 함께 유지해야 할 때가 많습니다.
이 글에서는 Java용 Spire.Office for Java 라이브러리를 사용하여 Excel 데이터와 셀 서식을 Word 문서의 표로 내보내는 방법을 단계별로 설명합니다. 이 라이브러리는 Spire.XLS와 Spire.Doc을 모두 포함하는 통합 패키지로, 두 가지 문서 형식을 동시에 처리해야 하는 작업에 적합합니다.
Excel과 Word를 모두 처리해야 하므로, Spire.Office for Java를 의존성에 추가하는 것이 효율적입니다. Maven을 사용하는 경우 pom.xml 파일에 다음 리포지토리와 의존성을 포함시킵니다.
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.office</artifactId>
<version>11.7.0</version>
</dependency>
</dependencies>
Spire.Office for Java는 Spire.XLS for Java, Spire.Doc for Java 등 개별 라이브러리를 모두 포함하는 통합 패키지입니다. 무료 버전(Free Spire.Office for Java)도 제공되며, 이 경우 spire.office.free 아티팩트를 사용합니다.
전체 과정은 크게 Excel에서 데이터를 읽어들이는 부분과 Word 표를 생성하고 서식을 적용하는 부분으로 나뉩니다. 아래는 공식 문서를 참고한 전체 예제 코드입니다.
import com.spire.doc.*;
import com.spire.doc.documents.HorizontalAlignment;
import com.spire.doc.documents.PageOrientation;
import com.spire.doc.documents.VerticalAlignment;
import com.spire.doc.fields.TextRange;
import com.spire.xls.*;
public class ExportExcelToWord {
public static void main(String[] args) {
// 1. Excel 파일 로드
Workbook workbook = new Workbook();
workbook.loadFromFile("sample.xlsx");
// 2. 첫 번째 워크시트 가져오기
Worksheet sheet = workbook.getWorksheets().get(0);
// 3. Word 문서 생성 및 페이지 방향 설정
Document doc = new Document();
Section section = doc.addSection();
section.getPageSetup().setOrientation(PageOrientation.Landscape);
// 4. Word 표 추가 및 크기 조정
Table table = section.addTable(true);
table.resetCells(sheet.getLastRow(), sheet.getLastColumn());
// 5. 병합 셀 처리
mergeCells(sheet, table);
// 6. 데이터 및 서식 복사
for (int r = 1; r <= sheet.getLastRow(); r++) {
// 행 높이 설정
table.getRows().get(r - 1).setHeight((float) sheet.getRowHeight(r));
for (int c = 1; c <= sheet.getLastColumn(); c++) {
CellRange xCell = sheet.getCellRange(r, c);
TableCell wCell = table.get(r - 1, c - 1);
// Excel 셀의 값을 Word 셀에 추가
TextRange textRange = wCell.addParagraph().appendText(xCell.getValue());
// Excel의 글꼴 및 셀 서식을 Word에 복사
copyStyle(textRange, xCell, wCell);
}
}
// 7. Word 문서 저장
doc.saveToFile("ExportToWord.docx", FileFormat.Docx);
}
// Excel의 병합 셀을 Word 표에 동일하게 적용하는 메서드
private static void mergeCells(Worksheet sheet, Table table) {
if (sheet.hasMergedCells()) {
// Excel에서 병합된 셀 범위 가져오기
CellRange[] ranges = sheet.getMergedCells();
for (int i = 0; i < ranges.length; i++) {
int startRow = ranges[i].getRow();
int startColumn = ranges[i].getColumn();
int rowCount = ranges[i].getRowCount();
int columnCount = ranges[i].getColumnCount();
// Word 표의 해당 셀 병합
if (rowCount > 1 && columnCount > 1) {
for (int j = startRow; j <= startRow + rowCount ; j++) {
table.applyHorizontalMerge(j - 1, startColumn - 1, startColumn - 1 + columnCount - 1);
}
table.applyVerticalMerge(startColumn - 1, startRow - 1, startRow - 1 + rowCount -1);
}
if (rowCount > 1 && columnCount == 1 ) {
table.applyVerticalMerge(startColumn - 1, startRow - 1, startRow - 1 + rowCount -1);
}
if (columnCount > 1 && rowCount == 1 ) {
table.applyHorizontalMerge(startRow - 1, startColumn - 1, startColumn - 1 + columnCount-1);
}
}
}
}
// Excel 셀의 서식을 Word 표 셀에 복사하는 메서드
private static void copyStyle(TextRange wTextRange, CellRange xCell, TableCell wCell) {
// 글꼴 스타일 복사
wTextRange.getCharacterFormat().setTextColor(xCell.getStyle().getFont().getColor());
wTextRange.getCharacterFormat().setFontSize((float) xCell.getStyle().getFont().getSize());
wTextRange.getCharacterFormat().setFontName(xCell.getStyle().getFont().getFontName());
wTextRange.getCharacterFormat().setBold(xCell.getStyle().getFont().isBold());
wTextRange.getCharacterFormat().setItalic(xCell.getStyle().getFont().isItalic());
// 배경색 복사
wCell.getCellFormat().setBackColor(xCell.getStyle().getColor());
// 가로 정렬 복사
switch (xCell.getHorizontalAlignment()) {
case Left:
wTextRange.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Left);
break;
case Center:
wTextRange.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
break;
case Right:
wTextRange.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Right);
break;
}
// 세로 정렬 복사
switch (xCell.getVerticalAlignment()) {
case Bottom:
wCell.getCellFormat().setVerticalAlignment(VerticalAlignment.Bottom);
break;
case Center:
wCell.getCellFormat().setVerticalAlignment(VerticalAlignment.Middle);
break;
case Top:
wCell.getCellFormat().setVerticalAlignment(VerticalAlignment.Top);
break;
}
}
}
위 코드는 크게 다섯 가지 주요 부분으로 구성됩니다.
Workbook 객체를 생성하고 loadFromFile() 메서드로 Excel 파일을 로드한 후, 첫 번째 워크시트를 가져옵니다.Document 객체를 생성하고, 섹션을 추가한 후 페이지 방향을 가로(Landscape)로 설정합니다. 그리고 addTable() 메서드로 표를 추가하고, Excel의 행과 열 개수에 맞게 크기를 조정합니다.mergeCells() 메서드에서 Excel의 병합 셀 정보를 가져와 Word 표의 동일한 위치에 병합을 적용합니다. 이는 hasMergedCells()로 병합 셀 존재 여부를 확인하고, getMergedCells()로 범위를 가져와 applyHorizontalMerge()와 applyVerticalMerge()로 구현합니다.appendText()로 Word 셀에 추가하고, copyStyle() 메서드를 통해 글꼴, 크기, 굵기, 기울임, 배경색, 가로/세로 정렬 등을 복사합니다.saveToFile() 메서드로 최종 Word 문서를 저장합니다..xls 파일 읽기/쓰기 시 워크시트 5개, 행 200개로 제한되며, 변환 결과도 처음 3페이지로 제한됩니다. .xlsx 파일에는 이러한 행 제한이 없습니다. 프로젝트 요구사항에 맞는 버전을 선택해야 합니다.이 글에서는 Java용 Spire.Office for Java 라이브러리를 사용하여 Excel 데이터와 상세한 셀 서식을 Word 문서의 표로 내보내는 완전한 코드 예제와 함께 단계별 설명을 제공했습니다. 공식 문서를 기반으로 한 이 접근 방식은 Excel의 병합 셀, 글꼴, 정렬, 배경색 등의 서식을 Word 표에 비교적 정확하게 재현할 수 있는 실용적인 방법을 제시합니다. 이는 정기적인 데이터 보고서 생성이나 문서화 작업을 자동화해야 하는 애플리케이션에서 유용하게 활용될 수 있습니다. 다만 상용 라이선스와 무료 버전의 제약 사항을 프로젝트 환경에 맞게 검토해야 하며, Apache POI와 docx4j와 같은 오픈소스 대안과의 비교를 통해 개발 비용, 유지보수성, 라이선스 측면에서 가장 적합한 해결책을 선택할 것을 권장합니다.