本编文章继SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格)文章之后
介绍Poi-tl导出word的延伸功能:
所需依赖以及word模板所属位置 见 SpringBoot+Poi-tl根据Word模板动态生成word(含动态行表格),这里不再累赘。
直接介绍延伸功能的实现。
一、延伸功能
功能1:导出多个动态行表格(固定个数)
功能2:导出循环列表下的动态行表格(个数不固定)
功能3:导出合并单元格
功能4:导出循环列表下合并单元格
功能5:导出循环列表下合并单元格、外加一个动态行表格
二、功能实现
功能1:导出多个动态行表格(固定个数)
(1)新建一个word(orderD2.docx),编写word模板:
(2)在ExportWordController类中,编写相应的导出方法,供页面请求
/**
* 销售订单信息导出word --- poi-tl(包含两个动态行表格)
* @throws IOException
*/
@RequestMapping("/exportDataWordD4")
public void exportDataWordD4(HttpServletRequest request,HttpServletResponse response) throws IOException{
try {
Map<String, Object> params = new HashMap<>();
// TODO 渲染其他类型的数据请参考官方文档
DecimalFormat df = new DecimalFormat("######0.00");
Calendar now = Calendar.getInstance();
double money = 0;//总金额
//组装表格列表数据
List<Map<String,Object>> typeList=new ArrayList<Map<String,Object>>();
for (int i = 0; i < 2; i++) {
Map<String,Object> detailMap = new HashMap<String, Object>();
detailMap.put("index", i+1);//序号
if(i == 0){
detailMap.put("sub_type", "监督技术装备");//商品所属大类名称
}else if(i == 1){
detailMap.put("sub_type", "火灾调查装备");//商品所属大类名称
}else if(i == 2){
detailMap.put("sub_type", "工程验收装备");//商品所属大类名称
}
double saleprice=Double.valueOf(String.valueOf(100+i));
Integer buy_num=Integer.valueOf(String.valueOf(3+i));
String buy_price=df.format(saleprice*buy_num);
detailMap.put("buy_price", buy_price);//所属大类总价格
money=money+Double.valueOf(buy_price);
typeList.add(detailMap);
}
//组装表格列表数据
List<Map<String,Object>> detailList=new ArrayList<Map<String,Object>>();
for (int i = 0; i < 3; i++) {
Map<String,Object> detailMap = new HashMap<String, Object>();
detailMap.put("index", i+1);//序号
if(i == 0 || i == 1){
detailMap.put("product_type", "二级分类1");//商品二级分类
}else{
detailMap.put("product_type", "二级分类2");//商品二级分类
}
detailMap.put("title", "商品"+i);//商品名称
detailMap.put("product_description", "套");//商品规格
detailMap.put("buy_num", 3+i);//销售数量
detailMap.put("saleprice", 100+i);//销售价格
detailMap.put("technical_parameter", "技术参数"+i);//技术参数
detailList.add(detailMap);
}
//总金额
String order_money=String.valueOf(money);
//金额中文大写
String money_total = MoneyUtils.change(money);
//word模板地址获取方式一:缺点---打jar包获取不到该路径
// String basePath=ClassUtils.getDefaultClassLoader().getResource("").getPath()+"static/template/";
// String resource =basePath+"orderD2.docx";//word模板地址
//word模板地址获取方式二:优点---相比上一种方式,这种方法不会在linux或者jar上失效
ClassPathResource classPathResource = new ClassPathResource("static/template/orderD2.docx");
String resource = classPathResource.getURL().getPath();
//渲染表格 动态行
HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
Configure config = Configure.newBuilder()
.bind("typeList", policy).bind("detailList", policy).build();
XWPFTemplate template = XWPFTemplate.compile(resource, config).render(
new HashMap<String, Object>() {
{
put("typeList", typeList);
put("detailList",detailList);
put("order_number", "2356346346645");
put("y", now.get(Calendar.YEAR));//当前年
put("m", (now.get(Calendar.MONTH) + 1));//当前月
put("d", now.get(Calendar.DAY_OF_MONTH));//当前日
put("order_money",order_money);//总金额
put("money_total",money_total);//金额中文大写
}}
);
//=================生成文件保存在本地D盘某目录下=================
String temDir="D:/mimi/"+File.separator+"file/word/"; ;//生成临时文件存放地址
//生成文件名
Long time = new Date().getTime();
// 生成的word格式
String formatSuffix = ".docx";
// 拼接后的文件名
String fileName = time + formatSuffix;//文件名 带后缀
FileOutputStream fos = new FileOutputStream(temDir+fileName);
template.write(fos);
//=================生成word到设置浏览默认下载地址=================
// 设置强制下载不打开
response.setContentType("application/force-download");
// 设置文件名
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
OutputStream out = response.getOutputStream();
template.write(out);
out.flush();
out.close();
template.close();
} catch (Exception e) {
e.printStackTrace();
}
}
(3)页面编写调用方法
<div class="m2" style="margin-top: 30px;">使用<span class="s1">POI-tl</span>根据word模板动态生成word(包含两个动态行表格)</div>
<a href="#" class="easyui-linkbutton" onclick="doExportWordD4();" data-options="iconCls:'icon-save'">导出word(包含两个动态行表格)</a>
//方式一导出word(包含两个动态行表格)
function doExportWordD4(){
window.location.href="<%=basePath%>/auth/exportWord/exportDataWordD4";
}
(4)导出结果:
功能2:导出循环列表下的动态行表格(个数不固定)
如果列表的每一项不是简单的文本,而是包含很多文档内容,或者多级列表该怎么生成? 区块对的循环功能可以很好的循环列表,并且支持编号有序。
(1)新建一个word(order2.docx),编写word模板:
(2)在ExportWordController类中,编写相应的导出方法,供页面请求
/**
* 销售订单信息导出word --- poi-tl(包含动态行表格、循环列表中的动态行表格)
* @throws IOException
*/
@RequestMapping("/exportDataWord4")
public void exportDataWord4(HttpServletRequest request,HttpServletResponse response) throws IOException{
try {
Map<String, Object> params = new HashMap<>();
// TODO 渲染其他类型的数据请参考官方文档
DecimalFormat df = new DecimalFormat("######0.00");
Calendar now = Calendar.getInstance();
double money = 0;//总金额
//组装表格列表数据
List<Map<String,Object>> typeList=new ArrayList<Map<String,Object>>();
for (int i = 0; i < 2; i++) {
Map<String,Object> detailMap = new HashMap<String, Object>();
detailMap.put("index", i+1);//序号
if(i == 0){
detailMap.put("sub_type", "监督技术装备");//商品所属大类名称
}else if(i == 1){
detailMap.put("sub_type", "火灾调查装备");//商品所属大类名称
}else if(i == 2){
detailMap.put("sub_type"