5 2. 아래아 한글로 내보내기
hanmj edited this page 7 months ago

데이터를 아래아 한글 파일로 저장하려면

  • 아래아 한글 템플릿 파일을 작성
  • kr.dogfoot.hwplib.object.HWPFile을 로드
  • cokr.xit.base.docs.hwp.HWPWriter를 생성 후 HWPFile 설정
  • 데이터를 설정

한다.

다음 설명은 테스트를 위해 제공한 템플릿 파일프로그램을 사용해서 한다.

템플릿

데이터를 아래아 한글 파일로 저장하려면 템플릿 파일을 작성해야 한다.

데이터 설정방법은 테스트 프로그램에서 사용하는 템플릿 파일을 예제로 설명한다.

데이터 개별 설정

  • 데이터를 하나씩 설정할 때는 누름틀을 사용한다.
  • 테이블의 셀에 데이터를 설정할 때는 누름틀이나 필드이름을 사용한다.

예제파일의 경우

  • 머리말의 출력자, 출력일자 항목은 테이블 0 내부에 누름틀 '사용자', '출력일자'로 설정한다.
  • 테이블 1의 성명, 주민번호, 주소, 총건수, 총금액 항목은 각각 누름틀로 설정한다.

테이블 행(row) 데이터 설정

조회결과와 같이 일정한 레이아웃의 데이터를 테이블에 행으로 반복되는 형태로 설정할 경우, 테이블의 셀에 누름틀이나 필드이름을 사용한다.

테이블의 셀 하나에

  • 데이터를 하나씩 설정할 때는 필드이름을 사용한다.
  • 데이터 여러 개를 설정할 때는 누름틀을 사용한다.

예제파일의 경우

테이블 2의 row template으로 표시된 부분은 조회결과 한 행의 데이터를 반복해서 설정하는 영역으로

  • '과태료', '시군구명', '단속일시', '단속장소', 차량번호', 그리고 '대체차량번호'는 누름틀로 설정한다.
  • '고지번호', '금액', '가상계좌번호', '전자납부번호', '처리상태', '처리일자', '납부기한', '수납일자', '단속사진'은 셀의 필드 이름을 설정한다.

HWPWriter

HWPWriter는 다음과 같이 초기화 한다.

HWPFile file = HWPWriter.filepath("...\\hwp-test.hwp");
HWPWriter hwp = new HWPWriter(file);

파일 쓰기

파일 저장

아래아 한글파일을 저장하려면 HWPWriter.write(String)을 사용한다.

hwp.write("C:\\my-dir\\아래아 한글파일.hwp");

다운로드

'downloadView'로 다운로드하려면 콘트롤러의 메소드에서 다음과 같이 한다.

public ModelAndView doSomething(...) {
    HWPWriter hwp = ...
    ....
    return new ModelAndView("downloadView")
        .addObject("download", hwp.getDownloadable().setFilename("아래아 한글파일.hwp"));
}

AbstractController를 상속하는 콘트롤러에서 직접 다운로드하려면 다음과 같이 한다.

public void doSomething(..., HttpServletResponse hresp) {
    HWPWriter hwp = ...
    ....
    download(hwp.getDownloadable().setFilename("아래아 한글파일.hwp"), hresp);
}

데이터 설정

데이터 개별 설정

데이터를 하나씩 설정할 때는 HWPWriter.setValue(String, Object...)를 사용한다. 이 때 setValue(...)의 첫번째 인자는 누름틀, 또는 필드의 이름이다.

다음 예에서 '사용자', '출력일자', '성명', '주민번호', '주소', '총건수', '총금액'은 누름틀의 이름이다.

String
    userName = "이몽룡",
    today = DataFormat.yyyy_mm_dd("20240312"),

    name = "홍길동",
    residentNo = "1234567890123",
    address = "서울특별시 양천구";

int count = 20,
    amt = 100000,
    totalAmt = amt * count;

hwp.setValue("사용자",userName)
   .setValue("출력일자",today)

   .setValue("성명",name)
   .setValue("주민번호",residentNo)
   .setValue("주소",address)
   .setValue("총건수",count)
   .setValue("총금액",DataFormat.n_nn0(totalAmt));

다음은 위 코드가 실행한 결과다.

맵 데이터 설정

맵의 데이터를 설정할 때는 HWPWriter.setValues(Map)를 사용한다. 이 때 맵의 키는 누름틀의 이름이다.

위 코드에서 반복되는 setValue(...) 구문은 다음처럼 쓸 수 있다.

hwp.setValues(Map.of(
    "사용자", userName,
    "출력일자", today,

    "성명", name,
    "주민번호", residentNo,
    "주소", address,
    "총건수", count,
    "총금액", DataFormat.n_nn0(totalAmt)
));

객체 데이터 설정

객체의 데이터를 설정할 때는 HWPWriter.setValues(T, Map)를 사용한다.

위 코드를 객체의 데이터를 설정하도록 수정하면 다음과 같다.

static class TestObject {
    private String
        name,
        residentNo,
        address;
    private int totalCount;
    private long totalAmt;
    
    //Getters & Setters
    ...
}

hwp.setValues(Map.of(
    "사용자", userName,
    "출력일자", today
));

TestObject tobj = new TestObject()
    .setName(name)
    .setResidentNo("123456780123")
    .setAddress(address)
    .setTotalCount(count)
    .setTotalAmt(totalAmt);

hwp.setValues(
    tobj,
    Map.of(
        "성명", TestObject::getName,
        "주민번호", TestObject::getResidentNo,
        "주소", TestObject::getAddress,
        "총건수", TestObject::getTotalCount,
        "총금액", (obj) -> DataFormat.n_nn0(obj.getTotalAmt())
    )
);

위 코드에서 setValues(...)에 두번째 인자로 제공하는 맵의 키는 누름틀의 이름이다.

맵 데이터 목록 설정

맵 목록의 데이터를 테이블에 설정하려면

  • HWPWriter.table(...) 메소드로 Table을 받은 후
  • Table.setValues(Iterable)에 목록을 전달하여 호출한다.

다음은 예제파일의 세번째 테이블(테이블 2)에 맵 데이터를 설정하는 예다.

여기서 맵(DataObject)의 키는 누름틀, 또는 셀의 필드이름이다.

String
    filepath1 = "...\\4148020220006850A.jpg",
    filepath2 = "...\\4148020220006869A.jpg";

List<DataObject> list = IntStream.range(0, count).boxed().map(i ->
    (DataObject)new DataObject()
        .set("과태료", "과태료 " + i)
        .set("단속일시", "단속일시 " + i)
        .set("차량번호", "123가456" + (i % 10))
        .set("고지번호", "고지번호 " + i)
        .set("금액", DataFormat.n_nn0(amt))
        .set("가상계좌번호", "가상계좌번호 " + i)
        .set("처리상태", "처리상태 " + i)
        .set("처리일자", "처리일자 " + i)
        .set("시군구명", "시군구명 " + i)
        .set("단속장소", "단속장소 " + i)
        .set("대체차량번호", "234나567" + (i % 10))
        .set("전자납부번호", "전자납부번호 " + i)
        .set("납부기한", "납부기한 " + i)
        .set("수납일자", "수납일자 " + i)
        .set("단속사진", hwp.image().add(i % 2 == 0 ? filepath1 : filepath2)) // 이미지 설정
).toList();

hwp.table(2, 3, 4) // 세번째(인덱스 = 2) 테이블, row template은 4행(인덱스 = 3)부터 4행
   .setValues(list);

이미지 설정

테이블 셀의 필드이름에 이미지를 설정하려면

  • HWPWriter.image() 메소드로 Image를 받은 후
  • 'Image.add(String)' 메소드로 경로를 전달하여 호출한다.