springboot整合poi-tl

什么是poi-tl

poi-tl(poi template language)是Word模板引擎,使用Word模板和数据创建很棒的Word文档。

在文档的任何地方做任何事情(Do Anything Anywhere)是poi-tl的星辰大海。

文档链接: Poi-tl Documentation

poi-tl的优势

在这里插入图片描述

poi-tl 能做什么

在这里插入图片描述
在这里插入图片描述

poi-tl 使用注意

poi-tl 是基于 Apache POI ,使用时请注意poi的版本依赖冲突问题!!
在这里插入图片描述

解决poi版本冲突

排除依赖慎用,请看官方的稳定版本支持的poi版本

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.7</version>
            <exclusions>
                <exclusion>
                    <groupId>javax.servlet</groupId>
                    <artifactId>servlet-api</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.poi</groupId>
                    <artifactId>poi-ooxml-schemas</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

添加依赖

        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.12.0</version>
        </dependency>

常用场景代码实现

模板截图

在这里插入图片描述
在这里插入图片描述

使用到的标签介绍

{{name1}} {{name2}} 为文本
在这里插入图片描述
{{@img1}} {{@img2}} {{@img3}} … 为图片
在这里插入图片描述
{{?dataList}} {{/dataList}} 为区块对
在这里插入图片描述

代码实现如下

import com.deepoove.poi.data.TextRenderData;

@lombok.Data
public class Data {

    private String name1;
    private String name2;
    /**
    * 对象里可以使用poi-tl提供的类
    **/
    private TextRenderData text;
    private String img1;
    private String img2;
    private String img3;
    private String img4;
    private String img5;


}
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.TextRenderData;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.deepoove.poi.util.PoitlIOUtils;
import com.zm.util.Word2PdfUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 操作word
 *
 * @author zhou
 */
@Slf4j
@RestController
public class PoiController {

   // http://localhost:8080/poi/tl
    @GetMapping("/poi/tl")
    public void poitl(HttpServletResponse response) {
        // 构建数据
        Map<String, Object> datas = getDataList();
        // dataList为要传入模板的 信息list
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        Configure config = Configure.builder()
                .bind("dataList", policy).build();
        try (ServletOutputStream out = response.getOutputStream();
             BufferedOutputStream bos = new BufferedOutputStream(out);
             //读取模板的文件流,并用datas替换模板标签
             XWPFTemplate template = XWPFTemplate.compile(new File("C:\\Users\\zhou\\Desktop\\土地供应情况-模板.docx"), config)
                     .render(datas);
        ) {
            String filename = "test.docx";
            response.setContentType("application/octet-stream");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
            //输出word文件流,输出后关闭流
            template.write(bos);
            bos.flush();
            out.flush();
            PoitlIOUtils.closeQuietlyMulti(template, bos, out);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private Map<String, Object> getDataList() {
        //将需要替换的内容赋值给datas
        Map<String, Object> datas = new HashMap<>();
        List<Data> data = new ArrayList<>();
        Data data1 = new Data();
        data1.setName1("地块选址位于【惠城区水口街道鹿岗片区1】,计算指标用地面积约【1111】平方米。");
        data1.setName2("【红线范围内有一般农地区、林业用地和其他用地区用地规模需调整落实。】");
        data1.setText(new TextRenderData("000000", "Sayi1"));
        data1.setImg1("D:/hcqgdxm/img/1.png");
        data1.setImg2("D:/hcqgdxm/img/2.png");
        data1.setImg3("D:/hcqgdxm/img/3.png");
        data1.setImg4("D:/hcqgdxm/img/4.png");
        data1.setImg5("D:/hcqgdxm/img/5.png");

        Data data2 = new Data();
        data2.setName1("地块选址位于【惠城区水口街道鹿岗片区2】,计算指标用地面积约【2222】平方米。");
        data2.setName2("【红线范围内有一般农地区、林业用地和其他用地区用地规模需调整落实。】");
        data2.setText(new TextRenderData("000000", "Sayi2"));
        data2.setImg1("D:/hcqgdxm/img/1.png");
        data2.setImg2("D:/hcqgdxm/img/2.png");
        data2.setImg3("D:/hcqgdxm/img/3.png");
        data2.setImg4("D:/hcqgdxm/img/4.png");
        data2.setImg5("D:/hcqgdxm/img/5.png");

        data.add(data1);
        data.add(data2);

        datas.put("dataList", data);
        return datas;
    }
}

结果展示

在这里插入图片描述

注意

使用区块对时,占位符 {{?dataList}} {{/dataList}} 为空格出现时,检查模板 清除占位符 {{?dataList}} {{/dataList}} 的格式,并看看空格是否去掉了

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring BootPoi-TL都是Java中非常流行的库,其中Spring Boot是一个用于构建基于Spring框架的Web应用程序的开源框架,而Poi-TL是一个基于Apache POI和Freemarker的模板引擎库,用于在Java代码中生成Word、Excel等文档。 如果你想在Spring Boot中使用Poi-TL,可以按照以下步骤进行操作: 1. 在Maven或Gradle中添加Poi-TL的依赖项: ``` <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.3.1</version> </dependency> ``` 2. 创建一个Word文档模板,可以使用Microsoft Word或其他支持.docx格式的软件创建。 3. 在Spring Boot应用程序中,创建一个Poi-TL的模板引擎对象并加载Word文档模板: ``` @Configuration public class PoiTlConfig { @Bean(name = "wordTemplateEngine") public TemplateEngine wordTemplateEngine() { ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver(); templateResolver.setSuffix(".docx"); templateResolver.setTemplateMode("LEGACYHTML5"); templateResolver.setCharacterEncoding("UTF-8"); TemplateEngine templateEngine = new TemplateEngine(); templateEngine.setTemplateResolver(templateResolver); return templateEngine; } } ``` 4. 在Spring Boot控制器中,使用Poi-TL生成Word文档并返回给客户端: ``` @RestController public class WordController { @Autowired @Qualifier("wordTemplateEngine") private TemplateEngine wordTemplateEngine; @GetMapping("/generateWord") public void generateWord(HttpServletResponse response) throws IOException { Context context = new Context(); context.setVariable("title", "Hello World"); context.setVariable("content", "This is a sample Word document generated using Poi-TL and Spring Boot."); response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); response.setHeader("Content-disposition", "attachment;filename=sample.docx"); OutputStream outputStream = response.getOutputStream(); InputStream inputStream = this.getClass().getResourceAsStream("/templates/sample.docx"); wordTemplateEngine.process(inputStream, context, outputStream); outputStream.flush(); } } ``` 在上面的示例中,我们首先注入了Poi-TL的模板引擎对象,然后在控制器中使用模板引擎来生成Word文档。我们还设置了响应的Content-Type和Content-Disposition头,使浏览器可以正确地下载生成的Word文档。 希望这个例子可以帮助你理解如何在Spring Boot中使用Poi-TL来生成Word文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值