From 1400911bb834414fce3b36e0dad71bd7b0ab5ca6 Mon Sep 17 00:00:00 2001 From: "Say.li" <120011676@qq.com> Date: Thu, 24 Mar 2022 14:20:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20ExcelUtil=20getReader(Stri?= =?UTF-8?q?ng=20bookFilePath,=20String=20sheetName)=20=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/poi/excel/ExcelReader.java | 10 ++++++++++ .../java/cn/hutool/poi/excel/ExcelUtil.java | 16 ++++++++++++++++ .../cn/hutool/poi/excel/ExcelUtilTest.java | 11 +++++++++++ hutool-poi/src/test/resources/aaa.xlsx | Bin 11888 -> 11709 bytes 4 files changed, 37 insertions(+) diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelReader.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelReader.java index bac3a4caa..de4dd6835 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelReader.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelReader.java @@ -50,6 +50,16 @@ public class ExcelReader extends ExcelBase { this(FileUtil.file(excelFilePath), sheetIndex); } + /** + * 构造 + * + * @param excelFilePath Excel文件路径,绝对路径或相对于ClassPath路径 + * @param sheetName sheet名,第一个默认是sheet1 + */ + public ExcelReader(String excelFilePath, String sheetName) { + this(FileUtil.file(excelFilePath), sheetName); + } + /** * 构造(读写方式读取) * diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java index 8db7e1ced..b15823eb5 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/ExcelUtil.java @@ -154,6 +154,22 @@ public class ExcelUtil { } } + /** + * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容 + * + * @param bookFilePath Excel文件路径,绝对路径或相对于ClassPath路径 + * @param sheetName sheet名,第一个默认是sheet1 + * @return {@link ExcelReader} + * @since 3.1.1 + */ + public static ExcelReader getReader(String bookFilePath, String sheetName) { + try { + return new ExcelReader(bookFilePath, sheetName); + } catch (NoClassDefFoundError e) { + throw new DependencyException(ObjectUtil.defaultIfNull(e.getCause(), e), PoiChecker.NO_POI_ERROR_MSG); + } + } + /** * 获取Excel读取器,通过调用{@link ExcelReader}的read或readXXX方法读取Excel内容 * diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelUtilTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelUtilTest.java index 0be195739..2b66d5754 100644 --- a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelUtilTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelUtilTest.java @@ -4,6 +4,9 @@ import cn.hutool.poi.excel.cell.CellLocation; import org.junit.Assert; import org.junit.Test; +import java.util.List; +import java.util.Map; + public class ExcelUtilTest { @Test @@ -50,4 +53,12 @@ public class ExcelUtilTest { writer.writeCellValue(1, 2, "设置值"); writer.close(); } + + @Test + public void getReaderByBookFilePathAndSheetNameTest() { + ExcelReader reader = ExcelUtil.getReader("aaa.xlsx", "12"); + List> list = reader.readAll(); + reader.close(); + Assert.assertEquals(1L, list.get(1).get("鞋码")); + } } diff --git a/hutool-poi/src/test/resources/aaa.xlsx b/hutool-poi/src/test/resources/aaa.xlsx index 97ba4bfad4896ed3f8ce77993130fa92665fad10..ac6d3814b2406c83272ec225249853b3b841cd84 100644 GIT binary patch delta 6852 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