SpringBoot中使用POI,快速实现Excel导入导出

170 篇文章 58 订阅
92 篇文章 16 订阅

本文是vhr系列的第十一篇,vhr项目地址https://github.com/lenve/vhr

导出Excel

整体来说,Excel有.xls.xlsx,那么在POI中这两个也对应两个不同的类,但是类名不同,方法基本都是一致的,因此我这里将只介绍.xls一种。

整体来说,可以分为如下七个步骤:

1.创建Excel文档
HSSFWorkbook workbook = new HSSFWorkbook();
2.设置文档的基本信息,这一步是可选的
//获取文档信息,并配置
DocumentSummaryInformation dsi = workbook.getDocumentSummaryInformation();
//文档类别
dsi.setCategory("员工信息");
//设置文档管理员
dsi.setManager("江南一点雨");
//设置组织机构
dsi.setCompany("XXX集团");
//获取摘要信息并配置
SummaryInformation si = workbook.getSummaryInformation();
//设置文档主题
si.setSubject("员工信息表");
//设置文档标题
si.setTitle("员工信息");
//设置文档作者
si.setAuthor("XXX集团");
//设置文档备注
si.setComments("备注信息暂无");

这些信息将显示在详细信息窗格中:

这里写图片描述

3.创建一个Excel表单,参数为sheet的名字
HSSFSheet sheet = workbook.createSheet("XXX集团员工信息表");
4.创建一行
HSSFRow headerRow = sheet.createRow(0);

0表示第一行。

5.在第一行中创建第一个单元格,并设置数据
HSSFCell cell0 = headerRow.createCell(0);
cell0.setCellValue("编号");
6.将Excel写到ByteArrayOutputStream中
baos = new ByteArrayOutputStream();
workbook.write(baos);
7.创建ResponseEntity并返回
return new ResponseEntity<byte[]>(baos.toByteArray(), headers, HttpStatus.CREATED);

核心步骤就这七个步骤,当然还有其他设置单元格数据格式、单元格背景、单元格宽度等,大家可以在源码中研究,这里就不赘述了。

导入Excel数据

数据导入主要涉及三个步骤 1.文件上传;2.Excel解析;3.数据插入。 第三步就比较简单了,我们这里重点来看看前两个步骤。

文件上传

文件上传采用了ElementUI中的Upload控件,如下:

<el-upload
:show-file-list="false"
accept="application/vnd.ms-excel"
action="/emp/basic/importEmp"
:on-success="fileUploadSuccess"
:on-error="fileUploadError" :disabled="fileUploadBtnText=='正在导入'"
:before-upload="beforeFileUpload" style="display: inline">
<el-button size="mini" type="success" :loading="fileUploadBtnText=='正在导入'"><i class="fa fa-lg fa-level-up" style="margin-right: 5px"></i>{{fileUploadBtnText}}
</el-button>
</el-upload>

正在上传时,文件上传控件不可用,上传成功或者失败之后才可用,上传过程中,上传按钮会有loading显示。

然后在SpringMVC中接收上传文件即可:

@RequestMapping(value = "/importEmp", method = RequestMethod.POST)
public RespBean importEmp(MultipartFile file) {
    //...
}

Excel解析

将上传到的MultipartFile转为输入流,然后交给POI去解析即可。可以分为如下四个步骤:

1.创建HSSFWorkbook对象
HSSFWorkbook workbook = new HSSFWorkbook(new POIFSFileSystem(file.getInputStream()));
2.获取一共有多少sheet,然后遍历
int numberOfSheets = workbook.getNumberOfSheets();
for (int i = 0; i < numberOfSheets; i++) {
    HSSFSheet sheet = workbook.getSheetAt(i);
    //...
}
3.获取sheet中一共有多少行,遍历行(注意第一行是标题)
int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();
Employee employee;
for (int j = 0; j < physicalNumberOfRows; j++) {
    if (j == 0) {
        continue;//标题行
    }
    //...
}
4.获取每一行有多少单元格,遍历单元格
int physicalNumberOfCells = row.getPhysicalNumberOfCells();
employee = new Employee();
for (int k = 0; k < physicalNumberOfCells; k++) {
    HSSFCell cell = row.getCell(k);
    //...
}

单元格的遍历就比较简单了,将遍历到的数据放入Employee实例中,每遍历一行,就将一个employee实例放入集合中。

好了,大致的步骤就是这样,详细信息小伙伴可以star微人事的源码仔细研究。

本系列其他文章:

1.SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(一)
2.SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(二)
3.SpringSecurity中密码加盐与SpringBoot中异常统一处理
4.axios请求封装和异常统一处理
5.权限管理模块中动态加载Vue组件
6.SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题(六)
7.vhr部门管理数据库设计与编程
8.使用MyBatis轻松实现递归查询与存储过程调用
9.ElementUI中tree控件踩坑记
10.SpringBoot中自定义参数绑定

关注公众号,可以及时接收到最新文章:

这里写图片描述

实现Excel导入导出,需要用到POI库。下面介绍一下使用SpringBoot集成MyBatis和POI实现Excel导入导出的步骤。 1. 引入依赖 在pom.xml文件添加以下依赖: ``` <!-- SpringBoot MyBatis 依赖 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.1.4</version> </dependency> <!-- POI 依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.0.1</version> </dependency> ``` 2. 创建实体类 创建一个实体类,用于映射Excel文件的数据。 ```java public class User { private Integer id; private String name; private String email; private String phone; // 省略 getter 和 setter 方法 } ``` 3. 创建Mapper 创建一个Mapper,用于操作数据库。 ```java @Mapper public interface UserMapper { List<User> findAll(); void insert(User user); void batchInsert(List<User> userList); } ``` 4. 创建Service 创建一个Service,用于导入导出Excel文件。 ```java @Service public class UserService { @Autowired private UserMapper userMapper; public List<User> findAll() { return userMapper.findAll(); } public void insert(User user) { userMapper.insert(user); } public void batchInsert(MultipartFile file) throws IOException { List<User> userList = readExcel(file); userMapper.batchInsert(userList); } public void exportExcel(HttpServletResponse response) throws IOException { List<User> userList = userMapper.findAll(); writeExcel(response, userList); } private List<User> readExcel(MultipartFile file) throws IOException { List<User> userList = new ArrayList<>(); Workbook workbook = WorkbookFactory.create(file.getInputStream()); Sheet sheet = workbook.getSheetAt(0); for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); User user = new User(); user.setName(row.getCell(0).getStringCellValue()); user.setEmail(row.getCell(1).getStringCellValue()); user.setPhone(row.getCell(2).getStringCellValue()); userList.add(user); } return userList; } private void writeExcel(HttpServletResponse response, List<User> userList) throws IOException { Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("Users"); Row headerRow = sheet.createRow(0); headerRow.createCell(0).setCellValue("Name"); headerRow.createCell(1).setCellValue("Email"); headerRow.createCell(2).setCellValue("Phone"); for (int i = 0; i < userList.size(); i++) { Row row = sheet.createRow(i + 1); User user = userList.get(i); row.createCell(0).setCellValue(user.getName()); row.createCell(1).setCellValue(user.getEmail()); row.createCell(2).setCellValue(user.getPhone()); } response.setHeader("Content-Disposition", "attachment; filename=users.xlsx"); response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); workbook.write(response.getOutputStream()); } } ``` 5. 创建Controller 创建一个Controller,用于接收导入导出Excel文件的请求。 ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/users") public List<User> findAll() { return userService.findAll(); } @PostMapping("/users") public void insert(@RequestBody User user) { userService.insert(user); } @PostMapping("/users/import") public void batchInsert(@RequestParam("file") MultipartFile file) throws IOException { userService.batchInsert(file); } @GetMapping("/users/export") public void exportExcel(HttpServletResponse response) throws IOException { userService.exportExcel(response); } } ``` 至此,就完成了SpringBoot集成MyBatis和POI实现Excel导入导出的步骤。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值