poi-tl 소개 및 텍스트/표 및 이미지 렌더링

1. poi-tl 소개

아래 소개는 공식 문서에서 가져온 것입니다.

공식 문서: http://deepoove.com/poi-tl/#_why_poi_tl

1. 소개

poi-tl(poi 템플릿 언어)은 Word 템플릿과 데이터를 사용하여 멋진 Word 문서를 만드는 Word 템플릿 엔진입니다.

poi-tl은 Apache POI를 기반으로 하는 Word 템플릿 엔진입니다. 무료 오픈 소스 Java 클래스 라이브러리이기도 합니다. 프로젝트에 쉽게 추가할 수 있으며 멋진 기능을 제공합니다.

V1.12.x版本作了一个不兼容的改动,升级的时候需要注意:

  • PictureRenderData를 리팩토링하여 추상 클래스로 변경, 사진 데이터 생성은 Pictures factory 메소드 사용 권장

2. poi-tl과 poi의 차이점

poi-tl과 poi의 차이점:

여기에 이미지 설명 삽입

3. 빠른 시작

poi-tl에서 사용하는 일반적인 단계:

  1. 종속성 소개
<dependency>
  <groupId>com.deepoove</groupId>
  <artifactId>poi-tl</artifactId>
  <version>1.12.1</version>
</dependency>
  1. 템플릿 정의

模板是Docx格式的Word文档, Microsoft Office, WPS Office, Pages 등과 같은 템플릿을 만들기 위해 원하는 소프트웨어를 사용하거나 Apache POI 코드를 사용하여 템플릿을 생성할 수 있습니다.

템플릿은 스타일이며 코드도 스타일을 설정할 수 있습니다.

모든 태그는 로 끝나고 { {开头,以}}태그는 머리글, 바닥글, 테이블 내부, 텍스트 상자 등을 포함하여 어디에나 나타날 수 있습니다. 테이블 레이아웃은 많은 우수하고 전문적인 문서를 디자인할 수 있으며 테이블 레이아웃을 권장합니다.

레이블은 앞뒤에 2개의 중괄호로 구성되며, { {제목}}은 레이블, { {?제목}}도 레이블, 제목은 레이블의 이름, ? 물음표는 레이블의 유형을 식별하며, 테이블, 그림 또는 사용자 지정 레이블과 같은.

일반적으로 오프라인에서 템플릿 형식을 정의합니다. 예: 새 Word 문서 template.docx를 만들면 파일 내용은 다음과 같습니다.
여기에 이미지 설명 삽입

  1. 데이터 투입

데이터는 해시 또는 사전과 유사하며 맵 구조(키는 레이블 이름) 또는 객체(속성 이름은 레이블 이름)일 수 있습니다.

  1. 출력 템플릿

다음과 같이 템플릿을 출력하는 방법에는 여러 가지가 있습니다.

  • 출력 스트림 | 파일 스트림 등의 형태로 출력 마지막으로 이 스트림을 닫는 것을 잊지 마십시오.

데모 시작하기:

XWPFTemplate template = XWPFTemplate.compile("template.docx").render(
  new HashMap<String, Object>(){
    
    {
    
    
    put("title", "Hi, poi-tl Word模板引擎");
}});  
template.writeAndClose(new FileOutputStream("output.docx")); 

2. 텍스트/표 및 이미지 렌더링

다음은 텍스트, 표 및 그림의 렌더링에 대한 간략한 소개입니다.

1. 텍스트

텍스트 태그: { {var}}

데이터 모델:

  • 문자열: 텍스트
  • TextRenderData : 스타일이 지정된 텍스트
  • HyperlinkTextRenderData : 하이퍼링크 및 앵커 텍스트
  • 개체: toString() 메서드를 호출하여 텍스트로 변환
put("name", "Sayi");
put("author", new TextRenderData("000000", "Sayi"));
put("link", new HyperlinkTextRenderData("website", "http://deepoove.com"));
put("anchor", new HyperlinkTextRenderData("anchortxt", "anchor:appendix1"));

// 还提供了更加优雅的工厂 Texts 和链式调用的方式轻松构建文本模型。
put("author", Texts.of("Sayi").color("000000").create());
put("link", Texts.of("website").link("http://deepoove.com").create());
put("anchor", Texts.of("anchortxt").anchor("appendix1").create());

POI-TL 템플릿은 스타일이며 일반적으로 템플릿 문서는 스타일을 설정할 수 있으며 코드를 처리할 필요가 없습니다.

2. 양식

#로 시작하는 테이블 태그: { {#var}}

데이터 모델:

  • TableRenderData

推荐使用工厂 Tables 、 Rows 和 Cells 构建表格模型。

// 第0行居中且背景为蓝色的表格
RowRenderData row0 = Rows.of("姓名", "学历").textColor("FFFFFF")
      .bgColor("4472C4").center().create();
RowRenderData row1 = Rows.create("李四", "博士");
put("table1", Tables.create(row0, row1));

3. 사진

@로 시작하는 이미지 태그: { {@var}}

데이터 모델:

  • 문자열 : 이미지 URL 또는 로컬 경로, 이미지 크기는 기본적으로 사용됩니다.
  • PictureRenderData
  • ByteArrayPictureRenderData
  • FilePictureRenderData
  • UrlPictureRenderData

推荐使用工厂 Pictures 构建图片模型。

// 指定图片路径
put("image", "logo.png");
// svg图片
put("svg", "https://img.shields.io/badge/jdk-1.6%2B-orange.svg");

// 设置图片宽高
put("image1", Pictures.ofLocal("logo.png").size(120, 120).create());

// 图片流
put("streamImg", Pictures.ofStream(new FileInputStream("logo.jpeg"), PictureType.JPEG)
  .size(100, 120).create());

// 网络图片(注意网络耗时对系统可能的性能影响)
put("urlImg", Pictures.ofUrl("http://deepoove.com/images/icecream.png")
  .size(100, 100).create());

// java图片
put("buffered", Pictures.ofBufferedImage(bufferImage, PictureType.PNG)
  .size(100, 100).create());

4. 예제 템플릿 데모

예제 데모, 렌더링 텍스트, 표 및 그림.

1) 새 템플릿 문서 만들기 template document.docx

여기에 이미지 설명 삽입

2) 전체 코드는 다음과 같습니다.

public class PoiWordTest1 {
    
    


    private static void createTemplateData() throws IOException {
    
    
        String dirName = "D:\\TempFiles\\poitl";
        String templateFileName = "template文档.docx";
        String outFileName = "output文档.docx";

        // 模板数据
        Map<String, Object> templateData = new HashMap<>();

        // 1.文本
        templateData.put("txt1", "测试文本1");
        templateData.put("txt2", "测试文本2");
        templateData.put("table1Name", "测试table1Name");
        templateData.put("img1Name", "测试img1Name");

        // 2.表格
        List<TableInfo> tableInfoList = new ArrayList<>();
        tableInfoList.add(new TableInfo("类型1", 3001, new BigDecimal("19.484")));
        tableInfoList.add(new TableInfo("类型2", 180, new BigDecimal("1.10")));
        tableInfoList.add(new TableInfo("类型3", 2000, new BigDecimal("19.485")));
        tableInfoList.add(new TableInfo("类型4", 180, new BigDecimal("1.100")));

        tableInfoList = tableInfoList.stream().sorted(Comparator.comparingInt(TableInfo::getInfoCount).reversed()).collect(Collectors.toList());
        String[] tableHeader = new String[]{
    
    "序号", "类型", "数量", "百分比"};
        createTable(templateData, tableHeader, tableInfoList);

        // 3.图片
        String fileName = "b1.jpg";
        FileInputStream inputStream = new FileInputStream(dirName + File.separator + fileName);
        templateData.put("img1", Pictures.ofStream(inputStream, PictureType.PNG)
                .size(200, 220)
                .create());

        // 4. 创建模板,输出模板
        XWPFTemplate template = XWPFTemplate.compile(dirName + File.separator + templateFileName)
                .render(templateData);
        template.writeAndClose(new FileOutputStream(dirName + File.separator + outFileName));
    }

    private static void createTable(Map<String, Object> templateData, String[] tableHeader, List<TableInfo> tableInfoList) {
    
    
        // 表格
        RowRenderData tableHeaderRow = Rows.of(tableHeader).bgColor("BDDCE6").center().create();

        RowRenderData[] rowRenderData = new RowRenderData[tableInfoList.size() + 1];
        rowRenderData[0] = tableHeaderRow;
        for (int i = 0; i < tableInfoList.size(); i++) {
    
    
            TableInfo tableInfo = tableInfoList.get(i);
            String type = tableInfo.getType();
            Integer infoCount = tableInfo.getInfoCount();
            BigDecimal ratio = tableInfo.getRatio();

            String infoCountStr = infoCount == null ? "" : String.valueOf(infoCount);
            // 保留两位小数
            String ratioStr = bigDecimal2Str(ratio, 2);
            if (StringUtils.isNotBlank(ratioStr)) {
    
    
                ratioStr = ratioStr + "%";
            }

            RowRenderData rowData = Rows.create(String.valueOf(i + 1), type, infoCountStr, ratioStr);
            rowRenderData[i + 1] = rowData;
        }

        // 一个几行4列的表格
        templateData.put("table1Info", Tables.create(rowRenderData));

    }

    /**
     * 转string,四舍五入
     *
     * @param value
     * @param newScale - 保留几位小数,默认2
     * @return
     */
    private static String bigDecimal2Str(BigDecimal value, Integer newScale) {
    
    
        if (value == null) {
    
    
            return "";
        }
        newScale = newScale == null ? 2 : newScale;
        BigDecimal bigDecimal = value.setScale(newScale, BigDecimal.ROUND_HALF_UP);
        return bigDecimal.toString();
    }

    public static void main(String[] args) throws IOException {
    
    
        createTemplateData();
    }

}

3) 출력 문서:

여기에 이미지 설명 삽입

注意:

  • 사진은 기본적으로 포함되어 있는데, 텍스트 위에 떠서 사용하려는 경우 블로거는 아직 방법을 찾지 못했습니다.

여기에 이미지 설명 삽입

위의 파일은 모두 로컬입니다. 아래에 일반적인 방법을 작성하십시오. 템플릿 스트림, 출력은 템플릿 스트림을 생성하고 파일 시스템에 저장합니다.

        // 4. 创建模板,输出模板
        InputStream templateInput = getTemplateInputStream("文件ID"); //通过文件系统获取定义好的文件模板流
        XWPFTemplate template = XWPFTemplate.compile(templateInput).render(templateData);
        // 输出生成的模板流
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        template.writeAndClose(byteArrayOutputStream);

        // 保存生成的模板流文件到文件系统
        byte[] buffer = byteArrayOutputStream.toByteArray();
        InputStream saveInputStream = new ByteArrayInputStream(buffer);
        String outFileName = "output文档.docx";
        saveGenerateTemplateFile(saveInputStream, outFileName);

자세한 사용법은 공식 문서를 참조하세요.

– 지식에 굶주려 있다면, 어리석다면 겸손하십시오.

추천

출처blog.csdn.net/qq_42402854/article/details/130248645