前言:在我们的工作当中,时常会有将Excel文档进行导入导出的操作,针对于此项需求,有很多的处理方法。而我们今天就讲一下其中最为常用的POI。
1.POI介绍
POI是Apache软件基金会的开放源码函式库。
POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
2.Excel介绍
Excel文档有两种格式,分别是
- 03版的excel,文件后缀为.xls (最多能容纳65536行数据)
- 07版的excel,文件后缀为.xlsx(最多能容纳1048576行数据)
3.导入依赖
导入poi依赖,可以根据需求导入相对应的依赖。
poi可以操作03版的excel,后缀为.xls
poi-ooxml可以操作07版的excel,后缀为.xlsx
<!--03版excel 后缀为.xls-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!--07版excel 后缀为.xlsx-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
4.认识类与方法
- HSSFWorkbook:一般用于操作03版以前的excel(包括03版excel),扩展名是.xls。
- XSSFWorkbook:一般用于操作07版excel及以上的版本,扩展名是.xlsx。
- SXSSFWorkbook(POI 3.8+版本):一般用于大数据量的导出。比如数据量超过5000条即可考虑这种工作表
这三个类可以根据需求来进行选择。
下面介绍一下三个类共有的方法。了解了这些方法,就可以更加快捷的去导入导出Excel
//获取工作薄
Workbook workbook=new HSSFWorkbook();
//获取工作表
Sheet sheet = workbook.createSheet();
//生成第一行 参数为行的下标,下标从0开始
Row row = sheet.createRow(0);
//生成第一列 参数为列的下标,下标从0开始
Cell cell1 = row.createCell(0);
//给第一行第一列的单元格赋值
cell1.setCellValue("姓名");
//输出流导出文档
FileOutputStream fileOutputStream = new FileOutputStream(new File(PATH + "hhh.xls"));
workbook.write(fileOutputStream);
//读取excel文档 生成工作薄对象
FileInputStream fileInputStream = new FileInputStream(new File("D:\\Users\\idea\\test\\lilun\\excel\\srchhh.xls"));
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fileInputStream);
//读取第一个工作表 参数为工作表下标 下标从0开始
HSSFSheet sheetAt = hssfWorkbook.getSheetAt(0);
//读取工作表第一行数据 参数为行下标 下标从0开始
HSSFRow row = sheetAt.getRow(0);
//一行有几列 返回列数
int num = row.getPhysicalNumberOfCells();
//根据行取对应的列 获取单元格 参数为行下标 下标从0开始
HSSFCell cell = row.getCell(0);
//获取单元格的数据类型 返回值是一个int类型
int cellType = cell.getCellType();
获取类型后就可以进行判断
CELL_TYPE_NUMERIC 数值型 0
CELL_TYPE_STRING 字符串型 1
CELL_TYPE_FORMULA 公式型 2
CELL_TYPE_BLANK 空值 3
CELL_TYPE_BOOLEAN 布尔型 4
CELL_TYPE_ERROR 错误 5
根据数据类型的不同采用不同的方法获取单元格内的值
//判断单元格数据类型
switch (cellType){
case 0:
//单元格返回double类型
double numericCellValue = cell.getNumericCellValue();
break;
case 1:
//单元格返回string字符串类型
String stringCellValue = cell.getStringCellValue();
break;
case 2:
//单元格返回公式
String cellFormula = cell.getCellFormula();
break;
case 3:
//单元格为空
break;
case 4:
//单元格返回boolean类型
boolean booleanCellValue = cell.getBooleanCellValue();
break;
case 5:
//单元格返回错误
byte errorCellValue = cell.getErrorCellValue();
break;
default:
break;
}
5.读取Excel的方法
/**
* 读取Excel文档
* @throws IOException
*/
@Test
public void inExcel() throws IOException {
//读取excel文档 生成工作薄对象
FileInputStream fileInputStream = new FileInputStream(new File("D:\\Users\\idea\\test\\lilun\\excel\\srchhh.xls"));
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fileInputStream);
//读取第一个工作表 参数为工作表下标 下标从0开始
HSSFSheet sheetAt = hssfWorkbook.getSheetAt(0);
//读取工作表第一行数据 参数为行下标 下标从0开始
HSSFRow row = sheetAt.getRow(0);
if(row!=null){
//一行有几列 返回列数
int num = row.getPhysicalNumberOfCells();
for (int i=0;i<num;i++){
//根据行取对应的列 获取单元格 参数为行下标 下标从0开始
HSSFCell cell = row.getCell(i);
if(cell!=null){
//获取单元格的数据类型
int cellType = cell.getCellType();
//判断单元格数据类型
switch (cellType){
case 0:
//单元格返回double类型
double numericCellValue = cell.getNumericCellValue();
break;
case 1: