easy poi 实现Excel文件的导入导出(SpringBoot整合)

2023-11-06

easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法
码云源码地址
官方文档(说实话这官方文档我觉得挺EMMM的,看到我后面的Excel上传数据至数据库你就知道了)

下面上demo
代码已上传至码云

先准备一个整合好了持久层框架的SpringBoot项目,怎么弄就不赘述了。
不过需要注意的是easypoi是在实体类的属性上加注解来与excel的格式做出映射关系。这里给出数据库的建表sql和数据及实体类代码。

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `sex` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,
  `create_time` datetime(0) DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `user` VALUES (1, 'zhangsan', '1', '2020-07-22 10:08:59');
INSERT INTO `user` VALUES (2, '李四', '0', '2020-07-22 10:09:00');
INSERT INTO `user` VALUES (3, '王五', '1', '2020-07-22 10:08:59');
INSERT INTO `user` VALUES (4, '赵四', '0', '2020-07-22 10:09:00');

实体类User

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class User implements Serializable {

    private static final long serialVersionUID=1L;

    /**
     * 主键ID
     */
    private Long id;

    /**
     * 姓名
     */
    @Excel(name = "姓名", height = 20, width = 30, isImportField = "true")
    private String name;

    /**
     * 性别
     */
    @Excel(name = "性别", replace = { "男_1", "女_0" }, suffix = "生", isImportField = "true")
    private Integer sex;

    /**
     * 创建时间
     */
    @Excel(name = "创建时间", databaseFormat = "yyyy-MM-dd HH:mm:ss", format = "yyyy-MM-dd HH:mm:ss", isImportField = "true", width = 40)
    private Date createTime;
}

@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
这三个注解是lombok的就不多做解释了
@Excel是easypoi的注解,大概的作用就是将excel中的列和实体类的属性关联起来,可以理解为做了一个映射,这样easypoi就可以将每一行的数据根据这个映射关系转换成一个个实体对象。
此外该注解还有许多属性,常用的比如name表示对应excel文件中表头的列,databaseFormat可以控制时间输出格式,replace可对指定值进行替换。详见注解文档

导出

到这里基本上准备工作就做好了,我们来做导出。
大致的流程就是我们先将数据从数据库中查出来,获得一个List。通过easypoi提供的工具类生成一个excel文件并将这个List通过固定的格式放进去。最后将这个excel文件通过response的输出流传送给客户,实现下载。
controller层代码

@RequestMapping("exportExcel")
    public void exportExcel(HttpServletResponse response){
        userService.exportExcel(response);
    }

service层代码

@Override
    public void exportExcel(HttpServletResponse response) {
        //获取数据库数据
        List<User> userList = userDao.selectList(null);
        userList.forEach(user->System.out.println(user));
        //生成Excel文件
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户表","用户列表"),
                User.class, userList);
        response.setCharacterEncoding("UTF-8");
        response.setHeader("content-Type", "application/vnd.ms-excel");
        //通过输出流输出文件
        try {
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode("用户", "UTF-8") + ".xls");
            ServletOutputStream out = response.getOutputStream();
            workbook.write(out);
            out.flush();
            out.close();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

导入

到这里导出基本上就做好了,当时写到这里还有点小激动,又多学会了一点,嘿嘿。
然后我满怀激动的去看官方文档准备做个基础的导入,嗯。。。官网给我的提示是这样的
在这里插入图片描述
我当时是懵的,然后我开始冥思苦想各种查资料怎么做导入。最后我突然看到导出中调用的工具类名ExcelExportUtil,根据我们常用的代码规范。有InputStream就有OutputStream,那么有ExcelExportUtil是不是也有ExcelImportUtil呢。于是我真找到了
在这里插入图片描述
应该就是这个importExcel方法了,根据提示的参数类型。第一个参数应该是上传过来的excel文件或者输入流,第二个参数就是对应的实体类类型,第三个应该是一些固定的参数,我们直接new一个默认的先试试好了。
反正最后我是成功了,下面上代码
controller层代码

@RequestMapping("importExcel")
    public void importExcel(@RequestParam("file") MultipartFile file){
        userService.importExcel(file);
    }

service层代码

@Override
    public void importExcel(MultipartFile file) {
        List<User> userList = null;
        //将excel文件中的数据放入List中
        try {
            userList = ExcelImportUtil.importExcel(file.getInputStream(), User.class,new ImportParams());
        } catch (Exception e) {
            e.printStackTrace();
        }
        //将数据放入数据库
        userList.forEach(user->System.out.println(user));
        userDao.insertList(userList);
    }

上传excel的格式是下面这样的
在这里插入图片描述
最后给个简陋的前端测试页面
位于static文件夹下的index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传excl</title>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js">
    </script>
</head>
<body>
<div class="panel panel-primary">
     <!-- .panel-heading 面板头信息。 -->
     <div class="panel-heading">
      <!-- .panel-title 面板标题。 -->
      <h1 class="panel-title">上传excl并插入到数据库</h1>
     </div>
</div>
<form class="form-horizontal" action="/importExcel" enctype="multipart/form-data" method="post">
    <div class="form-group">
        <div class="input-group col-md-4">
                    <span class="input-group-addon">
                <i class="glyphicon glyphicon-search"></i>
            </span>
                  <input class="form-control" placeholder="请选择文件" type="file" name="file"/>
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-4">
            <div class="btn-group btn-group-justified" >
                <div class="btn-group" >
                    <button type="submit" class="btn btn-success" id="submitbtn">
                        <span class="glyphicon glyphicon-share"></span>&nbsp;excel上传</button>
                </div>
            </div>
        </div>
    </div>
</form>

<table border="0" style="margin-top:4px; margin-left: 18px">
    <tr>
        <td><a href="#" class="easyui-linkbutton" onclick="downloadfile1();">excel导出</a></td>
    </tr>
</table>

<script>
    function downloadfile1(){
        window.location.href="/exportExcel";
    }
</script>

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

easy poi 实现Excel文件的导入导出(SpringBoot整合) 的相关文章

  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • Hibernate 挂起或引发延迟初始化,没有会话或会话已关闭

    我正在增强旧的 Spring Hibernate 应用程序 但我陷入困境 我有一种方法可以读取 3000 多行长的文件 每行都有一条记录 必须与数据库中的某些内容进行比较 然后必须将寄存器添加到数据库 多对多表 表和关系是 Branch h
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 使用 svn 1.8.x、subclise 1.10 的 m2e-subclipse 连接器在哪里?

    我读到 m2e 的生产商已经停止生产 svn 1 7 以外的任何版本的 m2e 连接器 Tigris 显然已经填补了维护 m2e subclipse 连接器的空缺 Q1 我的问题是 使用 svn 1 8 x 的 eclipse 更新 url
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 展望2020

    区块链行业在2019年末迎来高光时刻 国家明确指出把区块链作为核心技术自主创新重要突破口 加快推动区块链技术和产业创新发展 新年伊始 陀螺财经邀请到数位学术圈 产业圈的相关人士 运用他们的专业知识 行业实践 剖析2020年行业的发展动向 谈
  • 【算法】链表

    算法 链表 反转链表 移除链表 交换链表 链表相交 删除链表中的倒数第N个节点 环形链表 反转链表 反转链表是指将单向链表的顺序逆转 即原本的链表方向由头节点指向尾节点 变为尾节点指向头节点 在 JavaScript 中 可以通过修改节点的
  • KEIL的下载图标是灰色的怎么办

    今天用cubemx配置好之后 generate发现下载图表是灰色的 解决方法 魔术棒下面的debug选项 有个右下角有个空手动输入 MPU
  • mock测试工具

    什么是mock测试 mock常见场景 mock常用工具 实战 1 什么是mock测试 mock测试就是对于某些不容易构造或者不容易获取的对象 用一个虚拟的对象来创建以便测试的测试方法 2 mock常见场景 1 无法控制第三方系统某接口的返回
  • PTA 7-100 敲笨钟 (20 分)(C语言版)

    微博上有个自称 大笨钟V 的家伙 每天敲钟催促码农们爱惜身体早点睡觉 为了增加敲钟的趣味性 还会糟改几句古诗词 其糟改的方法为 去网上搜寻压 ong 韵的古诗词 把句尾的三个字换成 敲笨钟 例如唐代诗人李贺有名句曰 寻章摘句老雕虫 晓月当帘
  • 测试开源C#人脸识别模块ViewFaceCore(2:人脸关键点定位器和活体检测)

    ViewFaceCore模块中的FaceLandmarker类支持识别人脸关键点 也即人脸上的关键位置的坐标 其中主要调用Mark函数返回图片中指定人脸的关键点位置集合 该类需配合FaceDetector类共同使用 FaceLandmark
  • UnityWebRequest下载图片和视频进行使用

    利用空余时间写一下网络下载资源使用 进行熟悉一些UnityWebRequest unity已经抛弃了WWW 这里很简单只需要把脚本挂载就行 所有的界面操作都通过代码实现 资源的下载 删除都做了相应的操作 using System Colle
  • 未定义标识符 HMAC_CTX_init

    这是因为 这是旧版本的代码 HMAC CTX hctx HMAC CTX init hctx HMAC Init ex hctx mac key sizeof mac key EVP sha1 NULL HMAC Update hctx p
  • 什么是数据中台?

    写在前面的话 不要被技术吓到哦 本文尽量写的白话 致力为从事大数据的运营 咨询规划 需求以及想学习大数据的入门者提供知识分享 导读 本文将阐述 为什么要建设数据中台 什么是数据中台 数据中台具备什么样的能力 采用什么技术来实现 一 为什么要
  • QEventLoop源码

    Copyright C 2015 The Qt Company Ltd Contact http www qt io licensing This file is part of the QtCore module of the Qt To
  • JDBC的原理与开发步骤(详解)

    简介 JDBC Java DataBase Connectivity 就是Java数据库连接 说白了就是用Java语言来操作数据库 原来我们操作数据库是在控制台使用SQL语句来操作数据库 JDBC是用Java语言向数据库发送SQL语句 原理
  • 想成为网络安全工程师需要学习掌握哪些技术

    想成为网络安全工程师 GPT建议需要掌握以下技术 1 网络基础知识 了解网络协议 网络拓扑 子网划分等基础概念 2 操作系统知识 熟悉常见操作系统 如Windows Linux 的安全配置和漏洞 3 数据库知识 了解数据库的安全配置和防御技
  • Java开发过程中的避坑点(一)

    1 典型空指针问题 包装类型的空指针问题 级联调用的空指针问题 Equals方法左边的空指针问题 ConcurrentHashMap 这样的容器不支持 Key 和 Value 为 null 集合 数组直接获取元素 对象直接获取属性 1 1包
  • RDA 升级

    烧录BOOT升级方式 1 连接 2 烧录BOOT 1 升级 bootrom raw bin 99K 这种升级方式需要Tera Term 工具 按 F5 U盘升级 编译的升级文件 RR8503 bin RR8501 bin RR52C bin
  • figma有哪些快速入门的好用技巧

    使用Figma在创建设计系统或处理大型设计项目时 总会涉及批量修改 快速定位 自动布局问题 MarcAndrew这篇文章分享了技巧 可以大大提高设计效率 希望对大家有所帮助 在这篇文章中 我列出了一些快速简单的方法来帮助你更快地使用它Fig
  • Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)

    本文主要解决一个问题 如何实现二叉树的前中后序遍历 有两个要求 1 O 1 空间复杂度 即只能使用常数空间 2 二叉树的形状不能被破坏 中间过程允许改变其形状 通常 实现二叉树的前序 preorder 中序 inorder 后序 posto
  • 猿如意中的【blender】工具详情介绍

    文章目录 一 工具名称 二 下载安装渠道 2 1 什么是猿如意 2 2 如何下载猿如意 三 工具介绍 四 blender介绍 4 1 blender简介 4 2 背景 4 3 主要功能 五 软件安装过程 5 1 如何在猿如意中下载开发工具b
  • 散列表习题

    1 考虑key的集合S 0 8 16 24 32 40 48 56 64 用除余法构造的散列函数 h1 key key 12 h2 key key 11 h1将S映射到的值域有几个元素 3 h2将S映射到的值域有几个元素 9 2 散列表的规
  • 【1分钟解决VS试用期到期】——登录用户时浏览器跳转失败

    登录 按钮下的 账户选项 将会默认跳转到左侧 环境 选项下的 账户 此界面中右上的 嵌入式Web浏览器 改为 系统Web浏览器 即可正常跳转登录 若没有微软账户可免费注册
  • easy poi 实现Excel文件的导入导出(SpringBoot整合)

    easypoi功能如同名字easy 主打的功能就是容易 让一个没见接触过poi的人员 就可以方便的写出Excel导出 Excel模板导出 Excel导入 Word模板导出 通过简单的注解和模板 语言 熟悉的表达式语法 完成以前复杂的写法 码