花了三天时间学会了poitl的动态表格的用法,
package com.occamedu;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.data.Rows;
import com.deepoove.poi.data.TableRenderData;
import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
import com.deepoove.poi.util.TableTools;
import com.occamedu.bean.good;
import com.occamedu.poiTestDemo.DetailTablePolicy;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author xlf
* @team occam
* @email 956324914@qq.com
* @date 2021/4/4 20:48
* @description
*/
public class testDemo {
public static String testWordTemplate = "D:/template.docx";
public static String testRenderWordPath = "D:/template_2.docx";
public static String testPDFPath = "D:/template.pdf";
private static String wordTemplatePath = "C:\\Users\\Administrator\\Desktop\\O型学霸知识传输服务确认函模板.docx";
private static String RenderWordPath = "C:\\Users\\Administrator\\Desktop\\template_2.docx";
public static void renderWord(String param) throws IOException {
//good list创建
good good = new good("xlf","xxx","aa","asdf");
good good1 = new good("xxx","xlf","aa","adfsgd");
good good2 = new good("xxx","xxx","xxx","xxx");
List<good> goods = new ArrayList<>();
goods.add(good);
goods.add(good1);
goods.add(good2);
RowRenderData data = Rows.of("aaa","xxa",
"aaa","aaa").center().create();
RowRenderData data1 = Rows.of("aaa","xxa","aaf","aaf").center().create();
List<RowRenderData> list = new ArrayList<>();
list.add(data);
list.add(data1);
good1.setGoods(list);
//将数据装入map中
Map<String,Object> datas = new HashMap<>();
datas.put("name",param);
datas.put("numbertobe",goods);
// datas.put("total",100);
datas.put("course",list);
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy(true);
//配置,渲染
Configure config = Configure.builder()
.bind("numbertobe",policy)
.bind("course",new DetailTablePolicy())
.build();
XWPFTemplate template = XWPFTemplate.compile(testWordTemplate,config).render(
datas
);
FileOutputStream out;
template.writeToFile(testRenderWordPath);
template.close();
}
public static void main(String[] args) throws IOException {
String s = "s";
int year = 2021;
String month = "12";
StringBuilder mon = new StringBuilder();
if (month.length() == 1) {
mon.append(0).append(month);
} else {
mon.append(month);
}
String mont = mon.toString();
String param = s.concat("s").concat("p").concat("xlf").concat(String.valueOf(year).substring(2)).concat(mont);
renderWord(param);
// PdfUtil.doc2pdf("C:\\Users\\Administrator\\Desktop\\template_2.docx","C:\\Users\\Administrator\\Desktop\\template_2.pdf");
}
}
package com.occamedu.poiTestDemo;
import com.deepoove.poi.data.RowRenderData;
import com.deepoove.poi.policy.DynamicTableRenderPolicy;
import com.deepoove.poi.policy.TableRenderPolicy;
import com.deepoove.poi.util.TableTools;
import com.occamedu.bean.good;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import java.util.ArrayList;
import java.util.List;
public class DetailTablePolicy extends DynamicTableRenderPolicy {
@Override
public void render(XWPFTable table, Object data) throws Exception {
// 货品填充数据所在行数
int goodsStartRow = 2;
if (null == data) {
return;
}
List<RowRenderData> goods = (List<RowRenderData>)data;
if (goods != null) {
table.removeRow(goodsStartRow);
for (int i = 0; i < goods.size(); i++) {
XWPFTableRow insertNewTableRow = table.insertNewTableRow(goodsStartRow);
for (int j = 0; j < 4; j++) {
insertNewTableRow.createCell();
}
TableRenderPolicy.Helper.renderRow(table.getRow(goodsStartRow), goods.get(i));
}
TableTools.mergeCellsVertically(table,1,2,3);
TableTools.mergeCellsVertically(table,0,2,3);
}
}
}