All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.gitee.ludii.excel.read.reader.CellReader Maven / Gradle / Ivy

package io.gitee.ludii.excel.read.reader;

import io.gitee.ludii.excel.enums.CellDataTypeEnum;
import io.gitee.ludii.excel.exceptions.CellValueException;
import io.gitee.ludii.excel.read.metadata.data.ReadCellData;
import org.apache.poi.ss.usermodel.*;

import java.math.BigDecimal;

/**
 * @author 陆迪
 * @date 2022/4/24
 */
public class CellReader {

    private final FormulaEvaluator formulaEvaluator;

    public CellReader(FormulaEvaluator formulaEvaluator) {
        this.formulaEvaluator = formulaEvaluator;
    }

    public ReadCellData readCellData(Cell cell) {

        if (cell == null) {
            return new ReadCellData<>(CellDataTypeEnum.EMPTY);
        }

        ReadCellData readCellData;
        CellType cellTye = cell.getCellType();
        switch (cellTye) {
            case STRING:
                readCellData = new ReadCellData<>(CellDataTypeEnum.STRING);
                readCellData.setStringValue(cell.getStringCellValue());
                break;
            case NUMERIC:
                readCellData = new ReadCellData<>(CellDataTypeEnum.NUMBER);
                readCellData.setNumberValue(new BigDecimal(String.valueOf(cell.getNumericCellValue())));
                if (DateUtil.isCellDateFormatted(cell)) {
                    readCellData.setDateValue(cell.getDateCellValue());
                }
                break;
            case BOOLEAN:
                readCellData = new ReadCellData<>(CellDataTypeEnum.BOOLEAN);
                readCellData.setBooleanValue(cell.getBooleanCellValue());
                break;
            case FORMULA:
                readCellData = formatCellValue(cell, this.getFormulaEvaluator());
                break;
            case BLANK:
                readCellData = new ReadCellData<>(CellDataTypeEnum.STRING);
                readCellData.setStringValue("");
                break;
            case _NONE:
                readCellData = new ReadCellData<>(CellDataTypeEnum.EMPTY);
                break;
            case ERROR:
                readCellData = new ReadCellData<>(CellDataTypeEnum.STRING);
                readCellData.setStringValue("");
                break;
            default:
                throw new CellValueException("读取单元格值失败。", cell.getRowIndex(), cell.getColumnIndex());
        }

        int rowIndex = cell.getRowIndex();
        int columnIndex = cell.getColumnIndex();
        readCellData.setRowIndex(rowIndex);
        readCellData.setColumnIndex(columnIndex);

        return readCellData;
    }

    private ReadCellData formatCellValue(Cell cell, FormulaEvaluator formulaEvaluator) {
        ReadCellData readCellData;
        if (formulaEvaluator == null) {
            readCellData = new ReadCellData<>(CellDataTypeEnum.STRING);
            readCellData.setStringValue(cell.getCellFormula());
        } else {
            CellValue cellValue = formulaEvaluator.evaluate(cell);
            CellType cellValueCellType = cellValue.getCellType();
            switch (cellValueCellType) {
                case STRING:
                    readCellData = new ReadCellData<>(CellDataTypeEnum.STRING);
                    readCellData.setStringValue(cell.getStringCellValue());
                    break;
                case NUMERIC:
                    readCellData = new ReadCellData<>(CellDataTypeEnum.NUMBER);
                    readCellData.setNumberValue(new BigDecimal(String.valueOf(cell.getNumericCellValue())));
                    break;
                case BOOLEAN:
                    readCellData = new ReadCellData<>(CellDataTypeEnum.BOOLEAN);
                    readCellData.setBooleanValue(cell.getBooleanCellValue());
                    break;
                case BLANK:
                    readCellData = new ReadCellData<>(CellDataTypeEnum.STRING);
                    readCellData.setStringValue("");
                    break;
                case _NONE:
                    readCellData = new ReadCellData<>(CellDataTypeEnum.EMPTY);
                    break;
                case FORMULA:
                case ERROR:
                default:
                    throw new CellValueException("读取单元格值失败。", cell.getRowIndex(), cell.getColumnIndex());
            }
        }
        return readCellData;
    }

    private FormulaEvaluator getFormulaEvaluator() {
        return formulaEvaluator;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy