导入导出Excel

news2024/9/27 23:24:27

一、Springboot + Easyexcel读取写入数据,多头行数,多sheet,复杂表头简单实现

1. 导入依赖,阿里的easyexcel插件

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>2.1.6</version>
</dependency

在这里插入图片描述

创建一个用来 读取 excel的实体类

实体类的属性可以用

  • @ExcelProperty(index = 0),index=0,找的是上图 A列(第一列)

  • @ExcelProperty(value = “标号”)

两种都可以用,但是不要两个一起用

实体类:

实体类中可以使用@DateFormat(阿里包下的)注解:

要使用String类型来接收数据才有用


@Data 
public class TemplateEntity {

    @ExcelProperty("标号")
    private Integer label;

    @ExcelProperty("字符串")
    private String str;

    @ExcelProperty("数字")
    private Integer num;
 	
    @ExcelProperty("时间")
    // 这里需要用string接收才会格式化
    @DateTimeFormat("yyyy-MM-dd")
    private String date;
    
}
————————————————

定义一个 监听类:

public class TemplateListener extends AnalysisEventListener<TemplateEntity> {

    private List<TemplateEntity> list = new ArrayList<>();

    // 一条一条读取数据,全部添加到list集合里
    @Override
    public void invoke(TemplateEntity data, AnalysisContext analysisContext) {
        list.add(data);
    }
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {}

    public List<TemplateEntity> getData() {
        return list;
    }
}
service:
public interface TemplateService {

    /**
     * 导入excel
     */
    Result importExcel(MultipartFile file) throws IOException;
}

@Service
public class TemplateServiceImpl implements TemplateService {
    @Override
    public Result importExcel(MultipartFile file) throws IOException{
        List<TemplateEntity> entities = getTemplateEntities(file);
        // 处理数据
        System.out.println(entities);
        return Result.success(entities);
    }
    // 读取 excel 数据
    private List<TemplateEntity> getTemplateEntities(MultipartFile file) throws IOException {
        TemplateListener listener = new TemplateListener();	// 定义的 listener
        EasyExcel.read(file.getInputStream(), TemplateEntity.class, listener).sheet().doRead();
        
        // 返回 所有数据
        return listener.getData();
    }
}

Controller 上传文件接口

@RestController
@RequestMapping("/sys")
public class TemplateController {

    @Autowired
    private TemplateService templateService;

    @RequestMapping("/import")
    public Result importData(@RequestPart("file") MultipartFile file) throws IOException{
        return templateService.importExcel(file);
    }
}

Postman测试

{
    "code": 200,
    "msg": "处理成功",
    "data": [
        {
            "label": 1,
            "str": "a",
            "num": 20
        },
        {
            "label": 2,
            "str": "b",
            "num": 30
        },
        {
            "label": 3,
            "str": "c",
            "num": 40
        },
       ...
}
————————————————

多sheet

两sheet表头数据不一致

这里为了演示效果,sheet1和sheet3是不同表头的,sheet2目前是空的数据表
在这里插入图片描述

思路:需要定义各自的excel接收数据的实体类,然后创建各自的监听类,重写方法

读取时,指定不同的监听类,excel接收数据的实体类对象,然后放入map中返回即可

具体实现

实体类

TemplateEntity接收sheet1

@Data
public class TemplateEntity {
    @ExcelProperty("标号")
    private Integer label;
    @ExcelProperty("字符串")
    private String str;
    @ExcelProperty("数字")
    private Integer num;
    @ExcelProperty(value = "时间")
    @DateTimeFormat("yyyy-MM-dd")
    private String date;
}

OtherTemplateEntity接收sheet3

@Data
public class OtherTemplateEntity {
    @ExcelProperty("标号")
    private String label;
    @ExcelProperty("名称")
    private String name;
    @ExcelProperty("类型")
    private String type;
    @ExcelProperty(value = "时间")
    @DateTimeFormat("yyyy-MM-dd")
    private String date;
}

监听类

同上,只是写两个各自的

controller层

@PostMapping("/importMany")
public R importMany(@RequestPart("file") MultipartFile file) throws IOException {
    return easyExcelService.importManyExcel(file);
}
service实现层
public R importManyExcel(MultipartFile file) throws IOException {
    Map<String, Object> map = getTemplateEntitiesMany(file);
    List<TemplateEntity> data1 = (List<TemplateEntity>) map.get("data1");
    List<OtherTemplateEntity> data2 = (List<OtherTemplateEntity>) map.get("data2");
    log.info("data1数据=={}", data1);
    log.info("data2数据=={}", data2);
    return R.success(map);
}

private Map<String, Object> getTemplateEntitiesMany(MultipartFile file) throws IOException {
        Map<String,Object> map = new HashMap<>();
        TemplateListener listener = new TemplateListener();	// 定义的 listener
        OtherTemplateListener otherListener = new OtherTemplateListener();

        ExcelReader excelReader = EasyExcel.read(file.getInputStream()).build();
        // 这里为了简单 所以注册了 同样的head 和Listener 自己使用功能必须不同的Listener
        // readSheet参数设置读取sheet的序号
    	// 读取sheet1
        ReadSheet readSheet1 =
               EasyExcel.readSheet(0).head(TemplateEntity.class).registerReadListener(listener).build();
    	// 读取sheet3
        ReadSheet readSheet2 =
                EasyExcel.readSheet(2).head(OtherTemplateEntity.class).registerReadListener(otherListener).build();

        excelReader.read(readSheet1, readSheet2);
        // 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
        excelReader.finish();

    	// 取出数据放入map中,然后返回
        List<TemplateEntity> data1 = listener.getData();
        List<OtherTemplateEntity> data2 = otherListener.getData();
        map.put("data1", data1);
        map.put("data2", data2);

        return map;
    }
{
    "code": 200,
    "msg": "OK",
    "message": null,
    "data": {
        "data2": [
            {
                "label": "a",
                "name": "a1",
                "type": "t1",
                "date": "2022-01-07"
            },
            {
                "label": "b",
                "name": "b1",
                "type": "t2",
                "date": "2022-01-07"
            }
            ......
        ],
        "data1": [
            {
                "label": 1,
                "str": "a",
                "num": 20,
                "date": "2021-12-20"
            },
            {
                "label": 2,
                "str": "b",
                "num": 30,
                "date": "2021-12-20"
            }
            ......
        ]
    }
}

多行头

读取时设置头行数即可

headRowNumber是头行数,如下是设置头行数2,那么读取时会从第三行开始读取数据

private List<TemplateEntity> getTemplateEntities(MultipartFile file) throws IOException {
        TemplateListener listener = new TemplateListener();	// 定义的 listener
        EasyExcel.read(file.getInputStream(), TemplateEntity.class, listener).sheet(0).headRowNumber(2).doRead();
        // 返回 所有数据
        return listener.getData();
    }
读取表头数据

在监听类中重写invokeHeadMap方法,将表头数据也添加即可

public class TemplateListener extends AnalysisEventListener<TemplateEntity> {

    private List<TemplateEntity> list = new ArrayList<>();
    @Override
    public void invoke(TemplateEntity data, AnalysisContext context) {
        list.add(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {}

    public List<TemplateEntity> getData() {
        return list;
    }

    @Override
    public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
        // 读取到头数据
        LOGGER.info("解析到一条头数据:{}", JSON.toJSONString(headMap))
    }
————————————————

Springboot + Easyexcel 导出数据

简单导出excel

实体类省略,还是上面的TemplateEntity

导出excel数据,这里有两种写法,拟定好文件名称直接传入方法,会自动创建一个文件

模拟数据 10条数据
// 模拟数据
private List<TemplateEntity> exportData() {
    List<TemplateEntity> entities = new ArrayList<>();
    for (int i = 0; i< 10; i++) {
        TemplateEntity entity = new TemplateEntity();
        entity.setStr("字符串" + i);
        entity.setDate("数据" + i);
        entity.setLabel(i+1);
        entity.setNum(i);
        entities.add(entity);
    }
    return entities;
}
导出程序

public R export() {
    String path = "C:\\Users\\EDZ\\Desktop\\";

    // 写法1
    String fileName = path + System.currentTimeMillis() + ".xlsx";
    // 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
    // 如果这里想使用03 则 传入excelType参数即可
    EasyExcel.write(fileName, TemplateEntity.class).sheet("模板").doWrite(exportData());

    // 写法2
    // 这里 需要指定写用哪个class去写
    ExcelWriter excelWriter = EasyExcel.write(fileName, TemplateEntity.class).build();
    WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
    excelWriter.write(exportData(), writeSheet);
    // 千万别忘记finish 会帮忙关闭流
    excelWriter.finish();

    return R.success();
}
————————————————

在这里插入图片描述

过滤导出列
public R export() {
    String path = "C:\\Users\\EDZ\\Desktop\\";
    
    String fileName = path + System.currentTimeMillis() + ".xlsx";
    
    // 加入要忽略date字段
    Set<String> excludeColumnFiledNames = new HashSet<String>();
    excludeColumnFiledNames.add("date");
	EasyExcel.write(fileName,TemplateEntity.class).excludeColumnFiledNames(excludeColumnFiledNames).sheet("模板").doWrite(exportData());   
    
}

在这里插入图片描述

复杂头写入 合并表头

实体类
@Data
public class TemplateEntity {

    @ExcelProperty({"主标题", "标号"})
    private Integer label;

    @ExcelProperty({"主标题", "字符串"})
    private String str;

    @ExcelProperty({"主标题", "数字"})
    private Integer num;

    @ExcelProperty({"主标题", "时间"})
    @DateTimeFormat("yyyy-MM-dd")
    private String date;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1078471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp上echarts地图钻取

1: 预期效果 通过切换地图 , 实现地图的钻取效果 2: 实现原理以及核心方法/参数 一开始是想利用更换地图数据的形式进行地图钻取 , 这就意味着我们需要准备全国30多个省份的地图数据 , 由于一开始考虑需要适配小程序端 , 如此多的地图文件增加了程序的体积 , 如果使用接口调…

element el-table表格表头某一列表头字段修改颜色

需求&#xff1a; 1 使用 :header-cell-class-name"addClass" 属性 2 根据显示条件 在redText&#xff0c;whiteText 中设置你想要添加的必填表头index 3.根据条件修改文字样式 完整代码 <el-table ref"tableRef" :cell-style"{ color: #FFF,…

拥抱产业发展机遇 兑现5G商业价值

[阿联酋&#xff0c;迪拜&#xff0c;2023年10月10日] 今天&#xff0c;以“将5G-A带入现实”为主题的2023全球移动宽带论坛在迪拜举行。本次大会上&#xff0c;华为轮值董事长胡厚崑与GSMA总干事Mats Granryd围绕“5G产业进程与发展”连线对话。胡厚崑指出&#xff0c;“技术发…

redis 哨兵 sentinel

sentinel巡查监控后台master主机是否故障&#xff0c;如果故障根据投票数自动将某一个从库转换为新主库&#xff0c;继续对外服务 sentinel 哨兵的功能 监控 监控主从redis库运行是否正常消息通知 哨兵可以将故障转移的结果发送给客户端故障转移 如果master异常&#xff0c;则…

openEuler 系统搭建高可用 Kubernetes 集群

k8s 高可用集群部署 在生产环境中&#xff0c;k8s 高可用集群部署能够确保应用程序稳态运行不出现服务中断情况。 此处我们基于 openEuler 系统环境&#xff0c;配置 Keepalived 和 HAproxy 使负载均衡&#xff08;LB/Load Balancer&#xff09;、实现高可用。 步骤如下&…

NZ系列工具NZ04:VBA网络连接测试

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

UOS通过GPG对文件签名验签

本人用的版本&#xff1a;gpg (GnuPG) 2.2.12 生成密钥 生成公钥/私钥对 gpg --full-generate-key设置密钥的长度 默认回车3072&#xff0c;越长越安全。 设定密钥的有效期限 默认回车“0” 构建用户标识 输入姓名、邮件、注释后&#xff0c;输入“o”确认 在弹出框内…

班级文化建设方案分享 中学高中建设方案

班级文化建设方案 一、基本信息 名称&#xff1a;xxxx计划 时间&#xff1a;XXXX年XX月-XXXX年XX月 地点&#xff1a;[XXXXX] 参与人群&#xff1a;X班全体师生及家长 目的和宗旨&#xff1a;通过班级文化建设&#xff0c;营造积极向上的班级氛围&#xff0c;增强班级凝聚…

分布式数据库HBase(林子雨慕课课程)

文章目录 4. 分布式数据库HBase4.1 HBase简介4.2 HBase数据模型4.3 HBase的实现原理4.4 HBase运行机制4.5 HBase的应用方案4.6 HBase安装和编程实战 4. 分布式数据库HBase 4.1 HBase简介 HBase是BigTable的开源实现 对于网页搜索主要分为两个阶段 1.建立整个网页索引&#xf…

Zabbix 简介与部署

一、zabbix 简介 1、概念&#xff1a; Zabbix 是一个开源的网络监控系统&#xff0c;用于监视和管理计算机系统、网络和应用程序的性能和可用性。它提供了广泛的监控、警报、数据收集和可视化功能&#xff0c;能够有效地监测和管理大规模的IT基础设施。 2、监控对象&#xf…

github创建个人网页登录后404无法显示的问题

1.首先必须要有内容&#xff0c;默认是会找index.html文件&#xff0c;找不到该文件会找readme.md文件&#xff0c;也就是说最简单的方法是&#xff0c;创建了与用户名同名的repository后username.github.io后&#xff0c;添加一个readme.md文件&#xff0c;得在readme里打点字…

智哪儿线下活动来啦 ~这次我想和你聊聊「AI营销」的生意经

大家好&#xff0c;我们又要见面了。 近年来&#xff0c;ChatGPT等不断涌现的新技术深深改变着我们的生活。而在家居行业&#xff0c;「智哪儿」观察到&#xff0c;一方面&#xff0c;行业现有营销方案获客成本太高、效率比较低&#xff0c;家居建材企业数智化转型趋势越来越明…

短视频剪辑:如何批量调整播放倍速,轻松掌控节奏?

在短视频剪辑中&#xff0c;调整播放倍速是一项常见的操作。通过对视频播放速度的掌控&#xff0c;我们可以让视频节奏更加丰富&#xff0c;提升观众的观看体验。本文将介绍如何批量调整短视频的播放倍速&#xff0c;帮助你轻松掌控节奏。 首先&#xff0c;我们需要了解节奏和倍…

智慧城市智慧灯杆IP网络广播可视紧急求助系统

智慧城市智慧灯杆IP网络广播可视紧急求助系统 深圳锐科达智慧城市智慧灯杆IP网络广播紧急求助系统 引言&#xff1a; 智慧路灯隶属于智慧城市&#xff0c;是智慧城市系统下的一个分支&#xff0c;也是其中一个重要组成部分。智慧城市系统平台功能强大&#xff0c;架构复杂&am…

React和vue等前端html页面引入自定义字体文件,更改页面字体样式

font-family中列出的是几乎适用于所有计算机的网络安全字体&#xff0c;如&#xff1a;Arial/Helvetica/Georgia/Times New Roman等。但是如果想要一些特别的字体&#xff0c;可以从外部网站中找到并下载&#xff0c;然后在代码中引入。网页自带的字体没有很多&#xff0c;有时…

2023年中国钢木装甲门产量、销量及市场规模分析[图]

钢木装甲门是一种结合了钢质和木材的复合材料门&#xff0c;其结构由钢质外壳和内部木质框架组成。钢木装甲门通常具有钢质外壳的坚固性和安全性&#xff0c;以及内部木质框架的美观和装饰性。 钢木装甲门行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#x…

【Java 进阶篇】CSS 属性

当你学习CSS时&#xff0c;了解CSS属性是非常重要的&#xff0c;因为这些属性控制了网页上元素的外观和布局。本文将详细介绍一些常见的CSS属性&#xff0c;包括文本属性、盒子模型属性、背景和边框属性、定位属性等。我们还将为每个属性提供示例代码&#xff0c;以便你更好地理…

MP逻辑删除

一、什么是逻辑删除 MybatisPlus中逻辑删除通俗说为了在数据库中保留数据&#xff0c;但是又不想进行其他一些sql语句时有他&#xff08;刚刚通过逻辑删除了的&#xff09;的存在。就是在数据库中添加一字段&#xff0c;通过数值内容来说明那些是指删除了的即可 二、逻辑删除…

智能筛选超时物流订单的技巧详细揭秘

现如今&#xff0c;电子商务的快速发展使得快递成为了我们日常生活中不可或缺的一部分。然而&#xff0c;随着快递量的增加&#xff0c;快递查询的问题也开始变得棘手起来。有时候&#xff0c;我们会遇到快递超时的情况&#xff0c;而这时候我们需要一种快捷的方式来查询快递的…

今年的秋招面试,确实有点难。

不可否认的是&#xff0c;今年秋招确实有点难 从今年的形势来看&#xff0c;好的 offer 都掌握在少数人的手里&#xff0c;想要秋招找到理想的工作&#xff0c;要么学历好&#xff0c;要么技术功底很扎实&#xff0c;这两样都不占的话&#xff0c;就业压力就会比较大。 如何从…