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

cn.hutool.poi.excel.cell.values.NumericCellValue Maven / Gradle / Ivy

There is a newer version: 5.8.33
Show newest version
package cn.hutool.poi.excel.cell.values;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelDateUtil;
import cn.hutool.poi.excel.cell.CellValue;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.util.NumberToTextConverter;

import java.time.LocalDateTime;

/**
 * 数字类型单元格值
* 单元格值可能为Long、Double、Date * * @author looly * @since 5.7.8 */ public class NumericCellValue implements CellValue { private final Cell cell; /** * 构造 * * @param cell {@link Cell} */ public NumericCellValue(Cell cell) { this.cell = cell; } @Override public Object getValue() { final double value = cell.getNumericCellValue(); final CellStyle style = cell.getCellStyle(); if (null != style) { // 判断是否为日期 if (ExcelDateUtil.isDateFormat(cell)) { final LocalDateTime dateCellValue = cell.getLocalDateTimeCellValue(); if(1899 == dateCellValue.getYear()){ // 1899年写入会导致数据错乱,读取到1899年证明这个单元格的信息不关注年月日 return dateCellValue.toLocalTime(); } // 使用Hutool的DateTime包装 return DateUtil.date(dateCellValue); } final String format = style.getDataFormatString(); // 普通数字 if (null != format && format.indexOf(StrUtil.C_DOT) < 0) { final long longPart = (long) value; if (((double) longPart) == value) { // 对于无小数部分的数字类型,转为Long return longPart; } } } // 某些Excel单元格值为double计算结果,可能导致精度问题,通过转换解决精度问题。 return Double.parseDouble(NumberToTextConverter.toText(value)); } }