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

好的,我可以回答您关于jxls合并单元格的问题。jxls是一个基于Java的开源Excel操作工具,可以通过Excel模板来实现数据导出和导入等功能。下面是一个简单的jxls合并单元格示例: 1. 创建Excel模板 在Excel模板中,需要使用jxls提供的标记语言来标记出需要合并单元格。例如,下面是一个包含合并单元格的模板示例: ``` <html xmlns:jxl="http://jxls.sf.net/1.0/mini"> <body> <table> <tr> <td jxl:merge="0,1,0,2">姓名</td> <td>年龄</td> <td>性别</td> </tr> <tr> <td></td> <td></td> <td></td> </tr> <jxl:each items="users" var="user"> <tr> <td>${user.name}</td> <td>${user.age}</td> <td>${user.gender}</td> </tr> </jxl:each> </table> </body> </html> ``` 在上面的模板中,我们使用jxl:merge标记来标记需要合并单元格,其中0,1,0,2表示需要合并从第0行到第1行、从第0列到第2列的单元格。 2. 编写导出代码 在Java代码中,可以使用jxls提供的API来进行导出操作。例如: ``` // 加载Excel模板 InputStream is = new FileInputStream("template.xls"); Workbook workbook = WorkbookFactory.create(is); // 创建Excel上下文对象 Map<String, Object> context = new HashMap<>(); context.put("users", getUserList()); // 执行模板引擎,生成Excel文件 JxlsHelper.getInstance().processTemplate(context, workbook.getSheetAt(0)); // 保存Excel文件 OutputStream os = new FileOutputStream("output.xls"); workbook.write(os); os.close(); ``` 在上面的代码中,我们首先加载Excel模板,然后创建Excel上下文对象,并将需要合并单元格数据添加到上下文中。最后,使用JxlsHelper的processTemplate方法执行模板引擎,生成Excel文件,并保存到本地。 3. 导出Excel文件 运行上面的代码后,会在项目根目录下生成一个名为output.xls的Excel文件,其中包含了我们导出数据合并单元格。 以上就是一个简单的jxls合并单元格示例,希望能对您有所帮助。如果您有其他问题,可以继续咨询我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值