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> {
    @Autowired
    StudentService studentService;

    ArrayList<Student> students=new ArrayList<>();

    /*
     * 每读一行内容,都会调用一次该对象的invoke,在invoke可以操作使用读取到的数据
     * student  每次读取到的封装对象
     * */
    @Override
    public 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(); //清空集合
        }

    }
   /*
   * 读取完整个文档之后调用的方法
   * */
    @Override
    public 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 {
    @Autowired
    StudentListener 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
在这里插入图片描述
报表模版
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux服务器 部署飞书信息发送服务

项目介绍&#xff1a; 飞书信息发送服务是指将飞书信息发送服务部署到一个Linux服务器上。飞书是一款企业级的即时通讯和协作工具&#xff0c;支持发送消息给飞书的功能。通过部署飞书信息发送服务&#xff0c;可以方便内网发送信息给外网飞书。 项目代码结构展示&#xff1a; …

51单片机(STC8)-- 串口配置及串口重定向(printf)

文章目录 STC8串口概述串口寄存器配置串口1控制寄存器SCON串口1数据寄存器SBUF串口1模式 1工作方式串口1波特率计算方式 串口注意事项串口1通信demo串口重定向 STC8串口概述 由下图可知STC8H3K64S4带有4个4个串行通信接口&#xff0c;芯片名后两位S所带的数字即代表这款芯片带…

用户管理第2节课--idea 2023.2 后端--实现基本数据库操作(操作user表) -- 自动生成

一、插件 Settings... 1.1 File -- Settings 1.2 Settings -- Plugins 1.2.1 搜索框&#xff0c;也可以直接搜索 1.3 Plugins -- 【输入 & 搜索】mybatis 1.3.1 插件不同功能介绍 1.3.2 翻译如下 1.4 选中 Update&#xff0c;更新下 1.4.1 更新中 1.4.2 Restart IDE 1…

华为全屋wifi6蜂鸟套装标准

华为政企42 华为政企 目录 上一篇华为安防监控摄像头下一篇华为企业级无线路由器

STM32CubeMX驱动ST7789

环境 1、单片机:STM32F103C8T6 2、开发平台&#xff1a;STM32CUBEMXkeil mdk 3、屏幕&#xff1a;ST7789&#xff0c;分辨率240*240 STM32配置 1、使用硬件SPI1驱动屏幕。配置如下&#xff1a; 2、屏幕控制引脚配置&#xff1a; 注意&#xff1a;只配置了DC,RST,CS这3个控…

重塑数字生产力体系,生成式AI将开启云计算未来新十年?

科技云报道原创。 今天我们正身处一个历史的洪流&#xff0c;一个巨变的十字路口。生成式AI让人工智能技术完全破圈&#xff0c;带来了机器学习被大规模采用的历史转折点。 它掀起的新一轮科技革命&#xff0c;远超出我们今天的想象&#xff0c;这意味着一个巨大的历史机遇正…

人工智能对网络安全的影响

技术的快速发展带来了不断增长的威胁环境&#xff0c;网络犯罪分子和恶意行为者利用我们互联世界中的漏洞。在这个数字时代&#xff0c;数据泄露和网络攻击呈上升趋势&#xff0c;仅靠传统的安全措施已经不够了。人工智能 &#xff08;AI&#xff09; 的进步彻底改变了网络安全…

【Midjourney】Midjourney根据prompt提示词生成黑白色图片

目录 &#x1f347;&#x1f347;Midjourney是什么&#xff1f; &#x1f349;&#x1f349;Midjourney怎么用&#xff1f; &#x1f514;&#x1f514;提示词格式 &#x1f34b;&#x1f34b;应用示例——“秘密花园”式涂色书配图生成 &#x1f34c;&#x1f34c;例子1…

推荐算法架构7:特征工程

1 概述 特征工程[1]&#xff08;Feature Engineering&#xff09;是推荐算法的基础&#xff0c;它对收集到的原始数据进行解析和变换&#xff0c;从而提取出模型所需要的信息。通过挖掘丰富和高质量的特征&#xff0c;并对其进行合理的处理&#xff0c;可以提升模型预估准确度…

【SVN】centos7搭建svn--亲测能通

centos7.6搭建svn 1 知识小课堂1.1 CentOS1.2 SVN 2 搭建过程2.1 前期准备2.2 通过yum命令安装svnserve2.3 创建版本库目录2.4 创建svn版本库2.5 配置修改2.5 防火墙配置2.6 启动或关闭svn服务器2.6.1 进程守护2.6.2 检测svn端口3690是否已经监听&#xff1a;2.6.3 关闭SVN 2.7…

【2023CANN训练营第二季】——Ascend C算子开发(进阶)微认证

1.微认证题目&#xff1a; 参考tensorflow的Sinh算子&#xff0c;实现Ascend C算子Sinh,算子命名为SinhCustom&#xff0c;并完成aclnn算子调用相关算法: sinh(x) (exp(x) - exp(-x)) / 2.0 要求: 1、完成host侧和kernel侧代码实现。 2、实现sinh功能&#xff0c;支持float16…

图论 | 网络流的基本概念

文章目录 流网路残留网络增广路径割最大流最小割定理最大流Edmonds-Karp 算法算法步骤程序代码时间复杂度 流网路 流网络&#xff1a; G ( V , E ) G (V, E) G(V,E) 有向图&#xff0c;不考虑反向边s&#xff1a;源点t&#xff1a;汇点 c ( u , v ) c(u, v) c(u,v)&#xff…

使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理

背景 在上一篇文章中&#xff0c;我们已经了解到华为即将发布的鸿蒙操作系统纯血版本——鸿蒙 Next&#xff0c;以及各个互联网厂商开展鸿蒙应用开发的消息。其中&#xff0c;Taro作为一个重要的前端开发框架&#xff0c;也积极适配鸿蒙的新一代语言框架 —— ArkTS。 本文将…

网络安全-API接口安全

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 API接口概念 API接口&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&…

Flink 状态管理与容错机制(CheckPoint SavePoint)的关系

一、什么是状态 无状态计算的例子&#xff1a; 例如一个加法算子&#xff0c;第一次输入235那么以后我多次数据23的时候得到的结果都是5。得出的结论就是&#xff0c;相同的输入都会得到相同的结果&#xff0c;与次数无关。 有状态计算的例子&#xff1a; 访问量的统计&#x…

【科学计算语言】实验三 Python复杂数据类型

【目的和要求】 &#xff08;1&#xff09;掌握Python语言中的组合数据类型 &#xff08;2&#xff09;掌握列表、元组、字典、集合及字符串的基本应用 &#xff08;3&#xff09;熟练运用有关序列操作的Python内置函数 【实验准备】 【实验内容】 1. 实验练习&#xff1a;掌握…

HTML5的完整学习笔记

HTML 什么是HTML&#xff1a; 作为前端三件套之一&#xff0c;HTML的全称是超文本标记语言&#xff08;Hypertext Markup Language&#xff09;。HTML是一种标记语言&#xff0c;用于创建网页。它由一系列标签组成&#xff0c;这些标签用于定义网页的结构和内容。HTML标签告诉…

[XR806开发板试用] XR806——基于FreeRTOS下部署竞技机器人先进模糊控制器

前言 很荣幸参与到由“极术社区和全志在线联合组织”举办的XR806开发板试用活动。本人热衷于各种的开发板的开发&#xff0c;同时更愿意将其实现到具体项目中。秉承以上原则&#xff0c;发现大家的重心都放在开发中的环境构建过程&#xff0c;缺少了不少实际应用场景的运用&am…

谷歌Gemini造假始末

&#x1f4a1;大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 在过去一年中&#xff0c;OpenAI ChatGPT引发了一股AI新浪潮&#xff0c;而谷歌则一直处于被压制的状态&#xff0c;迫切需要一款现象级的AI产品来…

【UML】第10篇 类图(属性、操作和接口)(2/3)

目录 3.3 类的属性&#xff08;Attribute&#xff09; 3.3.1 可见性&#xff08;Visibility&#xff09; 3.3.2 属性的名称 3.3.3 数据类型 3.3.4 初始值 3.3.5 属性字符串 3.4 类的操作&#xff08;Operations&#xff09; 3.4.1 参数表 3.4.2 返回类型 3.5 类的职责…