EasyPOI基于模版的复杂表头表格导出

本文介绍了如何在SpringBoot项目中使用EasyPOI库处理带有复杂表头的Excel导出,包括导入依赖、创建实体类、编写Controller和Service,以及利用模板表达式实现数据填充和格式化。
摘要由CSDN通过智能技术生成

前言

  • 我们知道,EasyPOI能够进行表格的导入和导出,只要我们在需要在实体类字段上加上注解,编写导出接口即可,但是只能针对没有合并单元格的简单表格(图1),但我们需要一个复杂表头的表格(图2)应该怎么办呢?
  • EasyPOI也提供了解决方案,我们需要在原来的基础上设定一个模版,模版中引入EasyPOI的表达式即可
    图一
    图二

复杂表头表格的导出

一、导入依赖

官网的是如下几个依赖

		<dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>4.1.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>4.1.0</version>
        </dependency>

在SpringBoot项目中只导入这个依赖就行

		<dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-spring-boot-starter</artifactId>
            <version>4.4.0</version>
        </dependency>

当然,要想测试的话,基础的springboot依赖,web依赖,测试依赖还是得有,不写get,set,构造方法,还得有lombok。

 	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
    </parent>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

   	<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

	<dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>RELEASE</version>
        <scope>compile</scope>
    </dependency>

二、创建实体类

  • 实体类和传统的实体类没什么两样
package com.lq.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class OwnerCarInfoDto {
    //姓名
    private String name;
    //性别
    private String sex;
    //楼栋
    private String building;
    //电话
    private String tel;
    //车牌号
    private String licensePlate;
    //品牌
    private String brand;
    //颜色
    private String color;
    //停车位
    private String parkingSpace;
    //使用方式
    private String usage;
    //起始时间
    private String carRentalDateTime;
}

三、编写Controller

  • 要想下载,肯定要给前端提供一个接口的
package com.lq.controller;

import com.lq.service.ICarService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@RestController
@RequestMapping("/car")
public class AppController {
    @Autowired
    public ICarService carService;
    @GetMapping("/export")
    public void export(HttpServletResponse response) throws IOException {
        carService.export(response);
    }
}

四、编写Service

  • 使用的是测试数据,所以就没有调数据库了
package com.lq.service.impl;

import com.lq.domain.OwnerCarInfoDto;
import com.lq.service.ICarService;
import com.lq.util.MyExcelUtil;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Service;


@Service
public class CarServiceImpl implements ICarService {

    @Override
    public void export(HttpServletResponse response) throws IOException {
        List<OwnerCarInfoDto> infoList = new ArrayList<>();
        OwnerCarInfoDto ownerCarInfoDto = new OwnerCarInfoDto();
        ownerCarInfoDto.setName("张三");
        ownerCarInfoDto.setSex("男");
        ownerCarInfoDto.setBuilding("1栋1单元101室");
        ownerCarInfoDto.setTel("15363536353");
        ownerCarInfoDto.setLicensePlate("渝C:78773");
        ownerCarInfoDto.setBrand("奥迪");
        ownerCarInfoDto.setColor("红");
        ownerCarInfoDto.setParkingSpace("A001-A8");
        ownerCarInfoDto.setUsage("月租车");
        ownerCarInfoDto.setCarRentalDateTime("2024-01-03 00:00:00~2024-02-04 00:00:00");
        infoList.add(ownerCarInfoDto);
        MyExcelUtil.exportExcel("幸福","恒大",infoList,response);
    }
}

五、编写导出工具类

package com.lq.util;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
import com.lq.domain.OwnerCarInfoDto;
import org.apache.poi.ss.usermodel.Workbook;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.*;

public class MyExcelUtil {

    /**
     * @param infoList excel数据
     * @param response
     * @throws IOException
     */
    public static void exportExcel(String communityName, String propertyName, List<OwnerCarInfoDto> infoList, HttpServletResponse response) throws IOException {

        try {
            TemplateExportParams params = new TemplateExportParams(
                    "E:\\小区业主车辆息统计表模板.xls");//模版的位置
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("communityName", communityName); //社区名
            map.put("propertyName", propertyName); //物业名

            //所有数据
            List<Map<String, Object>> list = new ArrayList<>();

            for (int i = 0; i < infoList.size(); i++) {
                //一行数据
                Map<String, Object> lm = new HashMap<>();
                OwnerCarInfoDto ownerCarInfoDto = infoList.get(i);
                lm.put("no", i + 1); //序号
                lm.put("name", ownerCarInfoDto.getName());//业主姓名
                lm.put("sex", ownerCarInfoDto.getSex());//业主性别
                lm.put("building", ownerCarInfoDto.getBuilding());//楼栋号
                lm.put("tel", ownerCarInfoDto.getTel());//联系电话
                lm.put("licensePlate", ownerCarInfoDto.getLicensePlate());//车牌号
                lm.put("brand", ownerCarInfoDto.getBrand());//品牌
                lm.put("color", ownerCarInfoDto.getColor());//颜色
                lm.put("parkingSpace", ownerCarInfoDto.getParkingSpace());//停车位
                lm.put("usage", ownerCarInfoDto.getUsage());//使用方式
                lm.put("carRentalDateTime",ownerCarInfoDto.getCarRentalDateTime());
                list.add(lm);
            }
            map.put("list", list);

            //工作簿(第一个参数是表头信息,第二个参数是每一行的数据)
            Workbook workbook = ExcelExportUtil.exportExcel(params, map);
            //excel表格,第一个参数是excel文件名,第二个参数是响应,第三个参数是工作簿
            MyExcelUtil.downLoadExcel(map.get("communityName") + "小区业主车辆信息登记表", response, workbook);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * excel下载
     *
     * @param fileName 下载时的文件名称
     * @param response
     * @param workbook excel数据
     */
    public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xls", "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }
}

六、模版

  • 可以看到以上的工具类中使用到了模版,那么模版长什么样子呢?下图便是
    在这里插入图片描述
  • 图片不清晰,一下是图片中的关键信息,想必大家已经发现下面的字段就是实体类的字段,那么{{}}是什么 $fe又是什么,list表示什么,t又是什么,大家肯定会很疑惑,起始了解EasyPOI的语法便知。

{{communityName}}小区业主车辆信息登记表
物业公司:{{propertyName}}物业公司
{{$fe: list t.no t.name t.sex t.building t.tel t.licensePlate t.brand t.color t.parkingSpace t.usage t.carRentalDateTime}}

七、EasyPOI的模版语法

  • 空格分割
  • 三目运算 {{test ? obj:obj2}}
  • n: 表示 这个cell是数值类型 {{n:}}
  • le: 代表长度{{le:()}} 在if/else 运用{{le:() > 8 ? obj1 : obj2}}
  • fd: 格式化时间 {{fd:(obj;yyyy-MM-dd)}}
  • fn: 格式化数字 {{fn:(obj;###.00)}}
  • fe: 遍历数据,创建row
  • !fe: 遍历数据不创建row
  • $fe: 下移插入,把当前行,下面的行全部下移.size()行,然后插入
  • #fe: 横向遍历
  • v_fe: 横向遍历值
  • !if: 删除当前列 {{!if:(test)}}
  • 单引号表示常量值 ‘’ 比如’1’ 那么输出的就是 1
  • &NULL& 空格
  • ]] 换行符 多行遍历导出
  • sum: 统计数据

八、测试

  • 直接使用Apifox测试即可
    在这里插入图片描述

  • 测试结果如下在这里插入图片描述

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值