diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/cell/CellUtil.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/cell/CellUtil.java index 1b3221326..ec6eb97f8 100644 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/cell/CellUtil.java +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/cell/CellUtil.java @@ -17,13 +17,11 @@ import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellReference; import org.apache.poi.ss.util.RegionUtil; import org.apache.poi.ss.util.SheetUtil; -import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.util.ObjUtil; import org.dromara.hutool.poi.excel.StyleSet; import org.dromara.hutool.poi.excel.cell.editors.TrimEditor; import org.dromara.hutool.poi.excel.cell.setters.CellSetterFactory; -import org.dromara.hutool.poi.excel.cell.values.ErrorCellValue; -import org.dromara.hutool.poi.excel.cell.values.NumericCellValue; +import org.dromara.hutool.poi.excel.cell.values.CompositeCellValue; /** * Excel表格中单元格工具类 @@ -91,47 +89,10 @@ public class CellUtil { * @param cellEditor 单元格值编辑器。可以通过此编辑器对单元格值做自定义操作 * @return 值,类型可能为:Date、Double、Boolean、String */ - public static Object getCellValue(Cell cell, CellType cellType, final CellEditor cellEditor) { - if (null == cell) { - return null; - } - if (cell instanceof NullCell) { - return null == cellEditor ? null : cellEditor.edit(cell, null); - } - if (null == cellType) { - cellType = cell.getCellType(); - } - - // 尝试获取合并单元格,如果是合并单元格,则重新获取单元格类型 - final Cell mergedCell = getMergedRegionCell(cell); - if (mergedCell != cell) { - cell = mergedCell; - cellType = cell.getCellType(); - } - - final Object value; - switch (cellType) { - case NUMERIC: - value = new NumericCellValue(cell).getValue(); - break; - case BOOLEAN: - value = cell.getBooleanCellValue(); - break; - case FORMULA: - value = getCellValue(cell, cell.getCachedFormulaResultType(), cellEditor); - break; - case BLANK: - value = StrUtil.EMPTY; - break; - case ERROR: - value = new ErrorCellValue(cell).getValue(); - break; - default: - value = cell.getStringCellValue(); - } - - return null == cellEditor ? value : cellEditor.edit(cell, value); + public static Object getCellValue(final Cell cell, final CellType cellType, final CellEditor cellEditor) { + return CompositeCellValue.of(cell, cellType, cellEditor).getValue(); } + // endregion // region ----- setCellValue @@ -151,11 +112,12 @@ public class CellUtil { return; } + CellStyle cellStyle = null; if (null != styleSet) { - cell.setCellStyle(styleSet.getStyleByValueType(value, isHeader)); + cellStyle = styleSet.getStyleByValueType(value, isHeader); } - setCellValue(cell, value, cellEditor); + setCellValue(cell, value, cellStyle, cellEditor); } /** diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/cell/values/CompositeCellValue.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/cell/values/CompositeCellValue.java new file mode 100644 index 000000000..1dbdd3fa7 --- /dev/null +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/cell/values/CompositeCellValue.java @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2024. looly(loolly@aliyun.com) + * Hutool is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * https://license.coscl.org.cn/MulanPSL2 + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.dromara.hutool.poi.excel.cell.values; + +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; +import org.dromara.hutool.core.text.StrUtil; +import org.dromara.hutool.poi.excel.cell.CellEditor; +import org.dromara.hutool.poi.excel.cell.CellUtil; +import org.dromara.hutool.poi.excel.cell.CellValue; +import org.dromara.hutool.poi.excel.cell.NullCell; + +/** + * 复合单元格值,用于根据单元格类型读取不同的值 + * + * @author looly + * @since 6.0.0 + */ +public class CompositeCellValue implements CellValue { + + /** + * 创建CompositeCellValue + * + * @param cell {@link Cell}单元格 + * @param cellType 单元格值类型{@link CellType}枚举,如果为{@code null}默认使用cell的类型 + * @param cellEditor 单元格值编辑器。可以通过此编辑器对单元格值做自定义操作 + * @return CompositeCellValue + */ + public static CompositeCellValue of(final Cell cell, final CellType cellType, final CellEditor cellEditor){ + return new CompositeCellValue(cell, cellType, cellEditor); + } + + private final Cell cell; + private final CellType cellType; + private final CellEditor cellEditor; + + /** + * 构造 + * + * @param cell {@link Cell}单元格 + * @param cellType 单元格值类型{@link CellType}枚举,如果为{@code null}默认使用cell的类型 + * @param cellEditor 单元格值编辑器。可以通过此编辑器对单元格值做自定义操作 + */ + public CompositeCellValue(final Cell cell, final CellType cellType, final CellEditor cellEditor) { + this.cell = cell; + this.cellType = cellType; + this.cellEditor = cellEditor; + } + + @Override + public Object getValue() { + Cell cell = this.cell; + CellType cellType = this.cellType; + final CellEditor cellEditor = this.cellEditor; + + if (null == cell) { + return null; + } + if (cell instanceof NullCell) { + return null == cellEditor ? null : cellEditor.edit(cell, null); + } + if (null == cellType) { + cellType = cell.getCellType(); + } + + // 尝试获取合并单元格,如果是合并单元格,则重新获取单元格类型 + final Cell mergedCell = CellUtil.getMergedRegionCell(cell); + if (mergedCell != cell) { + cell = mergedCell; + cellType = cell.getCellType(); + } + + final Object value; + switch (cellType) { + case NUMERIC: + value = new NumericCellValue(cell).getValue(); + break; + case BOOLEAN: + value = cell.getBooleanCellValue(); + break; + case FORMULA: + value = of(cell, cell.getCachedFormulaResultType(), cellEditor).getValue(); + break; + case BLANK: + value = StrUtil.EMPTY; + break; + case ERROR: + value = new ErrorCellValue(cell).getValue(); + break; + default: + value = cell.getStringCellValue(); + } + + return null == cellEditor ? value : cellEditor.edit(cell, value); + } +} diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/style/StyleSet.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/style/StyleSet.java index cf922ee5e..b0af9e541 100644 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/style/StyleSet.java +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/style/StyleSet.java @@ -13,7 +13,8 @@ package org.dromara.hutool.poi.excel.style; import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.util.CellReference; public interface StyleSet { - CellStyle getStyleFor(int x, int y, Object cellValue); + CellStyle getStyleFor(CellReference reference, Object cellValue); }