poi-tl word模版生成、动态表格、坑点合集

一、配置

1、导入依赖

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

apache poi版本要对应 

 <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
</dependency>
<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
</dependency>

<dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>4.1.2</version>
</dependency>

2、模版存放问题

(1)如果你的模版存放在你c盘之类的,是不用再去配置maven文件

(2)如果你的是要发布到inux的spring项目,或者为了可用性,将模版存放在resource文件夹下面,这个时候就要配置maven文件,因为打jar包的时候,会将你的word文件默认压缩,通过maven构建文件不对后缀docx的文件压缩过滤,这样文件打包之后就不会损坏

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <version>2.6</version>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <nonFilteredFileExtensions>
                        <nonFilteredFileExtension>docx</nonFilteredFileExtension>
                    </nonFilteredFileExtensions>
                </configuration>
            </plugin>

        </plugins> 
    </build> 

二、案例

1、普通模版

新建一个word文档,{{}}这种格式,里面放替换的字母,将map集合替换内容设置好,交给poi-tl渲染。

word模版

以下就是普通模版生成的三个方法,其中一个为主方法,调用生成。如果需要字节流转成mutipartfile需要导入mock依赖

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-mock</artifactId>
            <version>2.0.8</version>
        </dependency>
public class WordTemplateUtils {  


    public static void main(String[] args) {
        Map<String, Object> templateMap = new HashMap<>();
        templateMap.put("Year", "2023年");
        templateMap.put("HqCompany","测试名单");
        exportWord(templateMap);
    }


/**
     * 生成word模版
     *
     * @param data
     * @return
     */
    public static MultipartFile exportWord(Map<String, Object> data) {
        MultipartFile multipartFile = null;
        ByteArrayOutputStream ostream = null;
        XWPFTemplate template = null;
        try {
            //获取模板
            template = getWordTemplate(data);
            ostream = new ByteArrayOutputStream();
            // 将模板输出到字节流
            template.write(ostream);//这里还有一个方法是template.writeToFile("");可以直接填写本地文件路径
            byte[] fileBytes = ostream.toByteArray();
            String newFileName = "测试" + data.get("Year") + "年生成文件.docx";
            //转成可上传的文件(作者这里是为了上传到服务器转换成mutipartFile)
            multipartFile = new MockMultipartFile(newFileName, newFileName,
                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document", fileBytes);
        } catch (IOException e) {
            log.error("模版1导出异常");
        } finally {
            //关闭流
            IOUtils.close(ostream);
            IOUtils.close(template);
        }
        return multipartFile;
    }

    /**
     * 获取普通word模版渲染
     *
     * @param data
     * @return
     * @throws IOException
     */
    private static XWPFTemplate getWordTemplate(Map<String, Object> data) {
        //获取模板的输入流,读取resource里面的template文件夹里的word1.docx
        ClassPathResource tempFileResource = new ClassPathResource("template/" + "word1.docx");
        InputStream stream = null;
        try {
            stream = tempFileResource.getInputStream();
        } catch (IOException e) {
            log.error("获取模版失败!");
        }
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL();
        XWPFTemplate template = XWPFTemplate.compile(stream, builder.build()).render(data);
        return template;
    }

}

2、带有表格的模版

word模版

 代码:

  public class WordTemplateUtils {
  /**
     * 生成word表格模版
     *
     * @param data
     * @return
     */
    public static MultipartFile exportWordTable(Map<String, Object> data) {
        //模板地址
        ClassPathResource tempFileResource = new ClassPathResource("template/" + "word2.docx");
        // 行循环实例
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        //这里可以指定一个config类,用来指定一些规则,也可以改变模板中{{}}的这种格式
        MultipartFile multipartFile = null;
        XWPFTemplate compile = null;
        File file = null;
        ByteArrayOutputStream ostream = null;
        try {
            //lists绑定对象
            Configure config = Configure.builder()
                    .bind("lists", policy).build();
            compile = XWPFTemplate.compile(tempFileResource.getInputStream(), config);
            compile.render(data);
            ostream = new ByteArrayOutputStream();
            compile.write(ostream);
            byte[] fileBytes = ostream.toByteArray();
            String newFileName = "测试" + data.get("Year") + "年企业名单.docx";
            multipartFile = new MockMultipartFile(newFileName, newFileName,
                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document", fileBytes);
        } catch (IOException e) {
            log.error("模版导出失败");
        } finally {
            IOUtils.close(ostream);
            IOUtils.close(compile);
        }
        return multipartFile;
    }


    public static void main(String[] args) {
        Map<String, Object> templateMap = new HashMap<>();
        //建立公司对象集合
        List<Company> companyList=new ArrayList();
        Company company1=new Company();
        company1.setIndex(1);
        company1.setEnterpriseName("测试1");
        Company company2=new Company();
        company1.setIndex(2);
        company1.setEnterpriseName("测试2");
        companyList.add(company1);
        //放进模版集合
        templateMap.put("Year", "2023年");
        templateMap.put("lists","测试名单");
        exportWordTable(templateMap);
    }

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
poi-tl是一个用于生成Word文档的Java模板引擎,它可以方便地创建和操作Word表格。在使用poi-tl生成Word表格时,你需要添加以下依赖到你的项目中: ```xml <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.10.0</version> </dependency> ``` 通过使用poi-tl提供的API,你可以轻松地创建和设置表格的样式。例如,如果你想要整行加粗,可以使用`textBold()`方法来设置行数据的样式。以下是一个示例代码: ```java RowRenderData titleRow = Rows.of(firstLine.getTitle(), null, null, null, null, null).textBold().create(); ``` 如果你想要指定特定单元格的样式,比如让表格中每一行的第二列内容加粗并且为红色字体,你可以使用以下方法: ```java CellStyle boldAndRedTextStyle = new CellStyle(); boldAndRedTextStyle.setDefaultParagraphStyle(ParagraphStyle.builder().withDefaultTextStyle(Style.builder().buildColor("FF00000").buildBold().build()).build()); for (RowRenderData rowRenderData : tableRenderData.getRows()) { rowRenderData.getCells().get(1).setCellStyle(boldAndRedTextStyle); } ``` 这样,你就可以使用poi-tl生成带有特定样式的Word表格了。 #### 引用[.reference_title] - *1* [java通过poi-tl模板引擎生成表格Word)](https://blog.csdn.net/qq_45731464/article/details/119247125)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[编程] POI-TL 根据模版生成Word文档的一些使用技巧汇总](https://blog.csdn.net/lmcboy/article/details/128216186)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悠哉iky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值