POI-TL 使用总结

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

基础标签:

文本模板{{var}}

TextRenderData 的结构体

{
  "text": "Sayi",
  "style": {
    "strike": false, //	删除线
    "bold": true, //粗体
    "italic": false, //斜体
    "color": "00FF00", //颜色
    "underLine": false, //下划线
    "fontFamily": "微软雅黑", //字体
    "fontSize": 12 //字号
  }
}

tip: 输出文本的样式,既可以用代码设定,也可以直接在word文档中直接对{{var}}标签设置样式;

图片模板{{@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;
    }

 

表格模板{{#var}}

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);
  }
}

你可能感兴趣的:(个人日记)