Excel一键导入导出-EasyPOI

EasyPOI是一款优秀的开源Java库,专为简化和优化Excel文件的导入导出操作而设计。下面,我会介绍EasyPOI在项目中使用EasyPOI,实现Excel文件的高效操作。帮助读者全面了解和掌握这一工具。

EasyPOI简介

官网:

http://www.wupaas.com/

开发指南:

http://doc.wupaas.com/docs/easypoi/easypoi-1c0u4mo8p4ro8

Gitee:

https://gitee.com/lemur/easypoi#https://gitee.com/link?target=http%3A%2F%2Fwww.wupaas.com%2F

EasyPOI的目标是做到比Apache POI简单,降低Excel导入导出时的复杂度。其主要特点如下:

  • 简洁的API:EasyPOI拥有更为简洁直观的API,使得操作Excel变得更加容易。
  • 注解驱动:使用注解来配置Excel映射,减少代码量,提高开发效率。
  • 模板导出支持:提供了丰富的模板导出功能,便于生成各种复杂的报表。
  • 强大的导入功能:支持大数据量的导入,且可以对导入数据进行校验。
  • 多样的数据处理:支持图片、公式、日期等多种类型的数据处理。

使用场景

  • 数据报表生成:可以快速生成企业内部的财务、销售等报表。
  • 数据汇总分析:对收集来的大量数据进行汇总和分析,生成可视化Excel报告。
  • 信息管理系统:在学生、员工等信息管理系统中,进行数据的快捷导入导出。

基础用法

环境准备

使用EasyPOI之前,需要将其作为依赖加入到你的项目中。如果你使用Maven,可以在pom.xml中加入如下依赖:

主依赖
<dependency>
        <groupId>cn.afterturn</groupId>
        <artifactId>easypoi-base</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>cn.afterturn</groupId>
        <artifactId>easypoi-web</artifactId>
        <version>4.2.0</version>
    </dependency>
    <dependency>
        <groupId>cn.afterturn</groupId>
        <artifactId>easypoi-annotation</artifactId>
        <version>4.2.0</version>
    </dependency>
其他依赖
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- MyBatis -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>

    <!-- MySQL Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
数据库

Create Table

CREATE TABLE `user` (
  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(255) DEFAULT NULL COMMENT '姓名',
  `bir` timestamp NULL DEFAULT NULL COMMENT '出生日期',
  `photo` varchar(150) DEFAULT NULL COMMENT '头像',
  `habbys` varchar(100) DEFAULT NULL COMMENT '爱好',
  `cardno` varchar(18) DEFAULT NULL COMMENT '身份证号',
  `address` varchar(60) DEFAULT NULL COMMENT '住址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
Field Type Comment
主键 id int(10) NOT NULL 编号
name varchar(255) NULL 姓名
bir timestamp NULL 出生日期
photo varchar(150) NULL 头像
habbys varchar(100) NULL 爱好
cardno varchar(18) NULL 身份证号
address varchar(60) NULL 住址
配置文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
mybatis.type-aliases-package=com.yu.pojo
server.port=8081
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/EasyPOI
spring.datasource.username=root
spring.thymeleaf.cache=false
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

数据模型
@Data
@ExcelTarget("users")
public class User implements Serializable {
    @Excel(name = "编号")
    private String id;
    @Excel(name = "姓名")
    private String name;
    @Excel(name = "生日", format = "yyyy年MM月dd日")
    private Date bir;
    @Excel(name = "头像信息", type = 2, savePath = "src/main/resources/static/images")
    private String photo;
    @Excel(name = "爱好", width = 12.0)
    private String habbys;
    @Excel(name = "身份证号", width = 15.0)
    private String cardno;
    @Excel(name = "家庭住址", width = 15.0)
    private String address;
}
DAO层
@Mapper
public interface UserMapper {
    //查询所有
    List<User> findAll();
    //插入记录
    void save(User user);
}
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.yu.dao.UserMapper">
    <!--查询所有-->
    <select id="findAll" resultType="User">
        select id,name,bir,photo,habbys,cardno,address from user
    </select>
    <!--插入记录-->
    <insert id="save" parameterType="User" useGeneratedKeys="true" keyProperty="id">
        insert into user values (#{id},#{name},#{bir},#{photo},#{habbys},#{cardno},#{address})
    </insert>
</mapper>
Service层接口
public interface UserService {
    List<User> findAll();
    //批量保存
    void saveAll(List<User> users);
}
Service层服务类
@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> findAll() {
        return userMapper.findAll();
    }

    @Override
    public void saveAll(List<User> users) {
        users.forEach(user -> {
            user.setId(null);
            user.setPhoto(user.getPhoto().substring(user.getPhoto().lastIndexOf("\\") + 1));
            System.out.println(user.getPhoto());
            userMapper.save(user);
        });
    }
}
启动类
@SpringBootApplication
public class EasyPOIApplication {
    public static void main(String[] args) {
        SpringApplication.run(EasyPOIApplication.class, args);
    }
}
Thymeleaf
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>导入excel的主页面</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            background-color: #f5f5f5;
        }

        .container-fluid {
            max-width: 960px;
            margin: 0 auto;
            padding: 20px;
        }

        h1 {
            text-align: center;
            margin-bottom: 30px;
        }

        form {
            margin-bottom: 20px;
        }

        .form-group {
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .form-control {
            margin-right: 10px;
        }

        table {
            width: 100%;
            border-collapse: collapse;
        }

        th, td {
            padding: 10px;
            text-align: left;
            border: 1px solid #ccc;
        }

        img {
            max-width: 60px;
            max-height: 60px;
        }

        .btn {
            display: inline-block;
            padding: 10px 20px;
            background-color: #007bff;
            color: #fff;
            text-decoration: none;
            border-radius: 4px;
        }

        .btn:hover {
            background-color: #0056b3;
        }
    </style>
<body>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-12">
            <h1>选择Excel文件导入到数据中</h1>
            <form th:action="@{/user/import}" method="post" enctype="multipart/form-data" class="form-inline">
                <div class="form-group">
                    <input class="form-control" type="file" name="excelFile">
                    <input type="submit" class="btn btn-danger" value="导入数据">
                </div>
            </form>
        </div>
        <div class="col-md-12">
            <h1>显示导入数据列表</h1>
            <table class="table table-bordered" >
                <tr>
                    <th>编号</th>
                    <th>头像</th>
                    <th>姓名</th>
                    <th>生日</th>
                    <th>爱好</th>
                    <th>身份证号</th>
                    <th>家庭住址</th>
                </tr>
                <tr th:each="user : ${users}">
                    <td th:text="${user.id}"></td>
                    <td><img th:src="${'/images/'+ user.photo}" height="60px" alt=""></td>
                    <td th:text="${user.name}"></td>
                    <td th:text="${#dates.format(user.bir,'yyyy-MM-dd')}"></td>
                    <td th:text="${user.habbys}"></td>
                    <td th:text="${user.cardno}"></td>
                    <td th:text="${user.address}"></td>
                </tr>
            </table>

            <hr>
            <a th:href="@{/user/export}" class="btn btn-info">导出excel</a>
        </div>

    </div>
</div>

</body>
</html>
Controller层
@Controller
@RequestMapping("/user")
@Slf4j
public class UserController {
    @Autowired
    private UserService userService;
    //查询所有
    @RequestMapping("/findAll")
    public String findAll(HttpServletRequest request){
        List<User> users = userService.findAll();
        request.setAttribute("users",users);
        return "index";
    }

    //导入excel
    @RequestMapping("/import")
    public String importExcel(MultipartFile excelFile) throws Exception {
        log.info("文件名称: [{}]",excelFile.getOriginalFilename());
        ImportParams params = new ImportParams();
        params.setTitleRows(1);//设置一级标题行为1行
        params.setHeadRows(1);//设置header标题为1行
        List<User> users;
        try (InputStream inputStream = excelFile.getInputStream()) {
            users = ExcelImportUtil.importExcel(inputStream, User.class, params);
        }
        log.info("导入总数为: [{}]", users.size());
        userService.saveAll(users);
        return "redirect:/user/findAll";
    }


    //导出excel
    @RequestMapping("/export")
    public void exportExcel(HttpServletResponse response, HttpServletRequest request) throws IOException {

        List<User> users = userService.findAll();
        users.forEach(user -> {
            try {
                Excel excelAnn = user.getClass().getDeclaredField("photo").getAnnotation(Excel.class);
                user.setPhoto(excelAnn.savePath()+'/'+user.getPhoto());
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            }
        });
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("用户列表", "用户信息"), User.class, users);
        response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode("用户信息表.xls","UTF-8"));
        ServletOutputStream os = response.getOutputStream();
        workbook.write(os);
        os.close();
        workbook.close();
    }

}

测试

Excel导入

导入之前

导入中

导入之后

Excel导出

Excel查看

项目结构

结语

EasyPOI提供了一套非常简单而强大的解决方案,用于处理Java中Excel的导入导出。它的易用性让开发人员可以更加关注业务逻辑,而不是被繁琐的数据处理细节所困扰。无论你是需要处理简单的数据列表,还是复杂的业务报表,EasyPOI都可以帮助你高效完成任务。


希望这篇博文能够帮助你开始使用EasyPOI来提升你的工作效率。当然,实际应用中,你还需要根据自己的具体场景去深入学习和掌握更多细节和技巧。

 

相关推荐

  1. Springboot Excel 导出工具 -- EasyPoi 简介

    2024-02-14 22:48:02       26 阅读
  2. easypoi 校验导入excel 将校验不通过字段返回

    2024-02-14 22:48:02       60 阅读
  3. EasyPOI导出动态表头

    2024-02-14 22:48:02       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-14 22:48:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-14 22:48:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-14 22:48:02       87 阅读
  4. Python语言-面向对象

    2024-02-14 22:48:02       96 阅读

热门阅读

  1. Spring中 Bean 的六种作用域官方说明

    2024-02-14 22:48:02       48 阅读
  2. 洛谷C++简单题小练习day10—umi的函数

    2024-02-14 22:48:02       50 阅读
  3. C#面:.NET中的错误(异常)处理机制是什么

    2024-02-14 22:48:02       51 阅读
  4. 支付交易——BIN服务

    2024-02-14 22:48:02       44 阅读
  5. 安全SaaS服务转型的优与劣

    2024-02-14 22:48:02       50 阅读
  6. 作业2.13

    2024-02-14 22:48:02       49 阅读
  7. 题记(40)--二次方程计算器

    2024-02-14 22:48:02       45 阅读
  8. devc++跑酷游戏2.0.1

    2024-02-14 22:48:02       38 阅读