diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/ExcelBase.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/ExcelBase.java index 910051f75..bfa93551d 100644 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/ExcelBase.java +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/ExcelBase.java @@ -189,7 +189,7 @@ public class ExcelBase, C extends ExcelConfig> impleme * @since 4.0.10 */ public T setSheet(final String sheetName) { - return setSheet(WorkbookUtil.getOrCreateSheet(this.workbook, sheetName)); + return setSheet(SheetUtil.getOrCreateSheet(this.workbook, sheetName)); } /** @@ -201,13 +201,13 @@ public class ExcelBase, C extends ExcelConfig> impleme * @since 4.0.10 */ public T setSheet(final int sheetIndex) { - return setSheet(WorkbookUtil.getOrCreateSheet(this.workbook, sheetIndex)); + return setSheet(SheetUtil.getOrCreateSheet(this.workbook, sheetIndex)); } /** * 设置自定义Sheet * - * @param sheet 自定义sheet,可以通过{@link WorkbookUtil#getOrCreateSheet(Workbook, String)} 创建 + * @param sheet 自定义sheet,可以通过{@link SheetUtil#getOrCreateSheet(Workbook, String)} 创建 * @return this * @since 5.2.1 */ diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/SheetUtil.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/SheetUtil.java new file mode 100644 index 000000000..c8c2e227d --- /dev/null +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/SheetUtil.java @@ -0,0 +1,96 @@ +/* + * 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; + +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.ss.util.cellwalk.CellHandler; +import org.apache.poi.ss.util.cellwalk.CellWalk; +import org.dromara.hutool.core.text.StrUtil; + +/** + * {@link Sheet}相关工具类 + * + * @author Looly + * @since 6.0.0 + */ +public class SheetUtil { + + /** + * 获取或者创建sheet表
+ * 如果sheet表在Workbook中已经存在,则获取之,否则创建之 + * + * @param book 工作簿{@link Workbook} + * @param sheetName 工作表名 + * @return 工作表{@link Sheet} + * @since 4.0.2 + */ + public static Sheet getOrCreateSheet(final Workbook book, String sheetName) { + if (null == book) { + return null; + } + sheetName = StrUtil.isBlank(sheetName) ? "sheet1" : sheetName; + Sheet sheet = book.getSheet(sheetName); + if (null == sheet) { + sheet = book.createSheet(sheetName); + } + return sheet; + } + + /** + * 获取或者创建sheet表
+ * 自定义需要读取或写出的Sheet,如果给定的sheet不存在,创建之(命名为默认)
+ * 在读取中,此方法用于切换读取的sheet,在写出时,此方法用于新建或者切换sheet + * + * @param book 工作簿{@link Workbook} + * @param sheetIndex 工作表序号 + * @return 工作表{@link Sheet} + * @since 5.2.1 + */ + public static Sheet getOrCreateSheet(final Workbook book, final int sheetIndex) { + Sheet sheet = null; + try { + sheet = book.getSheetAt(sheetIndex); + } catch (final IllegalArgumentException ignore) { + //ignore + } + if (null == sheet) { + sheet = book.createSheet(); + } + return sheet; + } + + /** + * sheet是否为空 + * + * @param sheet {@link Sheet} + * @return sheet是否为空 + * @since 4.0.1 + */ + public static boolean isEmpty(final Sheet sheet) { + return null == sheet || (sheet.getLastRowNum() == 0 && sheet.getPhysicalNumberOfRows() == 0); + } + + /** + * 遍历Sheet中的指定区域单元格 + * + * @param sheet {@link Sheet} + * @param range 区域 + * @param cellHandler 单元格处理器 + */ + public static void walk(final Sheet sheet, final CellRangeAddress range, final CellHandler cellHandler) { + final CellWalk cellWalk = new CellWalk(sheet, range); + cellWalk.traverse(cellHandler); + } +} diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/WorkbookUtil.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/WorkbookUtil.java index f70a2f761..612902639 100644 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/WorkbookUtil.java +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/WorkbookUtil.java @@ -13,16 +13,15 @@ package org.dromara.hutool.poi.excel; -import org.dromara.hutool.core.io.file.FileUtil; -import org.dromara.hutool.core.io.IORuntimeException; -import org.dromara.hutool.core.io.IoUtil; -import org.dromara.hutool.core.text.StrUtil; -import org.dromara.hutool.poi.exceptions.POIException; -import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.dromara.hutool.core.io.IORuntimeException; +import org.dromara.hutool.core.io.IoUtil; +import org.dromara.hutool.core.io.file.FileUtil; +import org.dromara.hutool.core.text.StrUtil; +import org.dromara.hutool.poi.exceptions.POIException; import java.io.File; import java.io.IOException; @@ -324,61 +323,6 @@ public class WorkbookUtil { } } - /** - * 获取或者创建sheet表
- * 如果sheet表在Workbook中已经存在,则获取之,否则创建之 - * - * @param book 工作簿{@link Workbook} - * @param sheetName 工作表名 - * @return 工作表{@link Sheet} - * @since 4.0.2 - */ - public static Sheet getOrCreateSheet(final Workbook book, String sheetName) { - if (null == book) { - return null; - } - sheetName = StrUtil.isBlank(sheetName) ? "sheet1" : sheetName; - Sheet sheet = book.getSheet(sheetName); - if (null == sheet) { - sheet = book.createSheet(sheetName); - } - return sheet; - } - - /** - * 获取或者创建sheet表
- * 自定义需要读取或写出的Sheet,如果给定的sheet不存在,创建之(命名为默认)
- * 在读取中,此方法用于切换读取的sheet,在写出时,此方法用于新建或者切换sheet - * - * @param book 工作簿{@link Workbook} - * @param sheetIndex 工作表序号 - * @return 工作表{@link Sheet} - * @since 5.2.1 - */ - public static Sheet getOrCreateSheet(final Workbook book, final int sheetIndex) { - Sheet sheet = null; - try { - sheet = book.getSheetAt(sheetIndex); - } catch (final IllegalArgumentException ignore) { - //ignore - } - if (null == sheet) { - sheet = book.createSheet(); - } - return sheet; - } - - /** - * sheet是否为空 - * - * @param sheet {@link Sheet} - * @return sheet是否为空 - * @since 4.0.1 - */ - public static boolean isEmpty(final Sheet sheet) { - return null == sheet || (sheet.getLastRowNum() == 0 && sheet.getPhysicalNumberOfRows() == 0); - } - // -------------------------------------------------------------------------------------------------------- Private method start /** diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/reader/ExcelReader.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/reader/ExcelReader.java index 694fd0f85..aa4d9d9e6 100644 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/reader/ExcelReader.java +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/reader/ExcelReader.java @@ -231,7 +231,7 @@ public class ExcelReader extends ExcelBase { public void read(final int startRowIndex, final int endRowIndex, final SerBiConsumer cellHandler) { checkNotClosed(); - final ConsumerSheetReader reader = new ConsumerSheetReader(startRowIndex, endRowIndex, cellHandler); + final WalkSheetReader reader = new WalkSheetReader(startRowIndex, endRowIndex, cellHandler); reader.setExcelConfig(this.config); reader.read(sheet); } diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/reader/sheet/ConsumerSheetReader.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/reader/sheet/WalkSheetReader.java similarity index 83% rename from hutool-poi/src/main/java/org/dromara/hutool/poi/excel/reader/sheet/ConsumerSheetReader.java rename to hutool-poi/src/main/java/org/dromara/hutool/poi/excel/reader/sheet/WalkSheetReader.java index 8835bc0cf..1b45847ab 100644 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/reader/sheet/ConsumerSheetReader.java +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/reader/sheet/WalkSheetReader.java @@ -16,6 +16,7 @@ import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.dromara.hutool.core.func.SerBiConsumer; +import org.dromara.hutool.poi.excel.cell.CellEditor; import org.dromara.hutool.poi.excel.cell.CellUtil; /** @@ -24,7 +25,7 @@ import org.dromara.hutool.poi.excel.cell.CellUtil; * @author Looly * @since 6.0.0 */ -public class ConsumerSheetReader extends AbstractSheetReader { +public class WalkSheetReader extends AbstractSheetReader { private final SerBiConsumer cellHandler; @@ -36,7 +37,7 @@ public class ConsumerSheetReader extends AbstractSheetReader { * @param endRowIndex 结束行(包含,从0开始计数) * @param cellHandler 单元格处理器,用于处理读到的单元格及其数据 */ - public ConsumerSheetReader(final int startRowIndex, final int endRowIndex, final SerBiConsumer cellHandler) { + public WalkSheetReader(final int startRowIndex, final int endRowIndex, final SerBiConsumer cellHandler) { super(startRowIndex, endRowIndex); this.cellHandler = cellHandler; } @@ -45,6 +46,7 @@ public class ConsumerSheetReader extends AbstractSheetReader { public Void read(final Sheet sheet) { final int startRowIndex = Math.max(this.cellRangeAddress.getFirstRow(), sheet.getFirstRowNum());// 读取起始行(包含) final int endRowIndex = Math.min(this.cellRangeAddress.getLastRow(), sheet.getLastRowNum());// 读取结束行(包含) + final CellEditor cellEditor = this.config.getCellEditor(); Row row; for (int y = startRowIndex; y <= endRowIndex; y++) { @@ -54,8 +56,8 @@ public class ConsumerSheetReader extends AbstractSheetReader { final short endColumnIndex = (short) Math.min(this.cellRangeAddress.getLastColumn(), row.getLastCellNum()); Cell cell; for (short x = startColumnIndex; x < endColumnIndex; x++) { - cell = row.getCell(x); - cellHandler.accept(cell, CellUtil.getCellValue(cell)); + cell = CellUtil.getCell(row, x); + cellHandler.accept(cell, CellUtil.getCellValue(cell, cellEditor)); } } } diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/BigExcelWriter.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/BigExcelWriter.java index 22ee9ef64..eaf3b9307 100644 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/BigExcelWriter.java +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/BigExcelWriter.java @@ -18,6 +18,7 @@ import org.dromara.hutool.core.io.IORuntimeException; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.streaming.SXSSFSheet; import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.dromara.hutool.poi.excel.SheetUtil; import org.dromara.hutool.poi.excel.WorkbookUtil; import java.io.File; @@ -141,7 +142,7 @@ public class BigExcelWriter extends ExcelWriter { * @param sheetName sheet名,做为第一个sheet名并写出到此sheet,例如sheet1 */ public BigExcelWriter(final SXSSFWorkbook workbook, final String sheetName) { - this(WorkbookUtil.getOrCreateSheet(workbook, sheetName)); + this(SheetUtil.getOrCreateSheet(workbook, sheetName)); } /** diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/ExcelWriter.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/ExcelWriter.java index 9810bde6d..69f890793 100644 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/ExcelWriter.java +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/writer/ExcelWriter.java @@ -33,6 +33,7 @@ import org.dromara.hutool.core.map.multi.RowKeyTable; import org.dromara.hutool.core.map.multi.Table; import org.dromara.hutool.core.reflect.FieldUtil; import org.dromara.hutool.core.text.StrUtil; +import org.dromara.hutool.poi.excel.SheetUtil; import org.dromara.hutool.poi.excel.ExcelBase; import org.dromara.hutool.poi.excel.RowUtil; import org.dromara.hutool.poi.excel.WorkbookUtil; @@ -163,7 +164,7 @@ public class ExcelWriter extends ExcelBase { * @param sheetName sheet名,做为第一个sheet名并写出到此sheet,例如sheet1 */ public ExcelWriter(final Workbook workbook, final String sheetName) { - this(WorkbookUtil.getOrCreateSheet(workbook, sheetName)); + this(SheetUtil.getOrCreateSheet(workbook, sheetName)); } /**