基于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  阅读(86)  评论(0)    收藏  举报