背景
在审批记录部分,第一列是领导等级,并且需要合并单元格,后三列列出详细信息
实现方案
2.1 引入依赖
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>2.10.0</version>
</dependency>
2.2 定义数据结构
1)Approval 实体类
package com.daze.demo.pojo;
import lombok.Data;
@DATA
public class Approval {
/**
* 审批人姓名
*/
private String name;
/**
* 审批时间
*/
private String time;
/**
* 审批意见
*/
private String opinion;
}
3)Offer 实体
package com.daze.demo.pojo;
import lombok.Data;
@DATA
public class Offer {
/**
* 领导等级
*/
private String leaderLevel;
/**
* 审批信息
*/
List<Approval> approvalList;
}
3)获取数据结构
public class App
{
/**
* @Description 构建数据
* @return org.jxls.common.Context
*/
private static Context buildData(){
// 定义数据 使用Context类型
Context context = new Context();
context.putVar("idNumber", "522228199010071613");
context.putVar("name", "张三");
context.putVar("jobName", "java软件开发");
List<Approval> approvalList1 = new ArrayList<>();
List<Approval> approvalList2 = new ArrayList<>();
Approval approval1 = new Approval();
Approval approval2 = new Approval();
Approval approval3 = new Approval();
Approval approval4 = new Approval();
Approval approval5 = new Approval();
approval1.setName("审批人");
approval1.setTime("审批时间");
approval1.setOpinion("审批意见");
approval2.setName("部门经理");
approval2.setTime("2023-06-14 18:00");
approval2.setOpinion("同意");
approvalList1.add(approval1);
approvalList1.add(approval2);
approval5.setName("审批人");
approval5.setTime("审批时间");
approval5.setOpinion("审批意见");
approval3.setName("总经理");
approval3.setTime("2023-06-14 19:00");
approval3.setOpinion("不同意");
approval4.setName("董事长");
approval4.setTime("2023-06-14 20:00");
approval4.setOpinion("再考虑");
approvalList2.add(approval5);
approvalList2.add(approval3);
approvalList2.add(approval4);
List<Offer> offerList = new ArrayList<>();
Offer offer1 = new Offer();
offer1.setLeaderLevel("小领导");
offer1.setApprovalList(approvalList1);
offerList.add(offer1);
Offer offer2 = new Offer();
offer2.setLeaderLevel("大领导");
offer2.setApprovalList(approvalList2);
offerList.add(offer2);
context.putVar("offerList", offerList);
System.out.println(context);
return context;
}
}
打印出来的数据结构:
Context{
jobName=java软件开发,
name=张三,
offerList=[
leaderLevel=小领导,Offer{approvalList=[Approval{name=‘审批人’, time=‘审批时间’,
optition=‘审批意见’},Approval{name=‘部门经理’, time=‘2023-06-14 18:00’,
optition=‘同意’}]},
leaderLevel=大领导,Offer{approvalList=[Approval{name=‘审批人’, time=‘审批时间’,
optition=‘审批意见’}, Approval{name=‘总经理’, time=‘2023-06-14 19:00’,
optition=‘不同意’}, Approval{name=‘董事长’, time=‘2023-06-14 20:00’,
optition=‘再考虑’}]} ],
idNumber=522228199010071613}
4)生成excel
package com.daze.demo;
import com.daze.demo.pojo.Approval;
import com.daze.demo.pojo.Offer;
import org.jxls.common.Context;
import org.jxls.util.JxlsHelper;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
public class App
{
public static void main( String[] args ) throws IOException {
InputStream is = null;
OutputStream os = null;
try {
// 读取模板
is = App.class.getClassLoader().getResourceAsStream("template.xls");
// 新建文件
File file = new File("d:/export.xls");
// 输出流
os = new BufferedOutputStream(new FileOutputStream(file));
//构建数据
Context context = buildData();
// 数据写入模板
JxlsHelper.getInstance().processTemplate(is, os, context);
}catch (Exception e){
e.printStackTrace();
}finally {
is.close();
os.close();
}
}
}
5)项目目录结构
定义模板
模板文件名为 template.xls
命令解释:
1.jx:area(lastCell=“D7”):
标识从这个批注所在的A1单元格开始到批注中所写的D7单元格为止围成的区域是模板扫描区域,执行其中的批注扫描。
2.jx:each(items=“offerList” var=“offer” lastCell=“D7”):
标识这个批注所在A7单元格到lastCell所写的D7单元格围成的区域是执行jx:each命令的区域,因为items写的是offerList,每条数据的变量叫offer,offer的属性就是字段。
3.jx:mergeCells(rows=“offer.approvalList.size()” lastCell=“A7”):
标识要合并rows行。
测试结果
注意事项
1、jx:area是不能少的;
2、jx:each(items=“offerList” var=“offer” lastCell=“D7”) items、var、lastCell三人属性也是不能少的;
3、jxls还很多批注指令,可以自行研究学习.