基于POI的Java-Excel读写操作
基于POI的Excel操作
Based on 【狂神说Java】POI及EasyExcel一小时搞定通俗易懂 @ https://www.bilibili.com/video/BV1Ua4y1x7BK
1、POI介绍
2、POI的读写
POM 引用
<!-- xls -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!-- xlsx -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<!-- 日期格式化工具 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
2.1 POI基本读写
2.1.1 一个简单测试类
public void testWrtXls(){
//1. Create a Workbook
Workbook wb - new HSSFWorkbook();
//2. Create a Sheet
Sheet sheet = wb.createSheet("sheet1");
//3. Create a row
Row row = sheet.createRow(0);
//4. Create a cell
Cell cell = row.createCell(0);
//5. Set cell value
cell.setCellValue("SampleText");
//Create as a File
new FileOutputStream fos = new FileOutputStream(PATH + FILENAME + EXTNAME);
wb.write(fos);
//Close Stream
fos.close();
System.out.println("FILE GENERATE SUCCESS!");
}
注:打开文件使用 new HSSFWorkbook(fis)
FileInputStream fis = new FileInputStream(FILEPATH+FILENAME);
Workbook wb = new HSSFWorkbook(fis);
//TODO
fis.close(); //关闭流操作
注:03版: HSSF,07版: XSSF
2.1.2 常见用例
2.1.2.1 获取该行字段数
· 如获取表格首行字段数:
Workbook wb = new HSSFWorkbook(new FileInputStream(FILEPATH));
Sheet sheet = wb.getSheetAt(0);
Row rowTitle = sheet.getRow(0);
if(rowTitle != null){
int cellCnt = rowTitle.getPhysicalNumberOfCells();
//此时获得实际的行宽(列个数) cellCnt
}
2.1.2.2 规范化输出,输出内容前,判断row、cell不为空
Row rowData = sheet.getRow(rowNum);
if(rowData != null){
int cellCnt = rowData.getPhysicalNumbberOfCells();
for(int cellNum = 0; cellNum < cellCnt; cellNum++){
Cell cell = row.getCell(cellNum);
//非空判断
if(cell != null){
//对cell进行进一步操作
}
}
|
2.2 数据格式
2.2.1 格式信息
Cell 格式与数字的映射表| # | TYPE | NUMBER |
| 1 | CELL_TYPE_NUMERIC | 0 |
| 2 | CELL_TYPE_STRING | 1 |
| 3 | CELL_TYPE_FORMULA | 2 |
| 4 | CELL_TYPE_BLANK | 3 |
| 5 | CELL_TYPE_BOOLEAN | 4 |
| 6 | CELL_TYPE_ERROR | 5 |
2.2.1 获取cell单元格类型,进而进行数据处理
if(cell != null){
int cellType = cell.getCellType();
switch(cellType){
String cellValue = "";
//1 CELL_TYPE_NUMERIC 数字型(日期型、数字型)
case HSSFCell.CELL_TYPE_NUMERIC:
//首先判断是否为日期型,日期则格式化输出,数字则转为字符型输出
if(HSSFDateUtil.isCellDateFormatted(cell)){
//日期型 处理:
Date date = cell.getDateCellValue();
cellValue = new DateTime(date).toString("yyyy-MM-dd");
}else{
//数字型转为字符输出:
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cellValue = cell.toString();
}
break;
//2 CELL_TYPE_STRING 字符型
case HSSFCell.CELL_TYPE_STRING:
cellValue = cell.getStringCellValue();
break;
//3 CELL_TYPE_FORMULA 公式型
//首先需要在外面获取到计算公式处理
//FormulaEvaluator fe = new HSSFFormulaEvaluator((HSSFWorkbook) wb);
case HSSFCell.CELL_TYPE_FORMULA:
CellValue evaluate = fe.evaluate(cell);
cellValue = evaluate.formatAsString();
break;
//4 CELL_TYPE_BLANK 空值
case HSSFCell.CELL_TYPE_STRING:
//直接break(cellValue初值为空)
break;
//5 CELL_TYPE_BOOLEAN 布尔型
case HSSFCell.CELL_TYPE_BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
}
}
3、EasyExcel
3.1 EasyExcel介绍
官方文档:www.yuque.com/easyexcel/doc/easyexcel
快速、简单避免OOM的Java处理Excel工具。
3.1.1 POM引用*
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.2.0-beta2</version>
</dependency>
注:easyexcel引用到了poi相关的pom,故
无需重新引用poi的dependency;easyExcel 引用的还包含
fastjson、lombok、spring-boot、spring-boot-starter-web等。
3.2 快速开始EasyExcel
(3.2节中下面的)例子来自官方Reference:https://www.yuque.com/easyexcel/doc/read
未完待续。

浙公网安备 33010602011771号