当前位置: 首页 > news >正文

Springboot 最简单的结合MYSQL数据实现EXCEL表格导出及数据导入

前言

嗯,今天如题,给大家介绍下最最最简单的实现excel导入导出的功能,功能简单叙述:

导入:读取本地的excel表格,将里面的内容都插入对应的数据库表(批量插入)

导出:读取数据库表内容,将其导出到excel文件

进入正题前,还是啰嗦一下,为啥要做一个这样的简单实战介绍呢,因为现在网上很多结合poi实现excel导入导出的教程不是太花了,就是各种版本老旧,所以在此,我也是等于提炼一下可用的,等于结合实战给大家一个最新的,最简单的教程例子。

(至于连接mybatis的整合以及查询MYSQL这些就不做介绍了,这是前提,我们不用模拟数据,当然你可以用也就是模拟个List而已嘛)

ps :(当前这篇是入门,还有几篇扩展篇)

Springboot 指定自定义模板导出Excel文件_小目标青年的博客-CSDN博客

Springboot 导出Excel文件,多个需要压缩成 zip 包_小目标青年的博客-CSDN博客

Springboot 导入导出Excel ,一对多关系,复合表格、合并单元格数据_小目标青年的博客-CSDN博客 

正文


开始实战!
 

先上pom.xml中需要用到关于excel导入导出的依赖:

<!-- 导入和导出-->
<dependency>
   <groupId>cn.afterturn</groupId>
   <artifactId>easypoi-base</artifactId>
   <version>3.0.3</version>
</dependency>
<dependency>
   <groupId>cn.afterturn</groupId>
   <artifactId>easypoi-web</artifactId>
   <version>3.0.3</version>
</dependency>
<dependency>
   <groupId>cn.afterturn</groupId>
   <artifactId>easypoi-annotation</artifactId>
   <version>3.0.3</version>
</dependency>

OK,创建个实体类,User.java:

package com.example.tdemo.pojo;

import cn.afterturn.easypoi.excel.annotation.Excel;

public class User {
    @Excel(name = "学号", orderNum = "0")
    private Integer id;
    @Excel(name = "姓名", orderNum = "1")
    private String  userName;
    @Excel(name = "年龄", orderNum = "2")
    private String  userAge;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", userName='" + userName + '\'' +
                ", userAge='" + userAge + '\'' +
                '}';
    }

    public User() {
    }

    public User(Integer id, String userName, String userAge) {
        this.id = id;
        this.userName = userName;
        this.userAge = userAge;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserAge() {
        return userAge;
    }

    public void setUserAge(String userAge) {
        this.userAge = userAge;
    }
}

然后是 excel导入导出的工具类,ExcelUtil:

package com.example.tdemo.util;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.File;

import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;

import java.util.Map;
import java.util.NoSuchElementException;

public class ExcelUtil {

    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName,boolean isCreateHeader, HttpServletResponse response){
        ExportParams exportParams = new ExportParams(title, sheetName);
        exportParams.setCreateHeadRows(isCreateHeader);
        defaultExport(list, pojoClass, fileName, response, exportParams);

    }
    //导出
    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass,String fileName, HttpServletResponse response){
        defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName));
    }
    public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response){
        defaultExport(list, fileName, response);
    }

    private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) {
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams,pojoClass,list);
        if (workbook != null);
        downLoadExcel(fileName, response, workbook);
    }

    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition",
                    "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage());
        }
    }
    private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) {
        Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
        if (workbook != null);
        downLoadExcel(fileName, response, workbook);
    }

    //导入
    public static <T> List<T> importExcel(String filePath,Integer titleRows,Integer headerRows, Class<T> pojoClass){
        if (StringUtils.isBlank(filePath)){
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        List<T> list = null;
        try {
            list = ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
        }catch (NoSuchElementException e){
            throw new RuntimeException("模板不能为空");
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e.getMessage());
        }
        return list;
    }
    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){
        if (file == null){
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        List<T> list = null;
        try {
            list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
        }catch (NoSuchElementException e){
            throw new RuntimeException("excel文件不能为空");
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
        return list;
    }



}

OK,接下来玩导出导入,

既然是结和MYSQL数据库,那么我们简单看看,表,毕竟刚刚也创建了实体类:

 

 好了,然后UserMapper简单贴一下:

@Mapper
public interface UserMapper {


    //查询所有
    List<User> queryUserInfo();


    //插入所有
    void addUserInfo(List<User> list);
}

相关的 userMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.tdemo.mapper.UserMapper">

    <!--查询所有用户信息-->
    <select id="queryUserInfo" resultType="com.example.tdemo.pojo.User">
        select *
        from user
    </select>


    <!--批量插入信息-->
    <insert id="addUserInfo" parameterType="java.util.List">
        insert into user(
        user_name,
        user_age
        )
        values
        <foreach collection="list" item="item" index= "index" separator =",">
            (
            #{item.userName},
            #{item.userAge}
            )
        </foreach>
    </insert>

   

</mapper>

然后是UserService:

public interface UserService {



    //查询所有
    List<User> queryUserInfo();
    //插入所有
    void addUserInfo(List<User> list);
}

对应的实现类:

@Service
public class UserServiceImpl implements UserService {


    @Autowired
    UserMapper userMapper;
    @Override
    public List<User> queryUserInfo() {
        return userMapper.queryUserInfo();
    }

    @Override
    public void addUserInfo(List<User> list) {

       userMapper.addUserInfo(list);
    }
}

 好了,开始导出导入了!

我们直接看代码,创建一个TestController,

package com.example.tdemo.controller;

import com.example.tdemo.pojo.User;
import com.example.tdemo.service.impl.UserServiceImpl;
import com.example.tdemo.util.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.util.List;

@RestController
public class TestController {

    @Autowired
    UserServiceImpl userService;


    @RequestMapping("exportExcel")
    public void export(HttpServletResponse response){


        List<User> userList = userService.queryUserInfo();
        //导出操作
        ExcelUtil.exportExcel(userList,"用户信息","sheet1",User.class,"testDATA.xls",response);
    }

    @RequestMapping("importExcel")
    public String importExcel(){
        String filePath = "C:\\testInfo.xls";
        //解析excel,
        List<User> userList = ExcelUtil.importExcel(filePath,1,1,User.class);
        //也可以使用MultipartFile,使用 FileUtil.importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass)导入
        System.out.println("导入数据一共【"+userList.size()+"】行");

        userService.addUserInfo(userList);
        List<User> userList2 = userService.queryUserInfo();
        return userList2.toString();

    }



}

 好像结束了,我们来简单调下接口,验证下吧:

导出前数据表数据是这样的:

 调用导出接口(谷歌浏览器默认下载到对应路径,IE\360等浏览器可以选择导出下载地址):

 OK,EXCEL表格已经导出,我们看看打开看看:

OK的,没有什么问题。

那我们继续调下导入吧(记得看下对应的接口,导入选择的路径我们是写死的,文件名也是,后期结合前端交互可以改为路径选择传入),

 先看看需要导入数据的EXCEL表格内容,

好,开始调用导入接口(将EXCEL表格内容转化为List,再将List数据批量插入数据库):

OK,我们导入数据,插入数据库后打印出来当前表信息,其实已经可以确定,肯定是无误了,最后看看数据库:

 

好了,就到此结束吧,是不是很简单? 

相关文章:

  • Springboot中使用GSON报错 An attempt was made to call the method com.google.gson.GsonBuilder.setLenient
  • IDEA @AutoWired注入bean 出现红色波浪线
  • JAVA 最常用实用的正则表达式校验
  • Springboot 整合WebFlux 实现RESTFUI风格API 及简单的CRUD
  • Springboot 读取配置文件application.properties (yml)的四种方式
  • Springboot 指定获取自己写的配置properties文件的值
  • JAVA AES加密解密工具类
  • Springboot 快速了解 事务回滚@Transactional
  • Springboot Mybatis使用pageHelper实现分页查询
  • JAVA 雪花算法 唯一ID生成工具类
  • 灵魂的拷问 怎么将代码写得让人无法维护?
  • 灵魂的拷问 Hashtable的命名
  • 运行ElasticSearch报错:uncaught exception in thread [main] org.elasticsearch.bootstrap.StartupException
  • JAVA 8 Stream 常用操作
  • JAVA 8 Stream优雅使用结合实战分析
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 2017前端实习生面试总结
  • 230. Kth Smallest Element in a BST
  • Angular2开发踩坑系列-生产环境编译
  • export和import的用法总结
  • Hibernate最全面试题
  • use Google search engine
  • vue 配置sass、scss全局变量
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • WePY 在小程序性能调优上做出的探究
  • yii2权限控制rbac之rule详细讲解
  • 基于axios的vue插件,让http请求更简单
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 巧用 TypeScript (一)
  • 王永庆:技术创新改变教育未来
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • $NOIp2018$劝退记
  • (2)STL算法之元素计数
  • (33)STM32——485实验笔记
  • (6)添加vue-cookie
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (搬运以学习)flask 上下文的实现
  • (笔试题)合法字符串
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十) 初识 Docker file
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)Sublime Text3配置Lua运行环境
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • [ C++ ] STL_stack(栈)queue(队列)使用及其重要接口模拟实现
  • [].slice.call()将类数组转化为真正的数组