EasyWord

示例

        Map<String, Customization> staticLabel =["tjsj": new DefaultCustomization(LocalDateTime.now().toString()),"qm"  : new DefaultCustomization("EasyWord-Spock")]Map<String, List<Customization>> dynamicLabel = ['bc': [new DefaultCustomization('Programming Language  Ratings'),new DefaultCustomization('Java\t16.028%'),new DefaultCustomization('C\t15.154%'),new DefaultCustomization('Python\t10.020%'),new DefaultCustomization('C++\t6.057%'),new DefaultCustomization('C#\t3.842%'),new DefaultCustomization('Visual Basic .NET\t3.695%'),new DefaultCustomization('JavaScript\t2.258%'),new DefaultCustomization('PHP\t2.075%'),new DefaultCustomization('Objective-C\t1.690%'),new DefaultCustomization('SQL\t1.625%\t-0.69%')]]List<List<Customization>> lists = [[new DefaultCustomization('1'), new DefaultCustomization("战狼2"), new DefaultCustomization("56.39"), new DefaultCustomization("2017")],[new DefaultCustomization("2"), new DefaultCustomization("流浪地球"), new DefaultCustomization("46.18"), new DefaultCustomization('2019')],[new DefaultCustomization("3"), new DefaultCustomization("复仇者联盟4:终局之战"), new DefaultCustomization("42.05"), new DefaultCustomization('2019')],[new DefaultCustomization("4"), new DefaultCustomization("哪吒之魔童降世"), new DefaultCustomization("41.35"), new DefaultCustomization('2019')],[new DefaultCustomization("5"), new DefaultCustomization("红海行动"), new DefaultCustomization("36.22"), new DefaultCustomization('2018')],[new DefaultCustomization("6"), new DefaultCustomization("美人鱼"), new DefaultCustomization("33.9"), new DefaultCustomization('2016')],[new DefaultCustomization("7"), new DefaultCustomization("唐人街探案2"), new DefaultCustomization("33.71"), new DefaultCustomization('2018')],[new DefaultCustomization("8"), new DefaultCustomization("我不是药神"), new DefaultCustomization("30.75"), new DefaultCustomization('2018')],[new DefaultCustomization("9"), new DefaultCustomization("速度与激情8"), new DefaultCustomization("26.49"), new DefaultCustomization('2017')],[new DefaultCustomization("10"), new DefaultCustomization("西虹市首富"), new DefaultCustomization("25.27"), new DefaultCustomization('2018')]]Map<String, List<List<Customization>>> tableLabel = ["dy": lists]def picture = new DefaultCustomization()picture.setPicture(this.getClass().getClassLoader().getResourceAsStream("\\file\\zr.jpg"))picture.setPictureName('哪吒之魔童降世')Map<String, Customization> pictureLabel = ["zr": picture]EasyWord.replaceLabel(this.getClass().getClassLoader().getResourceAsStream("\\file\\1.docx"),new FileOutputStream(System.getProperty("user.dir") + "\\replace.docx"),staticLabel,dynamicLabel,tableLabel,pictureLabel)

EasyWord是什么

​ EasyWord是基于POI实现的对docx格式文件进行各种操作的工具。
​ 作者在好几个项目中遇到对word的操作,这些代码基本都是重复模板代码,加上写代码的人对POI不熟悉或者POI版本自身bug导致或多或少的一些问题,为了以后偷懒做出这么个东西。

在哪里下载EasyWord

github:https://github.com/flywithrain/easyword
EasyWord毕竟难登大雅之堂,所以中心仓库是没有的,大家要用可以放到自己本地仓库或者私有仓库

EasyWord如何使用

静态标签:在word的任意位置插眼(因为EasyWord是基于run实现的标签匹配,所以打标签要注意在一个run内),用于进行占位替换操作的标签;
动态标签(仅限paragraph):在word的paragraph中的标签,回填会一行一行的回填;
列表标签(仅限table中):在word的table中的标签,回填的时候会按照table的行一行一行的回填;
图片标签:其属性和静态标签一致,唯一的区别是进行图片回填;
隐藏标签:以上四种标签均支持隐藏标签,实际上隐藏标签并不是指一种标签类型,而是将打的标签隐藏起来从而在看模板的时候看不到标签;

EasyWord对外提供的方法都在com.thunisoft.easyword.core.EasyWord类中一共有3类方法,替换replaceLabel和replaceLabelite,合并mergeWord
以下所有方法均可在github上找到示例(EasyWordExample)

1. 静态标签的替换

EasyWord.replaceLabel(fileInputStream, fileOutputStream, staticLabel);

fileInputStream:这是模板的输入流;
fileOutputStream:这是替换后文件的输出流;
staticLabel:静态标签,类型是Map<String, Customization>,其中String就是模板中的标签,EasyWord采用replaceAll去替换String标签,替换内容即Customization中文字。

2. 动态标签的替换

EasyWord.replaceLabel(fileInputStream,fileOutputStream),new HashMap<>(0),dynamicLabel,new HashMap<>(0),new HashMap<>(0));

fileInputStream:同上;
fileOutputStream:同上;
dynamicLabel:动态标签,类型是Map<String, List<Customization>>,其中String就是模板中的标签,每一个Customization就是段落中的一行,List<Customization>就是回填内容的集合

3. 列表标签的替换

EasyWord.replaceLabel(fileInputStream,fileOutputStream),new HashMap<>(0),new HashMap<>(0),tableLabel,new HashMap<>(0));

fileInputStream:同上;
fileOutputStream:同上;
tableLabel:表格标签,类型是Map<String, List<List<Customization>>>,其中String就是模板中的标签,和dynamicLabel很相似,每一个Customization就是一个单元格(cell),每一个List<Customization>就是一行(row),自然的List<List<Customization>> 就代表rows组成的表格

4. 图片标签的替换

EasyWord.replaceLabel(fileInputStream,fileOutputStream),new HashMap<>(0),new HashMap<>(0),new HashMap<>(0),pictureLabel);

fileInputStream:同上;
fileOutputStream:同上;
pictureLabel:图片标签,类型是Map<String, Customization>,其中String就是模板中的标签,Customization中需实现getPicture()以及图片相关的方法(当getWidth()和getHeight()方法获取到的像素是非自然数时EasyWord会按照图片原始大小展示)

5.隐藏标签的替换

隐藏标签在代码部分并没有什么不一样,区别在于往模板中打的标签是否是隐藏状态(关于word如何隐藏文字请自行百度)。无论标签是否是隐藏状态都会被检测到,而且一旦替换成功,EasyWord会将替换后的内容由隐藏状态变为可见状态。

6.Word合并

EasyWord.mergeWord(wordList, outputStream);

wordList:需要合并的文件流集合,按先后顺序进行合并;
outputStream:合并后文件的输出流;
word合并后每两个word之间会默认加一个换页符,目前没有开发定制化接口进行开关。

7.高级

EasyWord的DefaultCustomization默认按照模板标签所在的样式进行回填替换,虽然大部分情况下我们都可以通过调整模板的样式来控制回填样式,但是如果有些样式不能通过模板来实现或者说在制作模板阶段压根还不知道样式怎么办呢?这时候我们需要实现Customization接口。
Customization接口中handle方法能够获取到标签回填时刻替换内容所在的table、row、cell、paragraph、run以及他们对应的Index(关于word的结构比这不再详细赘述,要实现定制化需要对word以及POI有一定了解)

Word如何打标签

打标签要对word结构有一定了解。标签只有一个要求,即标签文字需要在docx文件中一个<w:r></w:r>内。如何检验标签正确性呢,用解压缩软件打开docx文件查看./word/document.xml文件找到标签文字,看其是否在同一对<w:r></w:r>包裹中。document.xml也是学习docx文件结构一个好的入口。

版本

  • Aplha 2019-08-19

    • 从项目中抽离代码,初始化项目;
    • 增加单元测试,修复部分bug;
  • Beta 2019-08-23

    • 完善隐藏标签替换功能;
    • 新增word合并功能;
    • 修复所有已知bug;
  • 1.0.0 2019-08-24

    • 新增replaceLabelite方法,简化替换操作
    • 修复Customization设置WordConstruct不正确bug

EasyWord的使用——POI操作Word的工具相关推荐

  1. POI操作Word文档工具

    POI操作Word文档工具 1.POI简单介绍 2.POI操作Word文档基本方法 3.POI操作Word文档基本方法应用 4.POI操作Word文档工具类 1.POI简单介绍 POIFS(可疑混淆执 ...

  2. java poi 操作word遇到的问题

    java poi 操作word文本,图表,遇到的问题 直接上问题 模板字段匹配问题 图表问题 图表导出 问题:模板找不到对应图表 问题:数据填充后效果不达目标 图表中为零的数值去掉(!!!模板层面解决 ...

  3. 使用poi操作word

    导入依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifa ...

  4. POI 操作word

    关于POI 操作word的基础知识在这个博客(http://elim.iteye.com/blog/2049110)中有非常清晰的解释,在这里我就不多解释了 本文研究的内容就是 XWPFParagra ...

  5. 报表技术2(百万数据导入导出,POI操作word)

    POI模板导出,操作word 导出用户详情数据(图片,公式处理) 使用模板导出用户详细信息 使用模板引擎 1.编写模板引擎 2.使用模板引擎 百万数据导出 代码实现: 百万数据导入 步骤分析: 1.自 ...

  6. poi操作word常用操作方法,word工具包

    poi操作word工具类 当前poi版本:3.17,升级版本写法略有差异 新版poi操作方法: - poi-5.2.2 操作word [段落] - poi-5.2.2 操作word [表格] - po ...

  7. poi操作word文档总结

    POI分段落生成纯Word动态模板并导入数据 导出数据,可以用word另存为xml格式的ftl文件,变量用${变量名}表示,然后在类中通过 freemarker去替换变量. 但是怎么导入word数据. ...

  8. java word apache poi 操作word模板。

    apache poi 操作word模板. 操作方式: 1.对于固定格,可以遍历格子然后替换其中指定的值例如在要替换的cell写入${example} 这样格式,遍历到之后替换. 2.对于需要增长的表格 ...

  9. java使用poi操作word模板,插入图片、段落、表格

    java使用poi操作word插入图片.段落.表格 其他链接 准备工作 创建word模板.docx文件 编写模板格式.xml文件 java上手poi maven依赖 使用到的包 具体应用 对应封装方法 ...

最新文章

  1. Fragment为什么须要无参构造方法
  2. Spring: 依赖注入的实现
  3. iOS快速上手应用内购(IAP)附Demo
  4. 为啥开发的文档能力是核心竞争力之一
  5. SAP UI 搜索分页技术
  6. 端口镜像NIDS技术(sniffer抓包)
  7. aes256 加密后的长度_视频会议Zoom 5.0版本重大更新,增强加密功能提供更多安全选项...
  8. JBoss BRMS 5.3 –添加了业务活动监视(BAM)报告
  9. AD转换实验 编写程序利用ADC0804 AD转换器采集电位器的模拟电压,将采集到的数字量在程序中换算成实际采集的模拟电压,并用数码管显示所采集的实际模拟电压值。(如:AD转换后的数字量为128,则
  10. 2018下半年软考报名
  11. 线程挂起 阻止有什么区别c#
  12. 树莓派 红灯不亮_关闭树莓派的电源指示灯和状态指示灯
  13. 《证券市场的风险与心理》
  14. win7刷新环境变量的方法
  15. Mac删除Python缓存文件
  16. 【通俗易懂】机器学习中 L1 和 L2 正则化的直观解释
  17. 游戏加盟和游戏代理有什么区别?哪个更好?
  18. Clickhouse 时区
  19. 更便捷的中间人攻击框架Xerosploit
  20. 指派问题与匈牙利算法

热门文章

  1. 网络数据帧中的(Jumbo Frame)巨帧、超长帧
  2. Pytorch学习之cuda
  3. GoldWave V5.55 绿色汉化版_声音编辑
  4. [推荐系统]利用用户行为数据
  5. 孙悟空先后取过三次经,儒经、道经与佛经
  6. Adnroid 自定义流式布局
  7. android webview和ji交互分析
  8. Madoka and Childish Pranks(贪心)
  9. 爬取每日必应图片,python爬虫简单入门
  10. 如何抛弃鼠标全键盘操作xcode