使用EasyPOI导出Excel表格(含多sheet导出以及一对多导出)

2023-11-15

一。前言

官方Api文档地址:

http://doc.wupaas.com/docs/easypoi/easypoi-1c0u4mo8p4ro8

常用注解介绍

注解介绍:
easypoi起因就是Excel的导入导出,最初的模板是实体和Excel的对应,model–row,filed–col 这样利用注解我们可以和容易做到excel到导入导出,经过一段时间发展,现在注解有5个类分别是:

  • @Excel 作用到filed上面,是对Excel一列的一个描述
  • @ExcelCollection 表示一个集合,主要针对一对多的导出,比如一个老师对应多个科目,科目就可以用集合表示
  • @ExcelEntity 表示一个继续深入导出的实体,但他没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段
  • @ExcelIgnore 和名字一样表示这个字段被忽略跳过这个导导出
  • @ExcelTarget 这个是作用于最外层的对象,描述这个对象的id,以便支持一个对象可以针对不同导出做出不同处理

@Excel

这个是必须使用的注解,如果需求简单只使用这一个注解也是可以的,涵盖了常用的Excel需求,需要大家熟悉这个功能,主要分为基础,图片处理,时间处理,合并处理几块,name_id是上面讲的id用法,这里就不累言了:
在这里插入图片描述

@ExcelCollection

一对多的集合注解,用以标记集合是否被数据以及集合的整体排序:
在这里插入图片描述

@ExcelEntity

标记是不是导出excel 标记为实体类,一遍是一个内部属性类,标记是否继续穿透,可以自定义内部id:
在这里插入图片描述

二。使用

导入依赖:

<!--easypoi 导入导出 -->
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>4.2.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>4.2.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>4.2.0</version>
</dependency>

构建对应实体关系:

1.DayShiftExcelVo:

package com.cdtye.itps.jjxt.model.vo;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @ClassName BureauDayShiftExcelVo
 * @Description TODO 日交班导出Excel实体Vo
 * @Author Zhongks
 * @Date 2021/5/7  11:34
 * @Version 1.0
 **/
@Data
@Accessors(chain = true)
@AllArgsConstructor
@ExcelTarget(value = "DayShiftExcelVo")
public class DayShiftExcelVo {

    @Excel(name = "日期", width = 20,height = 60)
    private String inputDate;

    @Excel(name = "基本情况", width = 20,height = 60)
    private String basicInformation;

    @Excel(name = "问题描述", width = 20,height = 60)
    private String faultDescription;

    @Excel(name = "上报情况", width = 20,height = 60)
    private String reportType;

    @Excel(name = "站段分析", width = 20,height = 60)
    private String segmentAnalysis;

    @Excel(name = "供电处审核", width = 20,height = 60)
    private String review;

    @Excel(name = "流程", width = 20,height = 60, replace = {"电调暂存草稿单_0","电调已提交状态_1","电调已分析状态_2","供电部审核通过_3","供电部审核不通过_4"})
    private String process;

    @Excel(name = "重点追踪", width = 20,height = 60, replace = {"非重点追踪_0","重点追踪_1"})
    private String track;
}

在这里插入图片描述
excel显示效果:
在这里插入图片描述

2.SkylightCashStatisticsExcelVo:

package com.cdtye.itps.jjxt.model.vo;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelEntity;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @ClassName SkylightCashStatisticsExcelVo
 * @Description TODO 天窗兑现统计导出Excel实体Vo
 * @Author Zhongks
 * @Date 2021/5/8  10:05
 * @Version 1.0
 **/
@Data
@Accessors(chain = true)
@AllArgsConstructor
@ExcelTarget(value = "SkylightCashStatisticsExcelVo")
public class SkylightCashStatisticsExcelVo {

    @Excel(name = "段别", width = 20,needMerge = true)
    private String section;

    @Excel(name = "线路等级", width = 20,needMerge = true)
    private String lineLevel;

    @Excel(name = "线别", width = 20,needMerge = true)
    private String lineName;

    @ExcelEntity(name = "申请",show = true)
    private SkylightCashStatisticsCommonExcelVo applicationExcelVo;

    @Excel(name = "取消", width = 20,needMerge = true)
    private String cancel;

    @Excel(name = "作业车数量", width = 20,needMerge = true)
    private String numberOfOperationVehicles;

    @Excel(name = "检修列数量", width = 20,needMerge = true)
    private String numberOfMaintenanceTrains;

    @ExcelEntity(name = "申请时间",show = true)
    private SkylightCashStatisticsCommonExcelVo applicationTimeExcelVo;

    @ExcelEntity(name = "给点时间",show = true)
    private SkylightCashStatisticsCommonExcelVo giveTimeExcelVo;

    @ExcelEntity(name = "作业时间",show = true)
    private SkylightCashStatisticsCommonExcelVo workTimeExcelVo;

    @Excel(name = "取消", width = 20,needMerge = true)
    private String cancelReason;
}

在这里插入图片描述
SkylightCashStatisticsCommonExcelVo:

package com.cdtye.itps.jjxt.model.vo;

import cn.afterturn.easypoi.excel.annotation.Excel;
import cn.afterturn.easypoi.excel.annotation.ExcelTarget;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.experimental.Accessors;

/**
 * @ClassName ApplicationExcelVo
 * @Description TODO 天窗兑现统计 子集公共vo
 * @Author Zhongks
 * @Date 2021/5/8  10:11
 * @Version 1.0
 **/
@Data
@Accessors(chain = true)
@AllArgsConstructor
@ExcelTarget(value = "SkylightCashStatisticsExcelVo")
public class SkylightCashStatisticsCommonExcelVo {

    @Excel(name = "供电类", width = 20)
    private String powerSupply;

    @Excel(name = "非供电类", width = 20)
    private String nonPowerSupply;
}

在这里插入图片描述
excel显示效果:
在这里插入图片描述
3.使用@ExcelCollection显示效果:(由于实现原理一致,本文章不做示例)
在这里插入图片描述

Service层

	/**
     * @Author Zhongks
     * @Description //TODO excel导出
     * @Date 12:25 2021/5/7
     * @Param [list, response]
     * @return void
     **/
    public void export(BureauDayShiftVo bureauDayShiftVo,HttpServletResponse response) {
        try {
            // 设置下载的Excel名称,以当前时间为文件后缀,
            String dateTime = DateUtil.formatDateString(new Date(), DateUtil.DATE_FORMAT);
            String fileName = "供电安全质量日交班表"+dateTime+".xlsx";
            // 设置响应输出的头类型
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename="+fileName);

            // excel信息部分
            //供电处重点信息追踪表信息
            bureauDayShiftVo.setTrackFlag(1);
            Map<String, Object> trackSafeQualityMap =this.getTrackSafeQualityMap(bureauDayShiftVo);
            //日安全质量信息表信息
            bureauDayShiftVo.setTrackFlag(0);
            Map<String, Object> safeQualityParamsMap =this.getTrackSafeQualityMap(bureauDayShiftVo);
            //天窗兑现统计表
            Map<String, Object> skylightCashStatisticsMap = this.getSkylightCashStatisticsMap();

            //添加表
            List<Map<String, Object>> sheetsList = new ArrayList<>();
            sheetsList.add(trackSafeQualityMap);//sheet1
            sheetsList.add(safeQualityParamsMap);//sheet2
            sheetsList.add(skylightCashStatisticsMap);//sheet3

            //创建excel文件的方法
            Workbook workbook = ExcelExportUtil.exportExcel(sheetsList, ExcelType.HSSF);
            //通过response输出流直接输入给客户端
            ServletOutputStream outputStream = response.getOutputStream();
            workbook.write(outputStream);
            outputStream.flush();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


	/**
     * @Author Zhongks
     * @Description //TODO 返回重点追踪以及非重点追踪excel信息
     * @Date 9:31 2021/5/8
     * @Param [bureauDayShiftVo]
     * @return java.util.List<java.util.Map<java.lang.String,java.lang.Object>>
     **/
    public Map<String, Object> getTrackSafeQualityMap(BureauDayShiftVo bureauDayShiftVo){
        List<DayShiftExcelVo> exportList = new LinkedList<>();
        List<Map<String, Object>> allTrackSafeQualityList = bureauDayShiftMapper.getAllTrackSafeQualityList(bureauDayShiftVo);
        //封装数据
        allTrackSafeQualityList.forEach(map -> {
            String basicInformation="单位:"+map.get("unitdeptname")+"\n"+
                    "线别:"+map.get("lineName")+"\n"+
                    "所亭:"+map.get("bdsSubstationName")+"\n"+
                    "开关号:"+map.get("switchNo")+"\n"+
                    "故障地点:"+DateUtil.formatDateString(map.get("stopDate"), DateUtil.DATE_FORMAT)+"\n"+
                    "发生时间:"+map.get("unitdeptname")+"\n"+
                    "停时(分钟):"+map.get("unitdeptname")+"\n"+
                    "天气:"+map.get("unitdeptname")+"\n"+
                    "专业分类:"+map.get("unitdeptname")+"\n";
            String segmentAnalysis="单位:"+map.get("unitdeptname")+"\n"+
                    "单位:详见分析报告"+"\n";
            String isTrack="";
            if(bureauDayShiftVo.getTrackFlag()==0){
                isTrack="否";
            }else{
                isTrack="是";
            }
            String review="科室:"+map.get("trackunitdeptname")+"\n"+
                    "问题类别:"+map.get("faultCategoryConfigName")+"\n"+
                    "定责考核:"+map.get("dutyType")+"\n"+
                    "审核结果:"+map.get("switchNo")+"\n"+
                    "重点追踪:"+isTrack+"\n";
            DayShiftExcelVo dayShiftExcelVo=new DayShiftExcelVo(
                    DateUtil.formatDateString(map.get("inputDate"), DateUtil.DATE_FORMAT),
                    basicInformation,
                    (String)map.get("faultDescription"),
                    (String)map.get("reporttype"),
                    segmentAnalysis,
                    review,
                    map.get("safeQualityState").toString(),
                    String.valueOf(bureauDayShiftVo.getTrackFlag()));
            exportList.add(dayShiftExcelVo);
        });

        ExportParams exportParams = new ExportParams();
        //设置边框样式
        exportParams.setStyle(ExcelStyleType.BORDER.getClazz());
        // 设置sheet的名称
        if(bureauDayShiftVo.getTrackFlag()==0){
            exportParams.setSheetName("日安全质量信息");
        }else{
            exportParams.setSheetName("供电处重点追踪信息");
        }

        Map<String, Object> map = new HashMap<>();
        // title的参数为ExportParams类型,目前仅仅在ExportParams中设置了sheetName
        map.put("title", exportParams);
        // 模版导出对应得实体类型,即包含了List的对象
        map.put("entity", DayShiftExcelVo.class);
        // sheet中要填充得数据
        map.put("data", exportList);
        return map;
    }


    /**
     * @Author Zhongks
     * @Description //TODO 返回天窗兑现统计excel信息
     * @Date 10:59 2021/5/8
     * @Param []
     * @return java.util.Map<java.lang.String,java.lang.Object>
     **/
    public Map<String, Object> getSkylightCashStatisticsMap(){
        List<SkylightCashStatisticsExcelVo> exportList = new LinkedList<>();

        //ToDo 得到天窗兑现统计列表数据并进行封装
        //示例数据
        SkylightCashStatisticsCommonExcelVo applicationExcelVo=new SkylightCashStatisticsCommonExcelVo("申请供电类","申请非供电类");
        SkylightCashStatisticsCommonExcelVo applicationTimeExcelVo=new SkylightCashStatisticsCommonExcelVo("申请时间供电类","申请时间非供电类");
        SkylightCashStatisticsCommonExcelVo getTimeExcelVo=new SkylightCashStatisticsCommonExcelVo("给点时间供电类","给点时间非供电类");
        SkylightCashStatisticsCommonExcelVo workTimeExcelVo=new SkylightCashStatisticsCommonExcelVo("作业时间供电类","作业时间非供电类");
        SkylightCashStatisticsExcelVo skylightCashStatisticsExcelVo=new SkylightCashStatisticsExcelVo("怀化供电段","高铁","沪昆高速线",
                applicationExcelVo,"取消","10","10",applicationTimeExcelVo,getTimeExcelVo,workTimeExcelVo,"天窗取消原因");
        exportList.add(skylightCashStatisticsExcelVo);
        exportList.add(skylightCashStatisticsExcelVo);
        exportList.add(skylightCashStatisticsExcelVo);

        //供电处重点追踪信息表
        ExportParams exportParams = new ExportParams();
        //设置边框样式
        exportParams.setStyle(ExcelStyleType.BORDER.getClazz());
        // 设置sheet的名称
        exportParams.setSheetName("天窗兑现统计");

        Map<String, Object> map = new HashMap<>();
        // title的参数为ExportParams类型,目前仅仅在ExportParams中设置了sheetName
        map.put("title", exportParams);
        // 模版导出对应得实体类型,即包含了List的对象
        map.put("entity", SkylightCashStatisticsExcelVo.class);
        // sheet中要填充得数据
        map.put("data", exportList);
        return map;
    }

bureauDayShiftMapper.getAllTrackSafeQualityList(bureauDayShiftVo) 数据返回示例:

{
    "data": [
        {
            "dutyType": null,
            "unitdeptname": "长沙供电段",
            "faultPlace": "故障地点",
            "reporttype": null,
            "faultmajorname": "接触网",
            "safeQualityState": 0,
            "faultCategoryConfigName": null,
            "lineName": "南广铁路",
            "stopMinute": null,
            "weatherInfo": null,
            "inputDate": 1620460879000,
            "archiveFiles": [],
            "trackunitdeptname": "安全科",
            "bdsSubstationName": null,
            "faultDescription": "故障概况\n",
            "id": "1390912864588001281",
            "stopDate": 1619798400000,
            "switchNo": null
        }
    ],
    "message": "操作成功",
    "status": 200
}

excel实现换行说明:
在这里插入图片描述

控制器:

@ApiOperation("导出供电安全质量日交班表")
    @GetMapping("/export")
    public AjaxJson export(BureauDayShiftVo query, HttpServletResponse response) {
        bureauDayShiftService.export(query,response);
        return AjaxJson.success();
    }

三。Excel导出效果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用EasyPOI导出Excel表格(含多sheet导出以及一对多导出) 的相关文章

  • Excel 宏与 Javascript

    我希望使用 Javascript 中的宏而不是默认的 VBA 来操作 Excel 电子表格 我可以使用以下 VBA 代码执行 javascript 代码 javascript to execute Dim b As String b fun
  • Excel VBA - 如何逐行读取csv文件而不是整个文件

    这是我需要读取的 csv 文件内容 header header header header header header value value value value value value value value value 我在网上找到
  • MS Access 中的舍入

    VBA Access 中舍入的最佳方法是什么 我目前的方法是利用Excel方法 Excel WorksheetFunction Round 但我正在寻找一种不依赖Excel的方法 请注意 VBA Round 函数使用 Banker 舍入 将
  • Excel VBA 导出到文本文件。需要删除空行

    我有一个工作簿 使用以下脚本将其导出到文本文件 它工作正常 但是当我打开文本文件时 末尾总是有一个空行 这导致我在生成此文本文件后运行的另一个脚本出现问题 有关如何从导出中删除空行的任何帮助 Code Sub Rectangle1 Clic
  • laravel中过滤后如何导出excel?

    我想仅导出视图刀片中过滤的数据 我正在使用 Laravel 7 和 maatwebsite excel 3 1 和 PHP 7 4 2 我浏览了文档并应用了这个 View a href class btn btn success i cla
  • 无法将 Excel 值的类型“double”转换为“string”

    我正在加载 Excel 文件 如网络上许多地方所示 OpenFileDialog chooseFile new OpenFileDialog chooseFile Filter Excel files xls xlsl xls xlsx i
  • 如何在 Azure 逻辑应用中解析 Excel 电子表格

    我需要使用 Azure 逻辑应用从 Excel 电子表格中解析和提取列信息 我已经为我的逻辑应用程序设置了从 Outlook 检索最新未读电子邮件的功能 此外 我的逻辑应用程序执行 FOR EACH 来读取所有附件 来自未读电子邮件 并确保
  • 复制一张工作表上的静态范围,然后根据单元格中的单个值粘贴到另一张工作表中的动态范围

    我对这个问题分为三个部分 我在 Sheet1 A1 中有一个带有周数的单元格 我在 Sheet1 B1 F1 中有一个需要复制的静态范围 然后 我需要将该值粘贴到 Sheet2 中的动态范围中 偏移量为行的周数 这是我正在为我经常使用的工作
  • 定义 js-xlsx 单元格范围

    我正在尝试使用 js xlsx 读取 Excel 值 我可以使用以下代码从工作簿工作表中获取单元格值 if typeof require undefined XLSX require xlsx var workbook XLSX readF
  • 当使用公式生成超链接时,VBA 打开 Excel 超链接不起作用

    使用公式生成的 Excel 超链接似乎存在错误 我使用的是 Excel 2010 我有一个电子表格 其中的单元格包含 URL 我的目标是执行以下两件事 将这些单元格变成超链接 创建一个键盘快捷键来打开这些超链接 这样我就不必使用鼠标了 为了
  • 如何将 MySQL 查询输出保存到 Excel 或 .txt 文件? [复制]

    这个问题在这里已经有答案了 如何将 MySQL 查询的输出保存到 MS Excel 工作表 即使只能将数据存储在 txt文件 就可以了 From 将 MySQL 查询结果保存到文本或 CSV 文件中 http www tech recipe
  • Excel工作簿关闭后反复打开

    我使用了 Application ontime 方法来调度一些宏 关闭工作簿后 它会一次又一次地打开 为了解决这个问题 我在工作簿上设置了另一个事件 BeforeClosed 现在它显示运行时错误 1004 Object Applicati
  • Excel VBA - 添加自定义数字格式

    我有一个在 Excel 外部生成的文件 其中包含许多百分比 所有这些百分比都有一位小数 当导入到 Excel 中时 Excel 会在百分比中添加第二位小数 这似乎是 Excel 中百分比的某种默认格式 它只是添加了一个 0 我想将所有两位小
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 使用 ClosedXML 创建数据透视表

    我正在尝试使用 ClosedXML V0 91 1 创建数据透视表 但我不断遇到问题 因为我的 Excel 文件包含不可读的内容 然后 Excel 工作簿在单击时删除了我的数据透视表Yes below 下面是我击中时的显示Yes 它正在删除
  • 通过 Excel / VBA 调用 DLL 中的 C++ 函数在传递双参数时生成异常

    我试图通过 DLL 在 Excel VBA 中使用 C C 静态函数 我在 VS17 中调试时遇到异常 我怀疑这是参数传递方式的问题 它是双精度 EXCEL EXE 中 0x00007FFA28BBA14F kernel32 dll 处抛出
  • VBA Excel:将范围值分配给新范围

    我在将一个工作簿范围中的值分配给当前工作簿中的某个范围时遇到问题 当我使用 Range A1 C1 分配我的范围时 此代码工作正常 但是当我使用 Range Cells 1 1 Cells 1 3 定义我的范围时 该函数会失败 Sub Co
  • Excel 2010 在 IF 函数中搜索文本 - 单独的单元格数据

    Program Excel 2010 Require 一种将名字 姓氏 电子邮件提取到各个单元格的方法 Data 我的数据有一个包含原始 脏数据 的表 它是原始的并且一团糟 我用一个简单的方法整理它 IF A7 Order 1 然后其余单元
  • 将 Excel 文件读入 R 并锁定单元格

    我有一个 Excel 电子表格要读入 R 它受密码保护并锁定了单元格 我可以使用 excel link 导入受密码保护的文件 但我不知道如何解锁 取消保护单元格 excel link 给了我这个错误 gt
  • 如何使用 php 将 *.xlsb 转换为数组或 *.csv

    我正在尝试转换 xlsb文件到php array or csv文件 或至少 xls 我尝试使用PHPExcel 但看起来它无法识别该文件中的内容 我注意到 你可以重命名 xlsb文件到 zip文件 然后使用命令行解压缩unzip zip 之

随机推荐