技术背景

很多时候我们网站或者系统需要提供一些word文件,例如证明.docx或者订单.docx等文件供用户下载打印等。

用Java操作word文档,毫无疑问,当下最流行apache poi,对于poi如何操作word文档,这里不作过多介绍。

这里主要讲解如何通过一个制作好的word模板文件,通过数据填充,生成加工好的word文件。

官方网站

http://deepoove.com/poi-tl

Maven

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

实战内容


以下源码已经上传再我的开源项目里面的spring-cloud-study-poi
https://github.com/moshowgame/spring-cloud-study

说先是新建模板word文档(。docx格式,2007/2013/2016新格式的)

运行效果

核心实现代码


@RestController
public class PoiController {@GetMapping("/generateWord")public ApiReturnObject  generateWord(String data){//图片路径,请注意你是linux还是windowsString wordPath="C:\\Users\\Administrator\\Desktop\\";String modelName="人物模板.docx";String outputName="hanyunxi.docx";Map<String, Object> datas = new HashMap<String, Object>() {{//本地图片put("name","鞠婧祎");put("team","前SNH48");put("gender","女");put("birthday","19940618");put("remark","鞠婧祎,1994年6月18日出生于四川遂宁,毕业于四川音乐学院附属中学,中国女演员、歌手,原SNH48 TEAM NII成员[1]。2013年9月5日,升格为SNH48 TEAM NII二期生正式成员;11月2日,以《剧场女神》公演正式出道。2014年6月7日,拍摄个人首支MV《足球派对》;7月26日,参加SNH48“一心向前”演唱会暨SNH48第一届总选举,演唱《流着泪微笑》并获SNH48总选举第四名。2015年1月15日,发行出道两周年EP《青春的约定》。2016年12月10日,获“星光大赏”年度新锐电视剧女演员。2017年1月1日,参加安徽卫视《国剧盛典》;3月27日,获第24届东方风云榜音乐盛典“年度飞跃歌手”奖[2];5月4日,获团中央“五四优秀青年”称号;5月25日,发行第二张个人EP《等不到你》;[3]7月29日,参加“我心翱翔”第四届总选举发布演唱会,获得SNH48第四届总选举第1名;[4]12月15日,SNH48官方宣布,鞠婧祎正式从SNH48 Group单飞、成立个人工作室。2018年3月26日,获第25届《东方风云榜》音乐盛典年度跨界艺人奖。7月28日,参加湖南卫视综艺节目《快乐大本营》。");put("active",new NumbericRenderData(new ArrayList<TextRenderData>(){{add(new TextRenderData("FF00FF", "2013年 以《剧场女神》公演正式出道"));add(new TextRenderData("FF00FF", "2014年 拍摄个人首支MV《足球派对》"));add(new TextRenderData("FF00FF", "2015年 发行出道两周年EP《青春的约定》"));add(new TextRenderData("FF00FF", "2016年 主演玄幻剧《九州天空城》"));}}));put("tables", new TableRenderData(new ArrayList<RenderData>(){{add(new TextRenderData("d0d0d0", "节目"));add(new TextRenderData("d0d0d0", "次数"));}},new ArrayList<Object>(){{add("《SNH星剧院公演》;999");add("《敢ZUO敢为女声秀》;4");add("《快乐大本营》;2");}}, "no datas", 10600));
//              //网路图片put("picture", new PictureRenderData(200, 250, ".png", BytePictureUtils.getUrlByteArray("https://pic.baike.soso.com/ugc/baikepic2/18293/cut-20170602162513-2088410512.jpg/300")));}};XWPFTemplate template = XWPFTemplate.compile(wordPath+modelName).render(datas);FileOutputStream out;try {out = new FileOutputStream(wordPath+outputName);template.write(out);out.flush();out.close();template.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return ApiReturnUtil.success(data);}}

支持的模板标签

  • 文本模板{{var}}
put("author", new TextRenderData("000000", "Sayi卅一"));
put("introduce", "http://www.deepoove.com");
  • 图片模板{{@var}}
// 本地图片
put("localPicture", new PictureRenderData(120, 120, "./sayi.png"));// 本地图片byte数据
byte[] localByteArray = BytePictureUtils.getLocalByteArray(new File("./logo.png"));
put("localBytePicture", new PictureRenderData(100, 120, ".png", localByteArray));// 网络图片
put("urlPicture", new PictureRenderData(100, 100, ".png", BytePictureUtils.getUrlByteArray("https://avatars3.githubusercontent.com/u/1394854")));// java 图片
put("bufferImagePicture", new PictureRenderData(100, 120, ".png", BytePictureUtils.getBufferByteArray(bufferImage)));
  • 表格模板{{#var}}
put("changeLog", new TableRenderData(new ArrayList<RenderData>(){{add(new TextRenderData("d0d0d0", ""));add(new TextRenderData("d0d0d0", "introduce"));}},new ArrayList<Object>(){{add("1;add new # gramer");add("2;support insert table");add("3;support more style");}}, "no datas", 10600));
  • 列表模板{{*var}}
put("feature", new NumbericRenderData(new ArrayList<TextRenderData>() {{add(new TextRenderData("Plug-in grammar"));add(new TextRenderData("Supports word text, header..."));add(new TextRenderData("Not just templates, but also style templates"));}
}));
  • 文档模板{{+var}}
List<SegmentData> segments = new ArrayList<SegmentData>();
SegmentData s1 = new SegmentData();
s1.setTitle("经常抱怨的自己");
s1.setContent("每个人生活得都不容易,经常向别人抱怨的人,说白了就是把对方当做“垃圾场”,你一股脑地将自己的埋怨与不满倒给别人,自己倒是爽了,你有考虑过对方的感受吗?对方的脸上可能一笑了之,但是心里可能有一万只草泥马奔腾而过。");
segments.add(s1);SegmentData s2 = new SegmentData();
s2.setTitle("拖拖拉拉的自己");
s2.setContent("能够今天做完的事情,不要拖到明天,你的事情没有任何人有义务去帮你做;不要做“宅男”、不要当“宅女”,放假的日子约上三五好友出去转转;经常动手做家务,既能分担伴侣的负担,又有一个干净舒适的环境何乐而不为呢?");
segments.add(s2);put("docx_word", new DocxRenderData(new File("~/segment.docx"), segments));

可能的报错

如果出现这个错误,要判断文件后缀名是doc,还是docx。
对POI来说,如果是doc,使用HSSFWorkbook;如果是docx,使用XSSFWorkbook。
而POI-TL封装的是docx的版本,现在是主流格式,所以推荐用这个,当然,输出文件随意,你输出文件名弄成doc也ok(格式)

org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)at org.apache.poi.openxml4j.opc.internal.ZipHelper.verifyZipHeader(ZipHelper.java:184)at org.apache.poi.openxml4j.opc.internal.ZipHelper.openZipStream(ZipHelper.java:241)at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:98)at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:324)at org.apache.poi.util.PackageHelper.open(PackageHelper.java:37)at org.apache.poi.xwpf.usermodel.XWPFDocument.<init>(XWPFDocument.java:116)at com.deepoove.poi.NiceXWPFDocument.<init>(NiceXWPFDocument.java:85)at com.deepoove.poi.XWPFTemplate.compile(XWPFTemplate.java:129)at com.deepoove.poi.XWPFTemplate.compile(XWPFTemplate.java:110)at com.deepoove.poi.XWPFTemplate.compile(XWPFTemplate.java:78)at com.deepoove.poi.XWPFTemplate.compile(XWPFTemplate.java:74)at com.softdev.system.demo.controller.PoiController.generateWord(PoiController.java:51)

JAVA使用POI-TL通过Word模板生成Word文件相关推荐

  1. apache poi使用例_使用java Apache poi 根据word模板生成word报表例子

    [实例简介] 使用java Apache poi 根据word模板生成word报表 仅支持docx格式的word文件,大概是word2010及以后版本,doc格式不支持. 使用说明:https://b ...

  2. 使用java Apache poi 根据word模板生成word报表

    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行. 代码示例下载:https ...

  3. java 根据word模板生成word文件

    Java可以使用Apache POI库来生成Word文件,并且也可以使用freemarker等模板引擎来实现根据Word模板生成Word文件的功能. 下面是一个简单的示例代码,可以帮助您快速入门. 模 ...

  4. JAVA实现模板word文档导入,Java依据word模板生成word文档之后台解析和实现及部分代码(一)...

    Java根据word模板生成word文档之后台解析和实现及部分代码(一) 后台主要工作是解析XML定义的标签文件,并获取到数据集,放入到Map中,然后调用Jacob.jar中提供的相关方法来实现替换. ...

  5. 根据word模板生成word和PDF

    根据word模板生成word和PDF 需求:有一个固定的合同模板,在vue前台填写指定的信息,替换合同模板指定的内容 我们使用的默认模板内容如图: 我们在前端填写的字段就是合同名称.项目名称和项目金额 ...

  6. 使用word模板生成word文档的各类方案

    使用word模板生成word文档的各类方案 生成word的各种方案 word另存xml进行后续处理 2003版本word(.doc)的xml处理并生成word 2007版本word(.docx)的xm ...

  7. word模板生成word报表文档

    主要功能为根据word模板生成word报表文档,注意引用Interop.Word.dll; 首先要生成word程序对象 Word.Application app = new Word.Applicat ...

  8. C#根据word模板生成word表格报表文档

    主要功能为根据word模板生成word报表文档,注意引用Interop.Word.dll; 首先要生成word程序对象 Word.Application app = new Word.Applicat ...

  9. PHP 使用word模板生成word文档示例

    <?php namespace Home\Controller; use PhpOffice\PhpWord\TemplateProcessor; use Think\Controller; c ...

  10. 根据word模板生成pdf文件

    1.首先建一个word,插入一个表格,需要填充的值用${parame}代替 (注意:这里的参数要和java实体类里面的参数对应起来,代码放在下面) 2.制作完成后另存为xml格式 3.然后用文本编辑工 ...

最新文章

  1. docker常用命令行集锦
  2. 使用matlab构建一个信号、添加噪声信号并图示信号
  3. 阿里云 docker php mysql_PHP开发环境02 - 阿里云Ubuntu使用Docker配置PHP环境(只限于学习)...
  4. 单例模式的七种写法(转)
  5. mathematica在linux上运行,Mathematica在Ubuntu中的表现及修正
  6. mysql怎么实现的主从复制_【mysql】mysql实现主从复制
  7. JS 回调(CallBack)
  8. iphone手机删除的照片怎么恢复
  9. python 鼠标 自动点击_Python实现鼠标隔几秒自动点击电脑某区域
  10. 三极管死区电压和导通电压的区别
  11. 程序员到底要学什么?
  12. Linux服务器 通过ftp命令下载或上传文件
  13. 小武与箭指offer----list.invert
  14. 网上疯传河南高考零分作文:兔子 你傻啊?!
  15. 更改绩效管理流程的5个步骤
  16. 20/06/27 charles安装报【User installations are disabled via policy on the machine】解决方法
  17. 啃K8s之快速入门,以及哭吧S(k8s)单节点部署
  18. 大一作业HTML网页作业:中华传统文化题材网页设计(纯html+css实现)
  19. ppt关闭受保护视图
  20. 两个故事讲述什么是消息队列

热门文章

  1. 叶武滨老师时间管理学习感悟
  2. 手机百度输入法的郑码练习
  3. 对象代理数据库:大数据时代下的应需之作
  4. windows、Linux、VxWorks 下errno含义
  5. 广州工商学院计算机网络应用,广州工商学院教务网络管理系统 http://218.19.119.231/jwweb...
  6. MEEGO系统七大优势
  7. 手把手教你用DSP28335打出PWM波和SPWM波
  8. HDU 1427 速算24点(DFS) *
  9. Inno Setup入门(十五)——Inno Setup类参考(1)
  10. JS详解 | 对象 事件 节点 | 系统性学习 | 无知的我费曼笔记