From 0e77d348d2a5809511f200ebc8c0fbba098e355c Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 3 Feb 2024 11:36:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BD=93sheetName=20?= =?UTF-8?q?=E4=B8=8D=E5=AD=98=E5=9C=A8=E6=97=B6=EF=BC=8CExcelUtil.getReade?= =?UTF-8?q?r=E6=96=B9=E6=B3=95=E4=B8=8D=E4=BC=9A=E9=87=8A=E6=94=BE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/hutool/poi/excel/ExcelReader.java | 50 ++++++++++++++++++- .../hutool/poi/excel/IssueI8ZIQCTest.java | 10 ++++ 2 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 hutool-poi/src/test/java/org/dromara/hutool/poi/excel/IssueI8ZIQCTest.java diff --git a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/ExcelReader.java b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/ExcelReader.java index 7c0462dd7..083189852 100644 --- a/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/ExcelReader.java +++ b/hutool-poi/src/main/java/org/dromara/hutool/poi/excel/ExcelReader.java @@ -12,6 +12,7 @@ package org.dromara.hutool.poi.excel; +import org.dromara.hutool.core.io.IoUtil; import org.dromara.hutool.core.io.file.FileUtil; import org.dromara.hutool.core.lang.Assert; import org.dromara.hutool.core.func.SerBiConsumer; @@ -122,7 +123,7 @@ public class ExcelReader extends ExcelBase { * @param sheetIndex sheet序号,0表示第一个sheet */ public ExcelReader(final Workbook book, final int sheetIndex) { - this(book.getSheetAt(sheetIndex)); + this(getSheetOrCloseWorkbook(book, sheetIndex)); } /** @@ -132,7 +133,7 @@ public class ExcelReader extends ExcelBase { * @param sheetName sheet名,第一个默认是sheet1 */ public ExcelReader(final Workbook book, final String sheetName) { - this(book.getSheet(sheetName)); + this(getSheetOrCloseWorkbook(book, sheetName)); } /** @@ -463,5 +464,50 @@ public class ExcelReader extends ExcelBase { private void checkNotClosed() { Assert.isFalse(this.isClosed, "ExcelReader has been closed!"); } + + /** + * 获取Sheet,如果不存在则关闭{@link Workbook}并抛出异常,解决当sheet不存在时,文件依旧被占用问题
+ * 见:Issue#I8ZIQC + * @param workbook {@link Workbook},非空 + * @param name sheet名称,不存在抛出异常 + * @return {@link Sheet} + * @throws IllegalArgumentException workbook为空或sheet不能存在 + */ + private static Sheet getSheetOrCloseWorkbook(final Workbook workbook, String name) throws IllegalArgumentException{ + Assert.notNull(workbook); + if(null == name){ + name = "sheet1"; + } + final Sheet sheet = workbook.getSheet(name); + if(null == sheet){ + IoUtil.closeQuietly(workbook); + throw new IllegalArgumentException("Sheet [" + name + "] not exist!"); + } + return sheet; + } + + /** + * 获取Sheet,如果不存在则关闭{@link Workbook}并抛出异常,解决当sheet不存在时,文件依旧被占用问题
+ * 见:Issue#I8ZIQC + * @param workbook {@link Workbook},非空 + * @param sheetIndex sheet index + * @return {@link Sheet} + * @throws IllegalArgumentException workbook为空或sheet不能存在 + */ + private static Sheet getSheetOrCloseWorkbook(final Workbook workbook, final int sheetIndex) throws IllegalArgumentException{ + Assert.notNull(workbook); + final Sheet sheet; + try { + sheet = workbook.getSheetAt(sheetIndex); + } catch (final IllegalArgumentException e){ + IoUtil.closeQuietly(workbook); + throw e; + } + if(null == sheet){ + IoUtil.closeQuietly(workbook); + throw new IllegalArgumentException("Sheet at [" + sheetIndex + "] not exist!"); + } + return sheet; + } // ------------------------------------------------------------------------------------------------------- Private methods end } diff --git a/hutool-poi/src/test/java/org/dromara/hutool/poi/excel/IssueI8ZIQCTest.java b/hutool-poi/src/test/java/org/dromara/hutool/poi/excel/IssueI8ZIQCTest.java new file mode 100644 index 000000000..3128c1d42 --- /dev/null +++ b/hutool-poi/src/test/java/org/dromara/hutool/poi/excel/IssueI8ZIQCTest.java @@ -0,0 +1,10 @@ +package org.dromara.hutool.poi.excel; + +import org.junit.jupiter.api.Test; + +public class IssueI8ZIQCTest { + @Test + void readTest() { + final ExcelReader reader = ExcelUtil.getReader("d:/test/test3.xlsx", "aaa"); + } +}