
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