导出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实例放入集合中。

最新文章

  1. 浅析MVC模式与三层架构的区别01
  2. MVVM和MVC的区别
  3. yii2-user
  4. [转]SpringMVC Controller&amp;View数据传递
  5. ecshop后台导航修改教程说明
  6. 实验一补充内容 Java开发环境的熟悉-刘蔚然
  7. .NET世界各成员之间的关系
  8. 鸟哥Linux私房菜 基础学习篇读书笔记(10):Linux磁盘和文件系统管理(3)
  9. Akka(17): Stream:数据流基础组件-Source,Flow,Sink简介
  10. Echarts数据可视化地理坐标系geo,开发全解+完美注释
  11. Lr-代理录制
  12. Nginx---(main block)
  13. Android ExpandableListView和ScrollView联用的一些注意事项
  14. linux第四章笔记
  15. hwi-web安装
  16. jvm编译环境搭建 Debina篇
  17. 修改mysql中的auto_increment
  18. 合并图片、EUI顺序、CacheAsBitmap对drawcall影响的测试
  19. Python: 使用pip升级所有包
  20. shared_ptr 的使用及注意事项

热门文章

  1. Gitlab分支保护
  2. Redis键通知机制
  3. 浅谈Delphi高效使用TreeView
  4. nginx利用fastcgi_cache模块缓存
  5. TF-IDF算法与余弦相似性
  6. centos(6,7) 系统常用命令
  7. selenium + python 环境配置 (二)之启动IE
  8. 【leetcode算法-简单】28. 实现strStr
  9. 【转帖】一文看懂docker容器技术架构及其中的各个模块
  10. 从 select ... for update来分析mysql的锁