본문 바로가기

잡다한 정보 Miscellaneous

JAVA to write MS word file, make columns in the page

이 포스트는 APACHE POI를 대체할 수 있는 docx4j api에 대한 소개로

이 API를 이용해 복잡한 형태의 MS word 파일을 JAVA로 다룰 수 있게 됩니다.

그리고 간단한 예제를 넣어보겠습니다.

   

(This post is replace APACHE POI with docx4j. 

This is an API can be used in JAVA programming.

And also gives some examples, 

especially writing and making multiple columns.

This blog is usually exposed to Koreans, 

so I will mix Korean and English in this post.)

   

영어가 들어가 있는 것은 제가 구글링 했을 때 다른 많은 분들도 단을 나누는 것에 대해 궁금해 했었는데

예제가 하나도 없었기 때문입니다. 그래서 예제를 제공하고자 한글 영어 섞어서 쓰겠습니다.

docx4j 라는 API가 있는데 이 API가 apache poi를 바탕으로 만들어졌고

apache poi 보다 쓰기가 편합니다. 또한 그 동안 apache poi의 소소한 버그들로

할 수 없었던 일들을 docx4j를 통해 이뤄낼 수 있었습니다.

apache poi에선 머리말 꼬리말 (영어로 header/footer 라고 합니다.)을 처리할 수 없었습니다.

이 버그는 이미 reporting 된 버그로 오늘이 2013 11 03 이므로 참고하시길 바랍니다.

그래서 docx4j를 선택해보았습니다.

docx4j 홈페이지 (go to docx4j homepage)

   

관련 jar파일은 http://www.docx4java.org/docx4j/docx4j-2.8.1.zip 

(download api use this link reference on this post is write in 2013-11-03. Probably there can be new updates.)

여기서 docx4j + all dependencies: docx4j-2.8.1.zip

docx4j에 연관되는 모든 jar파일을 다운로드 받아 프로젝트에 import 해야 합니다.(import download jar file on your project)

   

   

이제 docx4j를 이용할 준비는 모두 끝났습니다.

일단 여기까지도 apache api와는 딴판입니다. apache api땐 관련 jar파일을 모으느라고

꾸준히 구글링을 했어야 했는데 docx4j는 홈페이지에서 바로 제공을 해주고 있습니다.

docx4j로 간단한 파일을 만들어 보겠습니다.

   

(Below example write on you C drive and make MS word file named 'simple2.docx'.)

   

public class test{

    private static WordprocessingMLPackage wordMLPackage = null;

    private static WordprocessingMLPackage wordMLPackage = null;

   

    public static void main(String[] args) {

        wordMLPackage = WordprocessingMLPackage.createPackage();

        wordMLPackage.getMainDocumentPart().addParagraphOfText("Hello World!");

        wordMLPackage.save(new java.io.File("C:\\simple2.docx"));

    }

}

   

위 코드는 C드라이브에 simple2.docx를 만드는데 이 파일 안에는 Hello World! 라고 출력이 되어 있습니다.

   

그리고 가장 얻고 싶었던 단 나누기 코드입니다.

(Here is split working page with multiple columns. 

If you want to make more columns modifying number 2 in argument of BigInteger object.)

   

import java.math.BigInteger;

import java.util.List;

   

import org.docx4j.model.structure.SectionWrapper;

import org.docx4j.openpackaging.exceptions.Docx4JException;

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

import org.docx4j.wml.CTColumns;

import org.docx4j.wml.SectPr;

   

public class test{

    private static WordprocessingMLPackage wordMLPackage = null;

    private static org.docx4j.wml.ObjectFactory factory=null;

   

    public static void main(String[] args) throws Docx4JException {

        wordMLPackage = WordprocessingMLPackage.createPackage();

        wordMLPackage.getMainDocumentPart().addParagraphOfText("Hello World!");

        setColumns();        

          

        wordMLPackage.save(new java.io.File("C:\\simple3.docx"));

    }

   

    public static void setColumns(){

        List<SectionWrapper> sections = wordMLPackage.getDocumentModel().getSections();

          

        SectPr sectionProperties = sections.get(sections.size() - 1).getSectPr();

        if(sectionProperties==null){

            sectionProperties = factory.createSectPr();

            wordMLPackage.getMainDocumentPart().addObject(sectionProperties);

            sections.get(sections.size() - 1).setSectPr(sectionProperties);

        }

          

        CTColumns ctcol = new CTColumns();

        BigInteger colnum = new BigInteger("2");

          

        ctcol.setNum(colnum);

        sectionProperties.setCols(ctcol);

    }

}

   

이 코드는 C드라이브에 simple3.docx를 생성합니다.

simple3.docx의 모습입니다.

(Above code makes 'simple3.docx' on your C drive. Below one is the result.)