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

本文是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微人事的源码仔细研究。

原文发布于微信公众号 - 玩转JavaEE(gh_d1ca11234a30)

原文发表时间:2018-01-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏落影的专栏

iOS开发笔记(二)

前言 开发做笔记是好习惯,总结分享是巩固记忆。 遇到问题,思考其背后的原因、原理。 AFNetworking 1、progress回调block,不在主线程;...

35670
来自专栏数据之美

Fiddler 高级用法:Fiddler Script 与 HTTP 断点调试

之前在《关于 WEB/HTTP 调试利器 Fiddler 的一些技巧分享》中系统的介绍过 Fiddler 的原理与一些常见技巧,但那篇文章只是入门科普,并不深入...

97580
来自专栏移动端开发

环信SDK 头像、昵称、表情自定义和群聊设置的实现 一(附源码)

前言: 环信的SDK在公司的项目中有用到,现在用到的是群聊的部分,这里我们分析总结一下自己对环信给的DEMO大概的拆解一下,说说我们怎么样充分的利用这个de...

38780
来自专栏python学习之旅

python appium笔记(二):元素定位

#这里的示例是用android来说明的,xpath应该是通用的,resource-id不太清楚,没配过IOS的环境

27710
来自专栏進无尽的文章

扒虫篇-Bug日志 Ⅱ

事情是这样的:一个风和日丽的下午,我正在 itunesConnect 中注册一个APP,基本信息都保存了,在编辑版本信息时,都弄的差不多了,可是没有保存,结果不...

9410
来自专栏娱乐心理测试

小程序完整demo

30450
来自专栏熊二哥

Sublime快速入门

在当前的互联网时代,任何程序语言和相关技术都只是实现互联网应用的一种手段,这也就造成了大量的互联网工程师长期与不同的语言、技术、系统环境、IDE等打交道。因此一...

21250
来自专栏极客慕白的成长之路

在 Node.js 中使用 js-xlsx 处理 Excel 文件

SheetJS js-xlsx 是目前关注度最高的处理 Excel 的 JavaScript 库。支持 XLS/XLSX/CSV/ODS 等多种表格格式,功能强...

58220
来自专栏葡萄城控件技术团队

如何在 ASP.NET MVC 中集成 AngularJS(2)

在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩、应用程序版本自动刷新和工程构建等内容。 下...

272100
来自专栏流柯技术学院

用Fiddler模拟低速网络环境

但当有人反应说「你的网页好慢」 甚至当网路速度慢,会造成你的网页跳出什么啊哩不哒的bug时要如何重现呢?

15420

扫码关注云+社区

领取腾讯云代金券