Map staticLabel =
["tjsj": new DefaultCustomization(LocalDateTime.now().toString()),
"qm" : new DefaultCustomization("EasyWord-Spock")]
Map> 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> 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>> tableLabel = ["dy": lists]
def picture = new DefaultCustomization()
picture.setPicture(this.getClass().getClassLoader().getResourceAsStream("\\file\\zr.jpg"))
picture.setPictureName('哪吒之魔童降世')
Map 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是基于POI实现的对docx格式文件进行各种操作的工具。
作者在好几个项目中遇到对word的操作,这些代码基本都是重复模板代码,加上写代码的人对POI不熟悉或者POI版本自身bug导致或多或少的一些问题,为了以后偷懒做出这么个东西。
github:https://github.com/flywithrain/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)
EasyWord.replaceLabel(fileInputStream, fileOutputStream, staticLabel);
fileInputStream:这是模板的输入流;
fileOutputStream:这是替换后文件的输出流;
staticLabel:静态标签,类型是Map
EasyWord.replaceLabel(fileInputStream,
fileOutputStream),
new HashMap<>(0),
dynamicLabel,
new HashMap<>(0),
new HashMap<>(0));
fileInputStream:同上;
fileOutputStream:同上;
dynamicLabel:动态标签,类型是Map
EasyWord.replaceLabel(fileInputStream,
fileOutputStream),
new HashMap<>(0),
new HashMap<>(0),
tableLabel,
new HashMap<>(0));
fileInputStream:同上;
fileOutputStream:同上;
tableLabel:表格标签,类型是Map> 就代表rows组成的表格
EasyWord.replaceLabel(fileInputStream,
fileOutputStream),
new HashMap<>(0),
new HashMap<>(0),
new HashMap<>(0),
pictureLabel);
fileInputStream:同上;
fileOutputStream:同上;
pictureLabel:图片标签,类型是Map
隐藏标签在代码部分并没有什么不一样,区别在于往模板中打的标签是否是隐藏状态(关于word如何隐藏文字请自行百度)。无论标签是否是隐藏状态都会被检测到,而且一旦替换成功,EasyWord会将替换后的内容由隐藏状态变为可见状态。
EasyWord.mergeWord(wordList, outputStream);
wordList:需要合并的文件流集合,按先后顺序进行合并;
outputStream:合并后文件的输出流;
word合并后每两个word之间会默认加一个换页符,目前没有开发定制化接口进行开关。
EasyWord的DefaultCustomization默认按照模板标签所在的样式进行回填替换,虽然大部分情况下我们都可以通过调整模板的样式来控制回填样式,但是如果有些样式不能通过模板来实现或者说在制作模板阶段压根还不知道样式怎么办呢?这时候我们需要实现Customization接口。
Customization接口中handle方法能够获取到标签回填时刻替换内容所在的table、row、cell、paragraph、run以及他们对应的Index(关于word的结构比这不再详细赘述,要实现定制化需要对word以及POI有一定了解)
打标签要对word结构有一定了解。标签只有一个要求,即标签文字需要在docx文件中一个
Aplha 2019-08-19
Beta 2019-08-23
1.0.0 2019-08-24