springboot导出富文本框数据到word

 这里需要注意的是:依赖的版本号都是一一对应的,如果使用不兼容的版本号,可能会报编译异常和缺少类的错误,这里已提供对应的所需依赖和版本号,大家可以参考一下。

具体的api文档可以参考官网api,很好理解:http://deepoove.com/poi-tl/#_license

前言

一开始业务的需求只是导出基本的文本框字段,这对我们大多数程序员来说都没有啥大问题,最常见的方式大概分为三种

第一种是将word模板设置成ftl格式,然后再进行标签替换。(缺点:标签太为复杂)

第二种则是通过esaypoi进行word模板导出,但是遇到有富文本框的数据,则就不咋好使了

第三种,则是今天要分享给大家的,也是我项目里所用的,通过poi-tl组件进行word导出。

难点剖析

  • 由于富文本存入数据库的字符串是带有html元素标签的,所以使用doc为文件为导出模板是不行的,它无法将这种字符串翻译成html的形式,只会展示出带有html标签的字符,所以需要重新构建模板文件使得它能支持html文本
  • 富文本如果含有图片,需要进行额外的处理

解决步骤

  1. 首先我们需要导入所需要用到的依赖。
    <dependency>
                <groupId>com.deepoove</groupId>
                <artifactId>poi-tl</artifactId>
                <version>1.12.0</version>
                <exclusions>
                    <exclusion>
                        <groupId>xalan</groupId>
                        <artifactId>xalan</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>5.2.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>5.2.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>4.1.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-scratchpad</artifactId>
                <version>5.2.2</version>
            </dependency>

 这里需要注意的是:依赖的版本号都是一一对应的,如果使用不兼容的版本号,可能会报编译异常和缺少类的错误,这里已提供对应的所需依赖和版本号,大家可以参考一下。

具体的api文档可以参考官网api,很好理解:http://deepoove.com/poi-tl/#_license

 2.接下来就需要准备我们的word模板了

这里的富文本框就是用普通的文本占位符来写:{{remarkVo.baseInfo}}

这里的remarkVo,是我对象里包含了一个对象,baseInfo是remarkVo里的属性,如果只有一个对象信息,则可以直接使用属性值即可。

@Data
@ApiModel
public class DeclareExportWordVo {

    /**
     *富文本框信息
     */
    @ApiModelProperty("富文本框信息")
    private DeclareRemarkVo remarkVo = new DeclareRemarkVo();
}
@Data
@ApiModel
public class DeclareRemarkVo {

    /**
     * 基本情况
     */
    @ApiModelProperty("基本情况")
    private String baseInfo;

    /**
     * 申报理由
     */
    @ApiModelProperty("申报理由")
    private String declareReason;

    /**
     * 工作基础
     */
    @ApiModelProperty("工作基础")
    private String workBase;
}

模板准备好后,其实就已经成功了一大半了,代码非常的简单,按照api中的要求来写即可。

3.接下来就是进行数据的导出了

//数据源
DeclareExportWordVo wordVo = new DeclareExportWordVo()
        //这个,就是我们导出html格式文件需需要的模板渲染
        HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
        //将存储的html字段进行渲染
        Configure configure = Configure.builder()
                .bind("remarkVo.baseInfo", htmlRenderPolicy)
                .bind("remarkVo.declareReason", htmlRenderPolicy)
                .bind("remarkVo.workBase", htmlRenderPolicy)
                .build();
        XWPFTemplate template = XWPFTemplate.compile(PropertyUtil.getProperty("D:\\template\\declare.docx", configure).render(wordVo);
        String fileName = "测试导出富文本框.docx";
        //这里是通过浏览器导出,当然,也可导出到本地磁盘里。
        response.setContentType("application/octet-stream");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" +
                URLEncoder.encode(fileName, "UTF-8"));
        ServletOutputStream out = response.getOutputStream();
        BufferedOutputStream bos = new BufferedOutputStream(out);
        template.write(bos);
        bos.flush();
        out.flush();
        PoitlIOUtils.closeQuietlyMulti(template, bos, out);
        out.close();
        bos.close();
        response.flushBuffer();

好了,到这里,我们的富文本框导出word就算是完成了,是不是非常之简单,没有难度

我们来测试一下导出的结果吧。

测试代码:

public static void main(String[] args) throws IOException {
        DeclareExportWordVo wordVo = new DeclareExportWordVo();
        DeclareRemarkVo remarkVo = new DeclareRemarkVo();
        //测试插入表格
        remarkVo.setBaseInfo("<body id=\"tinymce\" class=\"mce-content-body \" data-id=\"8279503244305491\" spellcheck=\"false\"><p>阿打发斯蒂芬</p><table class=\"mce-item-table\"><tbody><tr class=\"firstRow\"><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td></tr><tr><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td></tr><tr><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td></tr><tr><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td></tr><tr><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td></tr><tr><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td><td width=\"145\" valign=\"top\"><br></td></tr></tbody></table><p><br></p></body>");
        //测试插入图片
        remarkVo.setDeclareReason("<img class=\"main_img img-hover\" data-imgurl=\"https://img2.baidu.com/it/u=1688153644,1490540018&amp;fm=253&amp;fmt=auto&amp;app=120&amp;f=JPEG?w=650&amp;h=495\" src=\"https://img2.baidu.com/it/u=1688153644,1490540018&amp;fm=253&amp;fmt=auto&amp;app=120&amp;f=JPEG?w=650&amp;h=495\" style=\"width: 198px; height: 160px;\">");
        wordVo.setRemarkVo(remarkVo);
        HtmlRenderPolicy htmlRenderPolicy = new HtmlRenderPolicy();
        Configure configure = Configure.builder()
                .bind("remarkVo.baseInfo", htmlRenderPolicy)
                .bind("remarkVo.declareReason", htmlRenderPolicy)
                .bind("remarkVo.workBase", htmlRenderPolicy)
                .build();
        XWPFTemplate template = XWPFTemplate.compile("D:\\template\\declare.docx", configure).render(wordVo);
        template.writeAndClose(new FileOutputStream("D:\\template\\测试导出富文本框.docx"));
    }

导出word

 word里的内容

 

好了,以上就是富文本的word导出,大家可以借鉴参考一下。 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值