基于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 格式与数字的映射表
#TYPENUMBER
1CELL_TYPE_NUMERIC0
2CELL_TYPE_STRING1
3CELL_TYPE_FORMULA2
4CELL_TYPE_BLANK3
5CELL_TYPE_BOOLEAN4
6CELL_TYPE_ERROR5
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 引用的还包含 fastjsonlombokspring-bootspring-boot-starter-web等。

3.2 快速开始EasyExcel

(3.2节中下面的)例子来自官方Reference:https://www.yuque.com/easyexcel/doc/read

未完待续。

posted @ 2022-02-26 15:17  ZaMonopaper  阅读(75)  评论(0)    收藏  举报
(评论功能已被禁用)
点击右上角即可分享
微信分享提示