Apache POI 기반의 템플릿으로 단어(docx)를 생성하는 더 나은 방법입니다.
FreeMarker 또는 Velocity는 텍스트 템플릿 및 데이터를 기반으로 새로운 HTML 페이지 또는 구성 파일을 생성합니다. poi-tl은 Word 템플릿 과 데이터를 기반으로 새 문서를 생성하는 Word 템플릿 엔진입니다.
Word 템플릿에는 다양한 스타일이 있습니다. Poi-tl은 생성된 문서의 템플릿 스타일을 완벽하게 유지합니다. 태그 스타일을 설정할 수도 있습니다. 교체된 텍스트에 태그 스타일이 적용되므로 템플릿 디자인에 집중할 수 있습니다.
poi-tl은 "논리 없는" 템플릿 엔진입니다. 복잡한 제어 구조와 변수 할당이 없으며 태그 만 있고 일부 태그는 텍스트, 그림, 표 등으로 대체될 수 있으며 일부 태그는 일부 문서 내용을 숨기고 다른 태그는 일련의 문서 내용을 반복합니다.
변수 할당이나 조건문과 같은 "강력한" 구조를 사용하면 템플릿 시스템 내에서만 애플리케이션의 모양을 쉽게 수정할 수 있습니다. 그러나 분리 비용을 들여 템플릿 자체를 애플리케이션 로직의 일부로 전환합니다.
《구글 C템플릿》
poi-tl은 사용자 정의 기능(플러그인)을 지원하고, 기능은 Word 템플릿의 어느 곳에서나 실행될 수 있으며, 문서의 어느 곳에서나 무엇이든 수행하는 것이 poi-tl의 목표입니다.
특징 | 설명 |
---|---|
✅ 텍스트 | 태그를 텍스트로 렌더링 |
✅ 사진 | 태그를 그림으로 렌더링 |
✅ 테이블 | 태그를 테이블로 렌더링 |
✅ 번호 매기기 | 태그를 번호 매기기로 렌더링 |
✅ 차트 | 막대 차트(3D 막대 차트), 세로 막대형 차트(3D 세로 막대형 차트), 영역 차트(3D 영역 차트), 라인 차트(3D 라인 차트), 방사형 차트, 파이 차트(3D 원형 그림) 및 기타 차트 렌더링 |
✅ 조건이 있는 경우 | 조건에 따라 특정 문서 콘텐츠(텍스트, 단락, 그림, 표, 목록, 차트 등 포함)를 숨기거나 표시합니다. |
✅ Foreach 루프 | 컬렉션에 따라 특정 문서 콘텐츠(텍스트, 단락, 그림, 표, 목록, 차트 등 포함)를 반복합니다. |
✅ 루프 테이블 행 | 렌더링된 테이블의 행을 복사하는 루프 |
✅ 루프 테이블 열 | 테이블의 열을 반복 복사하고 렌더링합니다. |
✅ 루프 순서 목록 | 순서가 지정된 목록의 루프를 지원하고 동시에 다단계 목록을 지원합니다. |
✅ 하이라이트 코드 | 26개 언어와 수백 가지 색상 스타일을 지원하는 코드 블록의 단어 강조 표시 |
✅ 마크다운 | 마크다운을 워드 문서로 변환 |
✅ 단어 첨부 | Word에 첨부 파일 삽입 |
✅ 단어 댓글 | 지원 댓글 완성, 댓글 작성, 댓글 수정 등을 할 수 있습니다. |
✅ 워드 SDT | 완전한 지원 구조화된 문서 태그 |
✅ 텍스트 상자 | 텍스트 상자의 태그 지원 |
✅ 사진 교체 | 원본 사진을 다른 사진으로 교체 |
✅ 북마크, 앵커, 하이퍼링크 | 문서의 북마크, 앵커 및 하이퍼링크 설정 지원 |
✅ 표현 언어 | SpringEL 표현식을 완벽하게 지원하며 OGNL, MVEL 등 더 많은 표현식을 확장할 수 있습니다. |
✅ 스타일 | 템플릿이 스타일이고 코드로 스타일을 설정할 수도 있습니다. |
✅ 템플릿 중첩 | 템플릿에는 하위 템플릿이 포함되고, 하위 템플릿에는 하위 템플릿이 포함됩니다. |
✅ 병합 | 워드 병합 병합, 지정된 위치에서 병합도 가능합니다 |
✅ 사용자 정의 기능(플러그인) | 플러그인 설계, 문서 내 어디에서나 기능 실행 |
< dependency >
< groupId >com.deepoove</ groupId >
< artifactId >poi-tl</ artifactId >
< version >1.12.2</ version >
</ dependency >
참고: poi-tl
1.12.x
POI 버전5.2.2+
필요합니다.
매우 간단한 예부터 시작하세요. {{title}}
"poi-tl 템플릿 엔진"으로 바꾸세요.
{{title}}
콘텐츠를 포함하여 새 문서 template.docx
만듭니다. //The core API uses a minimalist design, only one line of code is required
XWPFTemplate . compile ( "template.docx" ). render ( new HashMap < String , Object >(){{
put ( "title" , "poi-tl template engine" );
}}). writeToFile ( "out_template.docx" );
out_template.docx
문서를 열면 모든 것이 원하는 대로 됩니다.
태그는 두 개의 중괄호로 구성됩니다. {{title}}
도 태그이고, {{?title}}
도 태그이고, title
태그의 이름이고, ?
태그 유형을 식별합니다. 다음으로 어떤 태그 유형이 있는지 살펴보겠습니다.
텍스트 태그는 Word 템플릿에서 가장 기본적인 태그 유형입니다. {{name}}
데이터 모델의 키 name
값으로 대체됩니다. 키가 존재하지 않으면 태그가 지워집니다(프로그램은 태그를 유지할지 또는 예외를 발생시킬지 여부를 구성할 수 있습니다).
다음 예와 같이 텍스트 태그의 스타일이 대체된 텍스트에 적용됩니다.
암호:
put ( "name" , "Mama" );
put ( "thing" , "chocolates" );
주형:
{{name}}님은 항상 인생은 {{thing}} 상자와 같다고 말씀하셨습니다.
산출:
엄마는 늘 인생은 초콜릿 상자와 같다고 말씀하셨어요.
이미지 태그는 @
로 시작합니다. 예를 들어 {{@logo}}
데이터 모델에서 logo
키로 값을 찾은 다음 태그를 이미지로 바꿉니다. 이미지 태그에 해당하는 데이터는 간단한 URL이나 경로 문자열이거나 이미지의 너비와 높이를 포함하는 구조일 수 있습니다.
암호:
put ( "watermelon" , "assets/watermelon.png" );
put ( "watermelon" , "http://x/lemon.png" );
put ( "lemon" , Pictures . ofLocal ( "sob.jpeg" , PictureType . JPEG ). size ( 24 , 24 ). create ());
주형:
Fruit Logo:
watermelon {{@watermelon}}
lemon {{@lemon}}
banana {{@banana}}
산출:
Fruit Logo:
watermelon ?
lemon ?
banana ?
테이블 태그는 #
으로 시작합니다(예: {{#table}}
. N 행과 N 열이 있는 Word 테이블로 렌더링됩니다. N의 값은 table
태그의 데이터에 따라 달라집니다.
암호:
put ( "table" , Tables . of ( new String [][] {
new String [] { "Song name" , "Artist" }
}). border ( BorderStyle . DEFAULT ). create ());
주형:
{{#table}}
산출:
노래 이름 | 아티스트 |
목록 태그는 {{*number}}
와 같이 *
로 시작하는 Word의 기호 목록 또는 번호 매기기 목록에 해당합니다.
암호:
put ( "list" , Numberings . create ( "Plug-in grammar" ,
"Supports word text, pictures, table..." ,
"Template, not just template, but also style template" ));
주형:
{{*list}}
산출:
● Plug-in grammar
● Supports word text, pictures, table...
● Templates, not just templates, but also style templates
섹션은 전후의 두 개의 태그로 구성되며 시작 태그는 ?
로 식별됩니다. , 종료 태그는 /
로 식별됩니다. 예를 들어 {{?section}}
은 섹션 블록의 시작 태그이고, {{/section} }
는 종료 태그이고, section
이 섹션의 이름입니다.
섹션은 일련의 문서 요소를 처리할 때 매우 유용합니다. 섹션에 있는 문서 요소(텍스트, 그림, 표 등)는 섹션 값에 따라 0회, 1회 또는 N회 렌더링될 수 있습니다.
섹션의 값이 null
, false
또는 빈 컬렉션인 경우 if 문의 조건이 false
인 것과 유사하게 섹션에 있는 모든 문서 요소가 표시되지 않습니다 .
데이터 모델:
{
"announce" : false
}
주형:
Made it,Ma!{{?announce}}Top of the world!{{/announce}}
Made it,Ma!
{{?announce}}
Top of the world!?
{{/announce}}
산출:
Made it,Ma!
Made it,Ma!
섹션의 값이 null
, false
아니고 컬렉션이 아닌 경우 섹션의 모든 문서 요소는 if 문의 조건이 true
인 것과 유사하게 한 번 렌더링 됩니다.
데이터 모델:
{
"person" : { "name" : " Sayi " }
}
주형:
{{?person}}
Hi {{name}}!
{{/person}}
산출:
Hi Sayi!
섹션의 값이 비어 있지 않은 컬렉션인 경우 섹션의 문서 요소는 foreach 구문과 유사하게 컬렉션 크기에 따라 한 번 또는 N 번 반복 됩니다.
데이터 모델:
{
"songs" : [
{ "name" : " Memories " },
{ "name" : " Sugar " },
{ "name" : " Last Dance " }
]
}
주형:
{{?songs}}
{{name}}
{{/songs}}
산출:
Memories
Sugar
Last Dance
루프에서 특수 태그 {{=#this}}
사용하여 현재 반복의 객체를 직접 참조할 수 있습니다.
데이터 모델:
{
"produces" : [
" application/json " ,
" application/xml "
]
}
주형:
{{?produces}}
{{=#this}}
{{/produces}}
산출:
application/json
application/xml
중첩은 Word 템플릿에 다른 Word 템플릿을 병합하는 것으로, 가져오기, 포함 또는 단어 문서 병합으로 이해될 수 있으며, {{+nested}}
와 같이 +
로 표시됩니다.
암호:
class AddrModel {
String addr ;
public AddrModel ( String addr ) {
this . addr = addr ;
}
}
List < AddrModel > subData = new ArrayList <>();
subData . add ( new AddrModel ( "Hangzhou,China" ));
subData . add ( new AddrModel ( "Shanghai,China" ));
put ( "nested" , Includes . ofLocal ( "sub.docx" ). setRenderModel ( subData ). create ());
두 단어 템플릿:
main.docx:
Hello, World
{{+nested}}
하위.docx:
Address: {{addr}}
산출:
Hello, World
Address: Hangzhou,China
Address: Shanghai,China
중국어(중국어)
더 많은 예제와 모든 예제의 소스 코드를 보려면 JUnit 테스트 케이스를 참조하세요.
다음 방법에 국한되지 않고 다양한 방법으로 이 프로젝트에 참여할 수 있습니다.
FAQ를 참조하세요.