Bootstrap

jXLS(导出数据神器)实现单元格合并

背景

在这里插入图片描述
在审批记录部分,第一列是领导等级,并且需要合并单元格,后三列列出详细信息

实现方案

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还很多批注指令,可以自行研究学习.

;