[java] Apache POI를 이용한 Word 문서 복사

Apache POI는 자바로 Microsoft Office 문서를 조작할 수 있는 라이브러리입니다. 이 라이브러리를 사용하면 Word, Excel, PowerPoint 등의 문서를 생성, 수정, 읽기, 복사 등 다양한 작업을 수행할 수 있습니다. 이번 포스트에서는 Apache POI를 사용하여 Word 문서를 복사하는 방법을 알아보겠습니다.

1. Apache POI 라이브러리 추가

먼저, Apache POI를 사용하기 위해 해당 라이브러리를 프로젝트에 추가해야 합니다. Maven을 사용하는 경우, pom.xml 파일에 아래의 종속성을 추가합니다.

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>

Gradle을 사용하는 경우, build.gradle 파일에 아래의 의존성을 추가합니다.

implementation 'org.apache.poi:poi:4.1.2'

2. Word 문서 복사하기

아래의 코드를 사용하여 Word 문서를 복사할 수 있습니다.

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DocumentCopier {

    public static void main(String[] args) {
        try {
            FileInputStream sourceFile = new FileInputStream("source.docx");
            XWPFDocument sourceDoc = new XWPFDocument(sourceFile);

            XWPFDocument newDoc = new XWPFDocument();

            for (XWPFParagraph paragraph : sourceDoc.getParagraphs()) {
                XWPFParagraph newParagraph = newDoc.createParagraph();
                newParagraph.getCTP().setPPr(paragraph.getCTP().getPPr());
                for (XWPFRun run : paragraph.getRuns()) {
                    XWPFRun newRun = newParagraph.createRun();
                    newRun.getCTR().setRPr(run.getCTR().getRPr());
                    newRun.setText(run.getText(0));
                }
            }

            for (XWPFTable table : sourceDoc.getTables()) {
                XWPFTable newTable = newDoc.createTable();
                for (XWPFTableRow row : table.getRows()) {
                    XWPFTableRow newRow = newTable.createRow();
                    for (XWPFTableCell cell : row.getTableCells()) {
                        XWPFTableCell newCell = newRow.createCell();
                        newCell.getCTTc().setTcPr(cell.getCTTc().getTcPr());
                        for (XWPFParagraph paragraph : cell.getParagraphs()) {
                            XWPFParagraph newParagraph = newCell.addParagraph();
                            newParagraph.getCTP().setPPr(paragraph.getCTP().getPPr());
                            for (XWPFRun run : paragraph.getRuns()) {
                                XWPFRun newRun = newParagraph.createRun();
                                newRun.getCTR().setRPr(run.getCTR().getRPr());
                                newRun.setText(run.getText(0));
                            }
                        }
                    }
                }
            }

            FileOutputStream output = new FileOutputStream("new.docx");
            newDoc.write(output);

            sourceDoc.close();
            newDoc.close();
            output.close();

            System.out.println("문서가 성공적으로 복사되었습니다.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

위의 코드는 “source.docx”라는 이름의 원본 Word 문서를 읽어와서 “new.docx”라는 이름의 복사본을 생성합니다. 새로 생성된 복사본은 원본 문서의 모든 텍스트와 테이블을 동일하게 포함하고 있습니다. 생성된 복사본은 현재 디렉토리에 저장되며, 필요에 따라 경로를 변경할 수 있습니다.

3. 실행 결과

위의 코드를 실행하면 원본 문서의 내용과 동일한 “new.docx”라는 이름의 Word 문서가 생성됩니다. 이렇게 복사된 문서를 원하는 대로 수정하거나 저장할 수 있습니다.

참고 자료