这里需要注意的是:依赖的版本号都是一一对应的,如果使用不兼容的版本号,可能会报编译异常和缺少类的错误,这里已提供对应的所需依赖和版本号,大家可以参考一下。
具体的api文档可以参考官网api,很好理解:http://deepoove.com/poi-tl/#_license
前言
一开始业务的需求只是导出基本的文本框字段,这对我们大多数程序员来说都没有啥大问题,最常见的方式大概分为三种
第一种是将word模板设置成ftl格式,然后再进行标签替换。(缺点:标签太为复杂)
第二种则是通过esaypoi进行word模板导出,但是遇到有富文本框的数据,则就不咋好使了
第三种,则是今天要分享给大家的,也是我项目里所用的,通过poi-tl组件进行word导出。
难点剖析
- 由于富文本存入数据库的字符串是带有html元素标签的,所以使用doc为文件为导出模板是不行的,它无法将这种字符串翻译成html的形式,只会展示出带有html标签的字符,所以需要重新构建模板文件使得它能支持html文本
- 富文本如果含有图片,需要进行额外的处理
解决步骤
- 首先我们需要导入所需要用到的依赖。
<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&fm=253&fmt=auto&app=120&f=JPEG?w=650&h=495\" src=\"https://img2.baidu.com/it/u=1688153644,1490540018&fm=253&fmt=auto&app=120&f=JPEG?w=650&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导出,大家可以借鉴参考一下。