easyExcel文件上传与下载

2023-11-12

目录

1.导入POM依赖

2.模板文件 

3.实体类

4.前端页面

5.模板文件上传(Controller)

6.文件下载(Controller)

7.导出效果


 

1.导入POM依赖

        <!-- commons-io 文件流依赖-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.7</version>
        </dependency>
        <!-- commons-fileupload -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>

       <!-- easyexcel依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.0.5</version>
        </dependency>

2.模板文件 

 上面是导出模板,如果导入得话工资下面得要换成{.salary},否则报错,也可以设置实体类为字符串然后截取工资部分。

3.实体类

package com.ahead.entity;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.format.NumberFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentRowHeight;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.alibaba.excel.enums.poi.FillPatternTypeEnum;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;

/**
 * <p>
 *
 * 创建employee类,用于构建向Excel表格中写数据的类型;
 * @ExcelProperty:这个注解是EasyExcel提供,用于生成Excel表格头
 * @author 荣
 * @since 2022-12-18
 */

@ContentRowHeight(30) //设置内容高度
@HeadRowHeight(50)    //设置标题高度
@ColumnWidth(25)      //设置列宽
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("employee")
@ApiModel(value = "Employee对象", description = "")
public class Employee implements Serializable {

    private static final long serialVersionUID = 1L;

    // 字符串的内容的背景设置成天蓝(可以改后面数字)
    @ContentStyle(fillPatternType = FillPatternTypeEnum.SOLID_FOREGROUND, fillForegroundColor = 40)
    @ExcelProperty("用户编号")
    @ApiModelProperty("用户编号")
    @TableId(value = "userId", type = IdType.AUTO)
    private Integer userId;

    @ExcelProperty("姓名")
    @ApiModelProperty("姓名")
    @TableField("userName")
    private String userName;

    @ExcelProperty("性别")
    @ApiModelProperty("性别")
    @TableField("gender")
    private String gender;

//    设置浮点数导出格式
    @NumberFormat("#.##")
    @ExcelProperty("工资")
    @ApiModelProperty("工资")
    @TableField("salary")
    private Double salary;


//    设置日期导出格式
    @DateTimeFormat("yyyy年MM月dd日 HH时mm分ss秒")
    @ExcelProperty("入职日期")
    @ApiModelProperty("入职日期")
    @TableField("hireDate")
    private Date hireDate;


}

4.前端页面

1.文件上传(此处用得是layui得上传页面)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>zyupload上传实例</title>
    <link rel="stylesheet" th:href="@{/layuimini-v2/lib/layui-v2.6.3/css/layui.css}" media="all">
    <link rel="stylesheet" th:href="@{/layuimini-v2/lib/jq-module/zyupload/zyupload-1.0.0.min.css}" media="all">
    <link rel="stylesheet" th:href="@{/layuimini-v2/css/public.css}" media="all">
</head>
<body>
<!--<div class="layuimini-container">-->
<div class="layuimini-main">


        <div class="layui-upload-drag" id="test10">
            <i class="layui-icon"></i>
            <p>点击上传,或将文件拖拽到此处</p>
            <div class="layui-hide" id="uploadDemoView">
                <hr>
                <img src="" alt="上传成功后渲染" style="max-width: 196px">
            </div>
        </div>

</div>

    <div>
    <form th:action="@{/ahead/employee/fileDownload}" method="get">
        <input type="submit" value="文件下载">
    </form>

</div>

<script th:src="@{/layuimini-v2/lib/jquery-3.4.1/jquery-3.4.1.min.js}" charset="utf-8"></script>
<script th:src="@{/layuimini-v2/lib/layui-v2.6.3/layui.js}" charset="utf-8"></script>
<script th:src="@{/layuimini-v2/lib/jq-module/zyupload/zyupload-1.0.0.min.js}" charset="utf-8"></script>
<script type="text/javascript">

    layui.use(['upload', 'element', 'layer'], function(){
        var $ = layui.jquery
            ,upload = layui.upload
            ,element = layui.element
            ,layer = layui.layer;


        //拖拽上传
        upload.render({
            elem: '#test10'
            ,url: '../ahead/employee/fileUpload' //此处用的是第三方的 http 请求演示,实际使用时改成您自己的上传接口即可。
            ,accept: 'file' //普通文件
            ,done: function(res){
                layer.msg('上传成功');
                console.log(res);
            }
        });

</script>

</body>
</html>

5.模板文件上传(Controller)

    @RequestMapping("/fileUpload")
    @ResponseBody
    public DataFormat fileUpload(MultipartFile file) throws FileUploadException, IOException {

        InputStream inputStream = file.getInputStream();

        ArrayList<Employee> list = new ArrayList<>();
        DataFormat dataFormat = new DataFormat();
        EasyExcel.read(inputStream, Employee.class, new ReadListener<Employee>() {

            @Override
            public void invoke(Employee employee, AnalysisContext analysisContext) {
                Employee employee1 = new Employee();
//可以根据字段唯一性先查询下数据库字段是否重复
                employee1.setUserName(employee.getUserName());
                employee1.setGender(employee.getGender());
                employee1.setSalary(employee.getSalary());
                employee1.setHireDate(employee.getHireDate());
                list.add(employee1);
            }

            @Override
            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                boolean b = employeeService.saveBatch(list);
                if (b == true){
                    dataFormat.setMsg("上传成功!");
                }else {
                    dataFormat.setMsg("上传失败!");
                }
            }
        }).sheet().headRowNumber(3).doRead();

        return dataFormat;
}

6.文件下载(Controller)

    @RequestMapping("/fileDownload")
    @ResponseBody
    public void fileDownload(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题,请直接用浏览器或者用postman
        try {

//            设置响应头
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
            // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
            String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");

            //获取模板文件的文件流
            InputStream inputStream = getClass()
                .getClassLoader().getResourceAsStream("Template/userTemplate2.xlsx");

            //查询数据
            List<Employee> list = employeeService.list(null);

            // 这里需要设置不关闭流
            EasyExcel.write(response.getOutputStream(), Employee.class)
                    .withTemplate(inputStream)
                    .autoCloseStream(Boolean.FALSE)
                    .sheet(0)
                    .doFill(list);
        } catch (Exception e) {
            // 重置response
            response.reset();
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            Map<String, String> map = MapUtils.newHashMap();
            map.put("status", "failure");
            map.put("message", "下载文件失败" + e.getMessage());
            response.getWriter().println(JSON.toJSONString(map));
        }


    }

7.导出效果

 

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

easyExcel文件上传与下载 的相关文章

随机推荐

  • Linux的进程管理

    目录 1 概述 2 进程描述符 2 1 进程描述符的分配 2 2 进程描述符的存放 2 3 进程状态 2 4 进程上下文 2 5 进程家族树 3 进程的创建 4 进程的终结 5 线程的实现 1 概述 进程是执行期的代码 但是进程不止包括这样
  • 系统性考量【复盘】这件事儿

    文章目录 1 为什么要做复盘 意义是什么 2 制定指标 3 做好复盘 4 里程碑反馈 1 为什么要做复盘 意义是什么 每日复盘的意义 可以帮助我们节省精力 有一个稳定自己的结构 这个结构可以帮助我们更好的输出 更好的输入 更好的获取价值 在
  • 智能合约漏洞案例,DEI 漏洞复现

    智能合约漏洞案例 DEI 漏洞复现 1 漏洞简介 https twitter com eugenioclrc status 1654576296507088906 2 相关地址或交易 https explorer phalcon xyz t
  • IOS xcode使用自带模板Tab bar Controller创建主页

    前面写过一篇类似的android版本 是使用的Bottom Navigation Activity结合Fragment创建APP的主页 IOS端的更简单 直接使用Tab bar Controller就可以了 一 创建Tab bar Cont
  • 技术至简-1:信源编码VS信道编码

    信源编码 用最精炼最简洁的语言文字表达最复杂的含义 目的是节省 纸张 信道编码 用啰嗦冗余的语言文字 注解表达简单的信息 目的是确保信息万无一失
  • Android databinding的接入使用与详解(一)

    一 介绍 DataBinding 是Google Android组件框架 管理view和data之间进行绑定 DataBinding主要管理数个布局文件 这样我们就不用去实例化layout的view 直接通过DataBindingUitl来
  • 软件测试须知基于PostMan的接口自动化测试

    临近年底 公司任务也不是很多 趁这个机会老大让我研究了一下PostMan的脚本自动化测试 作为一个前端开发 说实话 对于PostMan的操作 仅仅限于新建请求 gt 填写url地址和参数 gt send发送 然后看看返回值而已 事实上 Po
  • Python读取CSV文件,数值精度丢失

    Excel保存为csv以后 大数值的列 会把转换为科学计数法 而且后边几位都会被转为0 搞了很多方法 最后直接安装 openpyxl 组件 和 pandas 读取Excel文件就行了 data pd read excel C work 20
  • Search:Vscode 如何自定义Python代码高亮

    参考 白月黑羽的python教程网站 不太习惯Dark主题 然而又没有找到合适的Light Theme IDLE Shell的高亮倒是不错 可是VScode 的插件里没搜到 上网搜索 感谢B站up白月黑羽的分享 最终使用 Atom One
  • Unity3d FPS游戏之武器切换

    U3D武器系统切枪 多种武器切换教程 多种武器切换教程 我们要通过鼠标来实现切枪效果 我们要有几种思路 1 通过值来索引对应武器数组下标的值 然后生成 在切换武器的时候 先销毁当前的武器 在生成新武器 2 直接先全部生成 状态全部不激活 通
  • 144项大神级ppt制作技术

    1 两幅图片同时动作 PowerPoint的动画效果比较多 但图片只能一幅一幅地动作 如果你有两幅图片要一左一右或一上一下地向中间同时动作 可就麻烦了 其实办法还是有的 先安置好两幅图片的位置 选中它们 将之组合起来 成为 一张图片 接下来
  • ubuntu虚拟机变成只读文件系统的解决方法

    因非正常关机可能导致文件系统变为只读 1 先在windows系统里给硬盘 或虚拟机文件夹 去掉只读权限 2 可选项 搜索框输入cmd 以管理员身份运行 依次执行下面的命令 diskpart list disk 列出磁盘 select dis
  • python没基础能自学吗-需要自学python吗?大概多久能学会?

    以下内容针对有编程经历的同学 没有编程经历的建议跟着视频学习 我这准备了一套基础的python视频资料 需要的同学可以私信我 对于python这块有任何不懂的问题可以随时来问我 我对于学习方法 系统学习规划 提高学习效率这些知道一点 希望可
  • 【华为OD】

    华为OD试题注意事项 使用合适的编程语言 在华为OD机试中多数情况下使用C 或Java 按照题目要求进行编码 仔细阅读题目描述并理解要求 在编码前可以进行伪代码编写或画流程图有助于理解和排除逻辑错误 注意代码的规范性 注重代码的可读性和可维
  • nrm ls *(星号)不见了,修改了cls文件也没有用

    问题描述 在使用nrm切换源的时候 发现执行nrm ls命令后 原本的 号不见了 这样很难一眼看出当前使用的npm源 npm https registry npmjs org yarn https registry yarnpkg com
  • 电子元器件符号+实物图+命名规则(太全了,绝对收藏)

    电子电路中常用的器件包括 电阻器 含电位器 电容器 电感器 变压器 二极管 三极管 光电器件 电声器件 显示器件 晶闸管 可控硅 场效应晶体管 IGBT MOSFET 继电器与干簧管 开关 保险丝 晶振 连接器 各种传感器等 下面一起来看看
  • 兼莱宝分享:适合上班族空闲时间做的三种靠谱副业?

    只讲干货 不来虚的 作为一个有着4年自由写作经验的人 做过的兼职非常多 什么给人家做海报 写商业文案 做民宿体验师等等 都有尝试过 每一份工作的收入都是不一样的 今天只分享3种靠谱的副业 都是我自己做过并且有收益的副业 一 自媒体写作 很多
  • 每日学习:Idea和Eclipse中的一些常用快捷键

    1 删除光标所在行代码 idea快捷键 Ctrl X eclipse快捷键 Ctrl D 2 复制光标所在行代码 或者鼠标选中的代码 idea快捷键 Ctrl D eclipse快捷键 Ctrl Alt 上下键 3 切换代码大小写 idea
  • Nacos 中下线服务时报错:The Raft Group [naming_instance_metadata] did not find the Leader node;解决

    问题描述 因为某些特殊原因需要把nacos迁移到另一个版本的nacos 我迁的是nacos2 0 2版本 迁移完成后 Nacos注册中心有一个微服务有多台实例的时候 点击一个实例下线操作 报错 caused errCode 500 errM
  • easyExcel文件上传与下载

    目录 1 导入POM依赖 2 模板文件 3 实体类 4 前端页面 5 模板文件上传 Controller 6 文件下载 Controller 7 导出效果 1 导入POM依赖