poi-tl官网:http://deepoove.com/poi-tl/
流程概述:
XWPFTemplate template = XWPFTemplate.compile("~/template.docx").render(new HashMap(){{
put("title", "Poi-tl 模板引擎");
}});
FileOutputStream out = new FileOutputStream("out_template.docx");
template.write(out);
out.flush();
out.close();
template.close();
编译模板 | |
渲染数据 | |
输出到流 |
TDO模式:Template + data-model = output
基础标签:
TextRenderData
的结构体
{
"text": "Sayi",
"style": {
"strike": false, // 删除线
"bold": true, //粗体
"italic": false, //斜体
"color": "00FF00", //颜色
"underLine": false, //下划线
"fontFamily": "微软雅黑", //字体
"fontSize": 12 //字号
}
}
tip: 输出文本的样式,既可以用代码设定,也可以直接在word文档中直接对{{var}}标签设置样式;
指定图片长宽 和传入图片路径
/**
* @param width 宽度
* @param height 高度
* @param path 本地图片路径
*/
public PictureRenderData(int width, int height, String path) {
this.width = width;
this.height = height;
this.path = path;
}
/**
* @param width 宽度
* @param height 高度
* @param path 标识图片后缀,如.png、.jpg等
* @param data 图片byte[]数据,可以通过工具类{@link BytePictureUtils}生成
*/
public PictureRenderData(int width, int height, String path, byte[] data) {
this.width = width;
this.height = height;
this.path = path;
this.data = data;
}
Style、TableStyle:样式设置;
TextRenderData:创建单元格数据并设置样式
RowRenderData:创建行数据;
MiniTableRenderData
:可以满足创建基本的表格;
{
"datas": [
{
"rowData": [TextRenderData],
"style": {
"align": "center",
"backgroundColor": "ff9800"
}
}
],
"headers": {
"rowData": [TextRenderData],
"style": {
"align": "center",
"backgroundColor": "ff9800"
}
},
"noDatadesc": "No Data Desc",
"style": {
"align": "center"
}
"width": 14.65
}
TableTools:
/**
* 合并行单元格
*
* @param table
* 表格对象
* @param row
* 行 从0开始
* @param fromCol
* 起始列
* @param toCol
* 结束列
*/
public static void mergeCellsHorizonal(XWPFTable table, int row, int fromCol, int toCol)
/**
* 合并列单元格
*
* @param table
* 表格对象
* @param col
* 列 从0开始
* @param fromRow
* 起始行
* @param toRow
* 结束行
*/
public static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow)
合并单元格的方法均需要操作XWPFTable,新增RenderPolicy策略 和 自定义模板策略 均方便于做合并单元格操作
自定义模板策略:
/**
* 配置文档渲染模板
*
* @param prospectus
* @param outPutUrl
* */
public void createConfigureBuilder(Prospectus data) {
//组装整体数据
ConfigureBuilder builder = Configure.newBuilder();
builder.customPolicy("gap_table", new GapTable()); //渲染模板一
builder.customPolicy("plan_table", new PlanTable());//渲染模板二
data.setBuilder(builder);
}
GapTable、PlanTable实现DynamicTableRenderPolicy中的render(XWPFTable table, Object data)方法即可;
新增RenderPolicy策略 :和自定义语法配合使用;
(如果需要在嵌套模板中对表格做合并操作,感觉这种方法比较适用)
@Override
public void doRender(RunTemplate runTemplate, Object data, XWPFTemplate template)
throws Exception {
NiceXWPFDocument doc = template.getXWPFDocument();
XWPFRun run = runTemplate.getRun();
// 定义行列
int row = 10, col = 8;
// 插入表格
XWPFTable table = doc.insertNewTable(run, row, col);
// 定义表格宽度、边框和样式
TableTools.widthTable(table, MiniTableRenderData.WIDTH_A4_FULL, col);
TableTools.borderTable(table, 4);
// TODO 调用XWPFTable API操作表格:data对象可以包含任意你想要的数据,包括图片文本等
// TODO 调用MiniTableRenderPolicy.renderRow方法快速方便的渲染一行数据
// TODO 调用TableTools类方法操作表格,比如合并单元格
// ......
TableTools.mergeCellsHorizonal(table, 0, 0, 7);
TableTools.mergeCellsVertically(table, 0, 1, 9);
// 清空原先模板
clearPlaceholder(run);
}
}