背景

今天,项目经理飞哥一步三蹦地来找我,看样子心情不错,他对我说:“小米,运营团队那边对咱们的努力很是认可啊,这季度奖金大大的有!你小子好样的~”,我心想老大来找我不应该是这个原因,还是要有任务安排给我,但嘴上说着:“哪里哪里,都是老大的功劳”……

果不其然,飞哥笑了一会儿又跟我说:“刚才财务部的马总找我,跟我说现在咱们系统中的报销单很麻烦,需要根据系统上的数据,手动一个一个字的录入到word中,他希望系统新增一个按钮【生成报销单】直接自动导出一个报销单,小米,你觉得从技术上能实现不?”我说:“保证完成任务!”

需求

报销单由两部分组成:

  • 第一部分是由基础数据汇总的表格,详细说明每一笔费用及审批流情况
  • 第二部分是由报销单附带的发票数量(上面两个图)

接下来进行开发该需求。

POM引入

关键词说明

  • 段落:一个文档包含多个段落,一个段落包含多个Runs,一个Runs包含多个Run,Run是文档的最小单元。XWPFRun代表具有相同属性的一段文本。
  • 表格:一个文档包含多个表格,一个表格包含多行,一行包含多列(单元格),每一单元格的内容相当于一个完整的文档。

创建document对象

加入标题1样式

标题处理

在这里我把标题也理解为是一个段落,代码如下:

申请人和申请时间

申请人和申请时间也是一个段落,代码如下:

费用明细

费用明细首先是从数据库中查询出来,然后通过遍历费用集合,生成相应的表格,代码如下:

审核情况和费用明细是相同的处理,不做赘述。

报销单附件

报销单附件是先传到oss上,oss给我们的是一个url地址,所以我们需要通过从url中获取BufferedImage对象,然后把它转化为流对象,放入到“段落”中,代码如下:


至此,一个复杂的word文档搞定,我长长的呼出一口气……

写在最后

好兄弟可以点赞并关注我的公众号“javaAnswer”,全部都是干货。