springboot(八)excle导出导入

x33g5p2x  于2021-12-17 转载在 其他  
字(8.1k)|赞(0)|评价(0)|浏览(566)

概述:

本文使用esaypoi3.2.0模板导入导出,与springdata jpa整合,实现数据库导出数据到excle与excle到入数据库。

      简单适用,能运用于大多数业务场景。

      esaypoi文档地址:http://easypoi.mydoc.io/

数据库:

CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT '',
  `sex` int(2) NOT NULL DEFAULT '0',
  `age` int(3) NOT NULL DEFAULT '0',
  `birthday` date DEFAULT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

/*Data for the table `user` */

insert  into `user`(`id`,`name`,`sex`,`age`,`birthday`,`create_time`) values (1,'张三',1,12,'2018-02-02','2019-03-21 11:28:21'),(2,'里斯',2,23,'2018-02-23','2019-03-21 11:28:22'),(3,'王二',1,34,'2014-02-03','2019-03-21 11:28:22');

 新建项目:springboot-excle

 打开pom.xml引入依赖

<dependencies>
		<!--springdata jpa-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		<!--web-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--mysql-->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.44</version>
		</dependency>
		<!--druid连接池-->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.10</version>
		</dependency>
		<!--easypoi-->
		<dependency>
			<groupId>cn.afterturn</groupId>
			<artifactId>easypoi-base</artifactId>
			<version>3.2.0</version>
		</dependency>
		<dependency>
			<groupId>cn.afterturn</groupId>
			<artifactId>easypoi-web</artifactId>
			<version>3.2.0</version>
		</dependency>
		<dependency>
			<groupId>cn.afterturn</groupId>
			<artifactId>easypoi-annotation</artifactId>
			<version>3.2.0</version>
		</dependency>
           <!--lombok 简化代码-->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.16.22</version>
		</dependency>
		<!--模板引擎-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<!--test-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

编辑配置文件:application.properties

#数据库配置
spring.datasource.type= com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot2?useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456

#jpa配置
spring.jpa.database=mysql
#是否显示sql
spring.jpa.show-sql=true
# create       每次运行该程序,没有表会新建表,表内有数据会清空
# create-drop  每次程序结束的时候会清空表
# update       每次运行程序,没有表会新建表,表内有数据不会清空,只会更新
# validate     运行程序会校验数据与数据库的字段类型是否相同,不同会报错
spring.jpa.hibernate.ddl-auto=update

#单个文件的大小
spring.servlet.multipart.max-file-size = 100MB
#总文件的大小
spring.servlet.multipart.max-request-size=100MB

#指定日期格式 yyyy-MM-dd HH:mm:ss
spring.jackson.date-format: yyyy-MM-dd HH:mm:ss
#mvc序列化时候时区选择
spring.jackson.time-zone: GMT+8

        注:涉及了excle的文件上传,所以我们要设置,因为springboot默认的单个文件上传大小只有1MB

        

编写User.java类

@Data
@Entity
public class User implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Excel(name = "编号")
    private int id;

    @Excel(name = "姓名")
    private String name;

    @Excel(name = "性别", replace = {"男_1", "女_2"})
    private String sex;

    @Excel(name = "年龄")
    private int age;

    @Excel(name = "出生日期", format = "yyyy-MM-dd", width = 20)
    private Date birthday;

    @Excel(name = "创建日期", format = "yyyy-MM-dd HH:mm:ss", width = 30)
    private Date createTime;

}

     注: 1.@Data注解为lombok插件的,能简化get、set方法的书写。

             2.@Entity 标明bean

             3.@Id  标明当前字段为主键

             4.@GeneratedValue(strategy = GenerationType.IDENTITY)  自增

             5.@Excel 作用到filed上面,是对Excel一列的一个描述

           ** easypoi注解介绍请看**:http://easypoi.mydoc.io/#category_41961

           @Excel中属性介绍:http://easypoi.mydoc.io/#text_186900

编写UserRepository.java类

public interface UserReposity extends JpaRepository<User, Integer> {
}

编写UserService.java类

public interface UserService {
    List<User> selectAll();
    void add(User user);
    void adds(List<User> list);
}

编写UserServiceImpl.java类

@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserReposity reposity;

    /**
     * 查询所有数据
     * @return
     */
    @Override
    public List<User> selectAll() {
        return reposity.findAll();
    }

    /**
     * 批量添加
     * @param list
     */
    @Override
    public void adds(List<User> list) {
        reposity.saveAll(list);
    }
    
}

编写excle下载工具类:ExcleUtils.java

public class ExcleUtils {
    /**
     * excle下载
     * @param list  数据集合
     * @param title excle表中的标题
     * @param sheetName  sheet名称
     * @param pojoClass  pojo类
     * @param fileName   生成的文件名
     * @param response
     */
    public static void downloadExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) {
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(title, sheetName), pojoClass, list);
        if (workbook != null) {
            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) {
                System.out.println(e.getMessage());
            }
        }
    }
}

编写文件配置类:FileConfig.java

public class FileConfig {
    //允许上传的excle表格格式
    public static final  String[] UPLOAD_EXCLE_TYPES ={"xls","xlsx"};
}

编写UserController.java

@Controller
public class UserController {
    @Resource
    private UserService userService;

    /**
     * 首页
     * @return
     */
    @GetMapping("/index")
    public String index() {
        return "index";
    }

    /**
     * excle下载
     * @param title
     * @param response
     */
    @GetMapping("/download")
    @ResponseBody
    public void downLoadExcel(String title,HttpServletResponse response) {
        String sheetName="用户";
       List<User> userList = userService.selectAll();
        ExcleUtils.downloadExcel(userList,title,sheetName,User.class,title+".xlsx",response);
    }

    /**
     * excle导入
     * @param file
     * @param request
     * @return
     */
    @PostMapping("/upload")
    @ResponseBody
    public String upload(@RequestParam("fileName") MultipartFile file, HttpServletRequest request){
        if(file.isEmpty()){
            return "空文件";
        }
        //获取文件名
        String fileName = file.getOriginalFilename();
        //获取文件后缀
        String type =fileName.indexOf(".") != -1 ? fileName.split("[.]")[1] : null;
        //文件格式判断
        if (!Arrays.asList(FileConfig.UPLOAD_EXCLE_TYPES).contains(type.toLowerCase())) {
            return "文件类型不对";
        }

        ImportParams params = new ImportParams();
        //表格标题所占据的行数,默认0,代表没有标题
        params.setTitleRows(1);
        //表头所占据的行数行数,默认1,代表标题占据一行
        params.setHeadRows(1);
        List<User> list;
        try {
            //excel的数据
            list = ExcelImportUtil.importExcel(file.getInputStream(),User.class, params);
            //导入数据库
            userService.adds(list);
            return "success";
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

}

      注:excle导入代码中有这么一句

        这里我解释一下titleRows代表的标题占据的行数,headRows对应头部占据的行数。至于什么是标题什么是头部,请看下图就名表了。

          顺便提一下,上面这张图就是我们从数据库导出的excle文件最终效果。而我们导入的时候,要记住不要编号这一列哦,因为编号是我们数据库的主键id,如果你导入存在编号的话就会对已有的数据做修改。导入数据库应该是这样的。没有编号那一列

        还有就是我们的列的标题一定要和我们对象中的@Excle name名称对应哦,也就是这里。一定要对应

编写页面文件:index.html,使用thymeleaf模板引擎

    加入<html xmlns:th="http://www.thymeleaf.org">,才能使thymeleaf语法生效

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>excle操作</title>
</head>
<body>

<p>-----------------------------------excle导入数据库-----------------------------------</p>
<form action="upload" method="post" enctype="multipart/form-data">
    <p>选择文件: <input type="file" name="fileName"/></p>
    <p><input type="submit" value="提交"/></p>
</form>

<p>-----------------------------------数据库导出excle-----------------------------------</p>
<a href="/download?title=用户信息表">用户信息表</a>下载

</body>
</html>

源码地址https://gitee.com/xu0123/springboot2

相关文章