java easyexcel上传和下载数据

安装依赖

easyexcel官方文档

  <!--通过注解的方式导出excel--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.1</version></dependency>

注意踩坑:easyexcel会和poi的依赖冲突poi必须升级 4.0以上版本都可以不然 填充模版的时候会报错

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><!--导出文件到Excel里面--><!--Apache POI是一个开源的Java库,用于处理Microsoft Office文件格式,包括.doc、.docx、.xls、.xlsx等。poi-ooxml是这个库的一部分,专门用于处理Office Open XML格式的文件,如.docx和.xlsx。--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

Student实体类加Excel注解

package com.sky.entity;import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
//@ContentRowHeight   //内容的行高
//@HeadRowHeight     //表头的行高
@ExcelIgnoreUnannotated   //没有注解的忽略不导出
public class Student {@ExcelProperty("ID")  //简单的头信息@ExcelIgnore   //不参与private String id;// @ExcelProperty(value={"学员信息表","学生姓名"})  //复杂的头信息@ExcelProperty("学生姓名")@ColumnWidth(20)    //列宽private String name;// @ExcelProperty(value={"学员信息表","学生性别"})  //复杂的头信息@ExcelProperty("学生性别")private String gender;// @ExcelProperty(value={"学员信息表","出生日期"})  //复杂的头信息  学员信息表第一个都是相同 会自动合并表头信息@ExcelProperty("出生日期")   //名称必须和Excel的文件表头一样 不然读取不到信息@ColumnWidth(20)    //列宽@DateTimeFormat("yyyy-MM-dd")private String birthday;}

创建一个读取Student类的读取文档的监听器类StudentListener 继承AnalysisEventListener 重写方法

package com.sky.listener;import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.sky.entity.Student;
import com.sky.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;import java.util.ArrayList;/*
* 读取文档的监听器类
* @Component 是Spring框架中的一个核心注解,它表示一个组件,可以是一个普通的Java类。
* 当你在一个类上使用 @Component 注解时,Spring会将其视为一个Spring组件,并将其自动注册为一个Spring bean。
* 就可以自动导入其他类使用
* */
@Component
@Scope("prototype")   //多列 就可以交个容器  不需要new了
public class StudentListener extends AnalysisEventListener<Student> {@AutowiredStudentService studentService;ArrayList<Student> students=new ArrayList<>();/** 每读一行内容,都会调用一次该对象的invoke,在invoke可以操作使用读取到的数据* student  每次读取到的封装对象* */@Overridepublic void invoke(Student student, AnalysisContext analysisContext) {//如果这里读取不到数据,看看Student类里面是否设置了复杂的头 信息//System.out.println("student="+student);students.add(student); //这里是一条一条的读取数据 添加到集合里面去//TODO 每读取5行数据  这里有个问题 少于5行的不读了 后续需要解决一下if(students.size() % 5 == 0){  //满足5条才执行studentService.readExcel(students);students.clear(); //清空集合}}/** 读取完整个文档之后调用的方法* */@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {}}

创建web接口上传和下载Excel文件

package com.sky.controller.admin;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.enums.WriteDirectionEnum;
import com.alibaba.excel.read.builder.ExcelReaderBuilder;
import com.alibaba.excel.read.builder.ExcelReaderSheetBuilder;
import com.alibaba.excel.util.MapUtils;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import com.sky.entity.FillData;
import com.sky.entity.Student;
import com.sky.listener.StudentListener;
import com.sky.result.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.*;@RestController
@RequestMapping("/admin/student")
@Api(tags = "学生类接口")
@Slf4j
public class StudentController {@AutowiredStudentListener studentListener;@GetMapping("/list")@ApiOperation("学生导入列表")public Result list(){/*** pathName  要读的文件的路径* head 文件中每一行数据要存储到的实体类型的class* readListener 读取监听器,每读一行内容,都会调用一次该对象的invoke,在invoke可以操作使用读取到的数据* *//*获得一个工作簿对象*/ExcelReaderBuilder readWorkBook= EasyExcel.read("sky-server/src/main/resources/template/学生信息表.xlsx", Student.class,studentListener);/*获得一个工作表对象  默认读取第一个工作表对象*/ExcelReaderSheetBuilder sheet=readWorkBook.sheet();/*读取工作表中内容*/sheet.doRead();return Result.success();}@GetMapping("/list1")@ApiOperation("学生导出列表")public Result list1(){/*** pathName  要写的文件的路径* head 封装写入数据的实体类型*  写的工作簿对象* *//*获得一个工作簿对象*/ExcelWriterBuilder writeWorkBook= EasyExcel.write("sky-server/src/main/resources/template/学生信息表-writer.xlsx", Student.class);/*获得一个工作表对象*/ExcelWriterSheetBuilder sheet=writeWorkBook.sheet();/** 准备数据* */List<Student> students=initData();/*写*/sheet.doWrite(students);return Result.success();}/** 生成数据*/private static List<Student> initData(){ArrayList<Student> students=new ArrayList<>();Student data=new Student();for (int i = 0; i <10 ; i++) {data.setName("学生编号010"+i);data.setBirthday("2012-03-04 12:12:12");data.setGender("女");data.setId("1");students.add(data);}return students;}/** 生成数据*/private static List<FillData> initFillData(){ArrayList<FillData> fillDatas=new ArrayList<FillData>();for (int i = 0; i <10 ; i++) {FillData fillData=new FillData();fillData.setName("学生编号10"+i);fillData.setAge(23);fillDatas.add(fillData);}return fillDatas;}/** 上传的Excel文件  读取里面的内容存储到数据库* */@PostMapping("/list2")@ApiOperation("上传Excel")public Result uplond(MultipartFile uploadExcel) {log.info("文件上传:{}", uploadExcel);try {/*获得一个工作簿对象*/ExcelReaderBuilder readWorkBook=  EasyExcel.read(uploadExcel.getInputStream(),Student.class,studentListener);/*获得一个工作表对象  默认读取第一个工作表对象*/ExcelReaderSheetBuilder sheet=readWorkBook.sheet();/*读取工作表中内容*/sheet.doRead();return Result.success();} catch (IOException e) {e.printStackTrace();}return Result.error("上传错误");}/** 下载数据* */@GetMapping("/list3")@ApiOperation("下载Excel")public void uplonddowond(HttpServletResponse response) {try {response.setContentType("application/vnd.ms-excel");response.setCharacterEncoding("utf-8");// 防止中文乱码String fileName = URLEncoder.encode("测试","UTF-8");response.setHeader("Content-Disposition","attachment; filename*=UTF-8''"+ fileName +".xlsx");//3. 通过输出流将Excel文件下载到客户端浏览器ServletOutputStream outputStream = response.getOutputStream();/*** pathName  要写的文件的路径* head 封装写入数据的实体类型*  写的工作簿对象* *//*获得一个工作簿对象*/ExcelWriterBuilder writeWorkBook= EasyExcel.write(outputStream, Student.class);/*获得一个工作表对象*/ExcelWriterSheetBuilder sheet=writeWorkBook.sheet();/** 准备数据* */List<Student> students=initData();/*写*/sheet.doWrite(students);//关闭资源outputStream.close();} catch (IOException e) {e.printStackTrace();}}/*** 按照规定的模块导入数据* 单组数据按照模版填充* */@GetMapping("/list4")@ApiOperation("单组数据按照模版填充")public Result filldatalist() {// 确定存储目录String projectDir = System.getProperty("user.dir"); //获取当前项目的根目录System.out.println(projectDir);//准备模版String templateName="sky-server/src/main/resources/template/templatedome1.xlsx";String fileName ="sky-server/src/main/resources/template/success-单组数据.xlsx";// 这里 会填充到第一个sheet, 然后文件流会自动关闭
//        FillData fillData = new FillData();
//        fillData.setName("张三");
//        fillData.setAge(5);//准备map数据Map<String,String> map = new HashMap<String, String>();map.put("name", "李四");map.put("age", "55");EasyExcel.write(fileName).withTemplate(templateName).sheet().doFill(map);return Result.success();}/*** 按照规定的模块导入数据* 多组数据按照模版填充* */@GetMapping("/list5")@ApiOperation("单组数据按照模版填充")public Result filldatalist5() {// 确定存储目录String projectDir = System.getProperty("user.dir"); //获取当前项目的根目录System.out.println(projectDir);//准备模版String templateName="sky-server/src/main/resources/template/templatedome2.xlsx";String fileName ="sky-server/src/main/resources/template/success-多组数据.xlsx";//准备数据List<FillData> fillDataList=initFillData();//填充数据,doXXX会在读写结束后自动关闭流EasyExcel.write(fileName).withTemplate(templateName).sheet().doFill(fillDataList);return Result.success();}/*** 按照规定的模块导入数据* 组合按照模版填充* */@GetMapping("/list6")@ApiOperation("单组数据按照模版填充")public Result filldatalist6() {// 确定存储目录String projectDir = System.getProperty("user.dir"); //获取当前项目的根目录System.out.println(projectDir);//准备模版String templateName="sky-server/src/main/resources/template/templatedome3.xlsx";String fileName ="sky-server/src/main/resources/template/success-组合数据.xlsx";//准备数据List<FillData> fillDataList=initFillData();//创建一个手动关闭流 build()ExcelWriter workBook=EasyExcel.write(fileName,FillData.class).withTemplate(templateName).build();//创建工作表对象WriteSheet sheet=EasyExcel.writerSheet().build();//换行,不然组合的会覆盖FillConfig fillConfig=FillConfig.builder().forceNewRow(true).build();HashMap<String,String> dateAndTotal=new HashMap<>();dateAndTotal.put("date","2023-12-12");dateAndTotal.put("total","20000");//多组填充workBook.fill(fillDataList,fillConfig,sheet);//单组填充workBook.fill(dateAndTotal,sheet);//关闭流workBook.finish();return Result.success();}/*** 按照规定的模块导入数据* 水平填充* */@GetMapping("/list7")@ApiOperation("单组数据按照模版填充")public Result filldatalist7() {// 确定存储目录String projectDir = System.getProperty("user.dir"); //获取当前项目的根目录System.out.println(projectDir);//准备模版String templateName="sky-server/src/main/resources/template/templatedome4.xlsx";String fileName ="sky-server/src/main/resources/template/success-水平填充.xlsx";//准备数据List<FillData> fillDataList=initFillData();//创建一个手动关闭流 build()ExcelWriter workBook=EasyExcel.write(fileName,FillData.class).withTemplate(templateName).build();//创建工作表对象WriteSheet sheet=EasyExcel.writerSheet().build();//换行,不然组合的会覆盖FillConfig fillConfig=FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();//多组填充workBook.fill(fillDataList,fillConfig,sheet);//关闭流workBook.finish();return Result.success();}/*** 按照规定的模块导入数据* 报表导出* */@GetMapping("/list8")@ApiOperation("报表导出")public Result filldatalist8() {// 确定存储目录String projectDir = System.getProperty("user.dir"); //获取当前项目的根目录System.out.println(projectDir);//准备模版String templateName="sky-server/src/main/resources/template/运营数据统计.xlsx";String fileName ="sky-server/src/main/resources/template/success-报表导出.xlsx";//准备数据List<Student> fillStudent=initData();//创建一个手动关闭流 build()ExcelWriter workBook=EasyExcel.write(fileName,Student.class).withTemplate(templateName).build();//创建工作表对象WriteSheet sheet=EasyExcel.writerSheet().build();HashMap<String,String> dateAndTotal=new HashMap<>();dateAndTotal.put("date","2023-12-12");dateAndTotal.put("increaseCount","200");dateAndTotal.put("totalCount","2000");dateAndTotal.put("increaseCountWeek","20000");dateAndTotal.put("increaseCountMonth","30000");//单组填充workBook.fill(dateAndTotal,sheet);//多组填充workBook.fill(fillStudent,sheet);//关闭流workBook.finish();return Result.success();}
}

在这里插入图片描述
模版1 templatedome1
在这里插入图片描述
模版2 templatedome2
在这里插入图片描述
模版3 templatedome3
在这里插入图片描述
模版4 templatedome4
在这里插入图片描述
报表模版
在这里插入图片描述

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

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

相关文章

【单调栈】LeetCode:2818操作使得分最大

作者推荐 map|动态规划|单调栈|LeetCode975:奇偶跳 涉及知识点 单调栈 题目 给你一个长度为 n 的正整数数组 nums 和一个整数 k 。 一开始&#xff0c;你的分数为 1 。你可以进行以下操作至多 k 次&#xff0c;目标是使你的分数最大&#xff1a; 选择一个之前没有选过的 非…

【已解决】Python Bresenham 3D算法

放一段使用Python实现Bresenham 3D 算法的代码&#xff0c;并通过Matplot可视化 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from numba import njitnjit def bresenham_safe(grid, x0, y0, z0, x1, y1, z1, value_to_fill…

linux系统和网络(二):进程和系统时间

本文主要探讨linux系统进程和系统相关知识&#xff0c;本博客其他博文对该文章的部分内容有详细介绍 main函数 int main(int argc,char *argv[],char *envp[]); 操作系统下main执行前先执行引导代码,编译连接引导代码和程序连接在一起构成可执行程序,加载器将程序加载到内存中…

Docker与容器化安全:漏洞扫描和安全策略

容器化技术&#xff0c;特别是Docker&#xff0c;已经成为现代应用程序开发和部署的关键工具。然而&#xff0c;容器化环境也面临着安全挑战。为了保障容器环境的安全性&#xff0c;本文将介绍如何进行漏洞扫描、制定安全策略以及采取措施来保护Docker容器。我们将提供丰富的示…

conda环境下更改虚拟环境安装路径

1 引言 在Anaconda中如果没有指定路径,虚拟环境会默认安装在anaconda所安装的目录下,但如果默认环境的磁盘空间不足&#xff0c;无法满足大量安装虚拟环境的需求&#xff0c;此时我们需要更改虚拟环境的安装路径&#xff0c;有以下两种方案&#xff1a; 方案1&#xff1a; 每次…

Linux--编写系统服务脚本

编写一个名为myprog的系统服务脚本&#xff0c;通过位置变量s1指定的start、stop、restart、status控制参数&#xff0c;分别用来启动、停止、重启sleep进程&#xff0c;以及查看sleep进程的状态。其中&#xff0c;命令sleep用来暂停指定秒数的时间&#xff0c;这里仅用做测试&…

【数据结构和算法】---栈和队列的互相实现

目录 一、用栈实现队列1.1初始化队列1.2模拟入队列1.3模拟出队列1.4取模拟的队列头元素1.5判断队列是否为空 二、用队列实现栈2.1初始化栈2.2模拟出栈2.3模拟入栈2.4取模拟的栈顶元素2.5判读栈是否为空 一、用栈实现队列 具体题目可以参考LeetCode232. 用栈实现队列 首先要想到…

SpringMVC:整合 SSM 下篇

文章目录 SpringMVC - 05整合 SSM 下篇一、设计页面1. 首页&#xff1a;index.jsp2. 展示书页面&#xff1a;showBooks.jsp3. 增加书页面&#xff1a;addBook.jsp4. 修改书页面&#xff1a;updateBook.jsp5. 总结 二、控制层1. 查询全部书2. 增加书3. 修改书4. 删除书5. 搜索书…

【华为机试】2023年真题B卷(python)-单词接龙

一、题目 题目描述&#xff1a; 单词接龙的规则是&#xff1a;可用于接龙的单词首字母必须要前一个单词的尾字母相同&#xff1b; 当存在多个首字母相同的单词时&#xff0c;取长度最长的单词&#xff0c;如果长度也相等&#xff0c;则取字典序最小的单词&#xff1b;已经参与接…

由Hello World的世界看世界

前言 以前总是自诩一门自己比较有天赋的学科&#xff0c;每每看到一些文章和句子&#xff0c;眼前就能浮现时态、句型、词组、惯用法等一些概念&#xff0c;相当于重复学习&#xff0c;反复强化。 对于C编程语言中&#xff0c;看到简单的不能再简单的Hello World程序示例&…

SpringMVC系列之技术点定向爆破二

SpringMVC的运行流程 客户端发送请求 tomcat接收对应的请求 SpringMVC的核心调度器DispatcherServlet接收到所有请求 请求地址与RequestMapping注解进行匹配&#xff0c;定位到具体的类和具体的处理方法&#xff08;封装在Handler中&#xff09; 核心调度器找到Handler后交…

成功案例分享:物业管理小程序如何助力打造智慧社区

随着科技的进步和互联网的普及&#xff0c;数字化转型已经渗透到各个行业&#xff0c;包括物业管理。借助小程序这一轻量级应用&#xff0c;物业管理可以实现线上线下服务的无缝对接&#xff0c;提升服务质量&#xff0c;优化用户体验。本文将详细介绍如何通过乔拓云网设计小程…

vue 全局定时更新 轮询

首先需要在最外层的父组件定义一个刷新的时间 初始值为nulll, 在定义一个新时间用于监听状态的变化。 data () {return {dataTime: 0,inverterMonTimer: null, // 设置刷新时间 2 分钟一次}},然后再钩子函数中执行定义封装的方法 mounted&#xff08;&#xff09;{this.getIn…

LeetCode刷题--- 目标和

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜…

ECMAScript基础入门

ECMAScript&#xff0c;通常简称为 ES&#xff0c;是标准化的JavaScript语言规范。以下是一些ECMAScript基础入门的关键概念和特性&#xff1a; 1. **变量**&#xff1a; - ECMAScript是弱类型语言&#xff0c;这意味着你不需要预先声明变量的类型&#xff0c;变量可以存储…

TOGAF—架构(Architecture)项目管理—详细指导意见

本节描述了开发企业架构时要使用的详细项目管理方法。本节的目标受众是已经熟悉 TOGAF 标准并领导架构项目的企业架构师。 本节分为几个小节,这些小节描述了以下方法: 架构 项目启动,包括 ADM 阶段 A 的项目管理活动以及项目管理方法的项目启动和“启动”活动体系结构 项目…

设计模式之-建造者模式通俗易懂理解,以及建造者模式的使用场景和示列代码

系列文章目录 设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式&#xff0c;5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式&#xff0c;每一种模式的概念、使用…

基于SSM的剧本杀预约系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的剧本杀预约系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

easyrecovery数据恢复软件15安装下载免注册版本下载

说起数据恢复软件&#xff0c;相信没有小伙伴不知道easyrecovery这个软件吧&#xff0c;该软件具有快捷、高效、便捷的特点&#xff0c;且提供的功能也非常全面&#xff0c;不仅可以恢复各样被删除的文件、视频、图片等&#xff0c;还可以支持SD卡数据恢复&#xff0c;TF卡等各…

系列一、MQ简介

一、MQ简介 1.1、概述 MQ&#xff08;Message Queue&#xff09;&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件&#xff0c;是一套提供了消息&#xff08;消息即数据&#xff0c;一般消息的体量不会很大&#xff09;生产、存储、消费全过程的API软…