解析excel单元格的值

64 阅读1分钟

一、说明

我们要解析一个包含了各种类型的表格,首先我们提供一个简单的表格。

下面的这个表格只有一行数据,分别包含了A:字符串类型,B:数字类型,C:日期类型,D:布尔类型,E:空白格(有样式),F:公式。

image.png

二、导入依赖

commons-lang3包不是必须的,为了在代码中使用stringUtils工具类才导入的。

 <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.16</version>
        </dependency>

三、完整代码

package excel.parse;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

public class ExcelCellValueParse {
    private static final String PATH = "D:" + File.separator + "含各种类型测试.xlsx";

    public static void main(String[] args) throws Exception {
        // 获取要解析的excel文件
        InputStream inputStream = new FileInputStream(PATH);
        XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
        // 获取第一个sheet页
        XSSFSheet sheet = workbook.getSheetAt(0);
        // 获取第一行
        XSSFRow row = sheet.getRow(0);
        // 获取本行最后一列的列号
        short lastCellNum = row.getLastCellNum();
        //遍历每一列的值
        for(int colNo =0;colNo <lastCellNum; colNo++){
            XSSFCell cell = row.getCell(colNo);
            // 获取单元格的值
            String cellValue = getCellValue(cell, workbook);
            System.out.println(cellValue);
        }
    }

    public static String getCellValue(Cell cell, Workbook workbook){
        if(cell == null){
            return StringUtils.EMPTY;
        }
        CellType cellTypeEnum = cell.getCellTypeEnum();
        switch (cellTypeEnum){
            case STRING:// 字符串
                return cell.getStringCellValue();
            case NUMERIC:// 数值类型(整数、小数、日期)
                if (DateUtil.isCellDateFormatted(cell)) {
                    return DateFormatUtils.format(cell.getDateCellValue(), "yyyy-MM-dd");
                } else {
                    return String.valueOf(cell.getNumericCellValue());
                }
            case BOOLEAN:// 布尔
                return String.valueOf(cell.getBooleanCellValue());
            case BLANK:// 空白格,有样式
                return "BLANK";
            case FORMULA:// 公式
                FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
                return evaluator.evaluate(cell).getNumberValue()+"";
            case _NONE:// 未知类型
                return "未知类型";
            case ERROR:// 错误单元格
                return "错误单元格";
            default:
                return StringUtils.EMPTY;
        }
    }
}

四、运行结果

科技四路
100.0
2023-02-22
false
BLANK
1.0

Process finished with exit code 0

五、CellType枚举类说明

image.png