1. 워드 파일 생성
File templateFile = new File(path, templateFileName);
XWPFDocument doc = new XWPFDocument(new FileInputStream(templateFile));
2. 테이블 생성(기존 템플릿 테이블 사용 시 POIWordUtil.copyTable() 사용 가능)
XWPFTable tbl = doc.createTable();
POIWordUtil.copyTable(templateTable, tbl);
XWPFTable tbl = doc.createTable();
XWPFTableRow row = tbl.createRow(); // 이미 존재하는 XWPFTableRow 삽입 시 addRow() 사용 가능
XWPFTableCell cell = row.createCell();
XWPFParagraph para = cell.addParagraph();
XWPFRun = para.createRun();
3. 템플릿 테이블 제거
XWPFDocument의 모든 요소(Paragraph, Table)는 위치 정보를 가진다. 이 때 Run, Image 등은 항상 Paragraph 내에 들어가기 때문에 Paragraph를 찾고 그 내부에서 다시 요소를 찾아야 한다.
int position = doc.getPosOfTable(templateTable);
doc.removeBodyElement(position);
4. 페이지 변경
새로운 문단을 추가하고 이 문단에 텍스트를 추가하되 해당 텍스트에 페이지 넘김에 해당하는 Break를 추가해준다.
XWPFRun run = doc.createParagraph().createRun();
run.addBreak(BreakType.PAGE);
5. 파일 다운로드
현재 브라우저에서 로컬 사용자의 다운로드 경로를 지정하는 기능은 막혔다고 알고 있다. 때문에 서버에서 파일을 임시로 저장해서 이를 사용자에게 다운로드 시키거나(여러 파일의 경우에는 zip으로 묶어 처리하고 있다.) 아래와 같이 HttpServletResponse의 OutputStream에 바로 작성해 내보내는 경우도 있다. 이 때 스크립트 단에서는 $.fileDownload() 함수를 통해 해당 핸들러를 호출해둔 상태다.($.fileDownload 함수에 대해서는 후에 다시 별도의 게시글을 작성할 예정이다.)
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
response.setHeader("Content-Disposition", "attachment;filename=\"" + fileName + "\";");
response.setHeader("Set-Cookie", "fileDownload=true; path=/"); // 이는 사용하지 않아도 무관하다.
doc.write(response.getOutputStream());
doc.close();
response.getOutputStream().close();
Cf) 파워포인트 파일의 경우에도 나머지는 동일하게 하되, response의 ContentType을 아래와 같이 지정하면된다.
"application/vnd.ms-powerpoint"
response.setContentType("application/vnd.ms-powerpoint");
소소한 이슈
템플릿 기반 워드 파일 작성 시 템플릿 테이블들을 카피해 데이터를 넣은 테이블 생성 후 템플릿 테이블들을 삭제하다보니 공백 개행이 여러 개 남아있게 되었다. (테이블 간에 개행이 없으면 테이블이 합쳐지는 문제 때문에 개행 없이 템플릿 작성 불가 – 마이크로 워드의 버전 문제일 수도 있음. 현재 2007버전)
이를 해결하고자 문서의 Paragraph들을 모두 가져와 해당 텍스트가 내가 임의로 지정해둔 제거할 개행 줄 표시 텍스트와 일치하면 제거하도록 했으나, 일부만 제거되는 문제 존재(doc.removeBodyElement를 통해 제거하려 했으나 6개의 Paragraph 중 3개만 삭제되는 문제가 발생했다. 이는 인덱스가 당겨지는 문제 때문일 것으로 생각하여 뒤 인덱스부터 제거함으로써 해결했다.
List<XWPFParagraph> paraList = doc.getParagraphs();
for(int k = paraList.size() - 1; k >= 0 ; k--) {
if(paraList.get(k).getRuns() != null && paraList.get(k).getRuns().size() > 0) {
for(int m = paraList.get(k).getRuns().size() - 1; m >= 0 ; m--) {
String txt = paraList.get(k).getRuns().get(m).getText(0);
if(txt != null && txt.length() > 0 && txt.contains("--removeContent")) {
paraList.get(k).removeRun(m);
doc.removeBodyElement(doc.getPosOfParagraph(paraList.get(k)));
}
}
}
}
MicroSoft 문서 타입에 따른 데이터 타입
파워포인트 | 워드 | 엑셀 | |
파일 클래스 |
XMLSlideShow (XSLFSlideShow 아님에 주의) |
XWPFDocument | XSSFWorkbook |
한 페이지 | XSLFSlide | (페이지 변경은 XWPFRun을 통해 가능) XWPFRun run = document.createParagraph().createRun(); run.addBreak(BreakType.PAGE); |
XSSFSheet |
테이블 | XSLFTable | XWPFTable | |
XSLFTable 템플릿 사용 시 POIUtil.copyTable() |
XWPFTable 템플릿 사용 시 POIWordUtil.copyTable() 사용 |
||
로우 | XSLFTableRow | XWPFTableRow | |
셀 | XSLFTableCell | XWPFTableCell | XSSFCell |
문단 | XSLFTextParagraph | XWPFParagraph | |
텍스트 | XSLFTextRun | XWPFRun | |
이미지 | XWPFRun에 addPicture() 사용 |
'Backend > Spring' 카테고리의 다른 글
Spring) 이미지 데이터(BLOB 타입)을 데이터베이스에서 가져와서 파일화하기 (0) | 2022.01.16 |
---|---|
Spring) 바이너리 파일을 DB에 저장 후 요청에 의해 바로 다운로드하기 (0) | 2021.12.06 |
Spring) Poi와 Jxls를 사용해 Template을 이용한 파워포인트 다운로드 -2. 테이블 작성 (0) | 2021.11.28 |
Spring) Poi와 Jxls를 사용해 Template을 이용한 파워포인트 다운로드 (0) | 2021.11.21 |
Spring) JXLS, POI 버전 문제 (0) | 2021.10.17 |