java基于poi-tl实现生成文档的功能(二)


2.3 表格

表格一般使用{{#参数值}}表示,这些和前面基本是一样的

2.3.1 文本插入

    如果你的某一行全是文本,可以使用

RowRenderData row1 = Rows.create("名称","类型");

如果需要空行,使用null代替;
RowRenderData row1 = Rows.create("名称",null,"类型",null);

这种在名称列、类型列后分别会插入一列空白数据;

 

2.3.2 图片插入

     

 

 

   在官方文件中看到,rows -> cells ->paragraphs -> contents ,contents 就是我们插入的类型;

CellRenderData cell = new CellRenderData();
ParagraphRenderData graph1 = new ParagraphRenderData();
graph1.addPicture(new PictureRenderData(500,300,PictureType.JPEG,bufferedImage1));

cell.addParagraph(graph1);

如果这一行还想插入其他的内容,多创建几个cell,ParagraphRenderData,例如
CellRenderData cell2 = new CellRenderData();
CellRenderData cell3 = new CellRenderData();
ParagraphRenderData graph2 = new ParagraphRenderData();
ParagraphRenderData graph3 = new ParagraphRenderData();
graph2.addText("名称");
graph3.addText("数量");
cell2.addParagraph(graph2);
cell3.addParagraph(graph3);

最后统一添加的ROWS对象中。
RowRenderData row0 = Rows.create(cell,cell1,cell2);

2.3.3 单元格合并

   

 

 

    创建合并规则

MergeCellRule rule = MergeCellRule.builder().map(Grid.of(0, 2),Grid.of(7, 2)).build();

上面是我的示例,将0行第2列到第7行第2列合并;
如果你的单元格有多次合并,比如你除了需要将0行第2列到第7行第2列合并外,还需要将第0行第1列到第4行第1列合并,那么
你可以继续添加map条件,比如:
MergeCellRule rule = MergeCellRule.builder().
map(Grid.of(0, 1),Grid.of(4, 1)).
map(Grid.of(0, 2),Grid.of(7, 2)).build();

如果你需要多行多列合并,比如第1行3-7列和第3行的3-7列合并,你应该这样写:
MergeCellRule rule = MergeCellRule.builder().map(Grid.of(1, 3),Grid.of(3, 7)).build();

map里面类似于你的坐标,从你的起点到终点就行。

最后放到数组里,key值需要和你模板的参数值对应
dataMap.put("alarm_data",Tables.of(row0,row1,row2).mergeRule(rule).create());

2.3.4 自定义列宽

    

     tableStyle是表格整体宽度,14.63f是A4纸标准宽度,colWidths就是每列的列宽。默认是平均分配。

    在Tables.java的源码中有这样两个函数,一个是根据double类型,一个是String类型

 

double就是根据你纸张的具体宽度设计;String按照比例,我这里是调用String类型的函数

int[] width = {10,20,70};
dataMap.put("alarm_data",Tables.of(row0,row1,row2,row3).percentWidth("100%",width).mergeRule(rule).create());

你有几列,数组的大小就是多少。String传参固定为"100%",我这个例子是三列,比例是1:2:7
另外数组的值相加必须100,否则会报异常

三、生成文件

   XWPFTemplate render = template.render(dataMap);

try {
render.writeAndClose(new FileOutputStream("文件名.docx"));
} catch (IOException e) {
e.printStackTrace();
}

到这里生成文件的功能就完成了,有兴趣的小伙伴可以留言一起交流交流

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM