diff --git a/CHANGELOG.md b/CHANGELOG.md index 962fef4f4..4350c21c1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ * 【poi 】 增加EscapeStrCellSetter(issue#I466ZZ@Gitee) * 【poi 】 ExcelBase增加renameSheet、cloneSheet(issue#I466ZZ@Gitee) * 【core 】 ListUtil增加splitAvg方法(pr#397@Gitee) +* 【poi 】 Excel07SaxReader支持数字类型sheet名称、支持sheetName:名称前缀(issue#I46OMA@Gitee) ### 🐞Bug修复 * 【core 】 修复MapUtil.sort比较器不一致返回原map的问题(issue#I46AQJ@Gitee) 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 f122f1a3e..17860c8ae 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 @@ -75,13 +75,13 @@ public class ExcelUtil { * 通过Sax方式读取Excel,同时支持03和07格式 * * @param file Excel文件 - * @param idOrRid Excel中的sheet id或者rid编号,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet + * @param idOrRidOrSheetName Excel中的sheet id或rid编号或sheet名称,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet * @param rowHandler 行处理器 * @since 5.4.4 */ - public static void readBySax(File file, String idOrRid, RowHandler rowHandler) { + public static void readBySax(File file, String idOrRidOrSheetName, RowHandler rowHandler) { final ExcelSaxReader reader = ExcelSaxUtil.createSaxReader(ExcelFileUtil.isXlsx(file), rowHandler); - reader.read(file, idOrRid); + reader.read(file, idOrRidOrSheetName); } /** @@ -102,14 +102,14 @@ public class ExcelUtil { * 通过Sax方式读取Excel,同时支持03和07格式 * * @param in Excel流 - * @param idOrRid Excel中的sheet id或者rid编号,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet + * @param idOrRidOrSheetName Excel中的sheet id或rid编号或sheet名称,rid必须加rId前缀,例如rId1,如果为-1处理所有编号的sheet * @param rowHandler 行处理器 * @since 5.4.4 */ - public static void readBySax(InputStream in, String idOrRid, RowHandler rowHandler) { + public static void readBySax(InputStream in, String idOrRidOrSheetName, RowHandler rowHandler) { in = IoUtil.toMarkSupportStream(in); final ExcelSaxReader reader = ExcelSaxUtil.createSaxReader(ExcelFileUtil.isXlsx(in), rowHandler); - reader.read(in, idOrRid); + reader.read(in, idOrRidOrSheetName); } // ------------------------------------------------------------------------------------ Read by Sax end diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java index 0cdd3f054..9319e5d27 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java @@ -196,7 +196,8 @@ public class Excel03SaxReader implements HSSFListener, ExcelSaxReader { // sheetIndex需转换为rid final SheetRidReader ridReader = new SheetRidReader().read(xssfReader); - final int sheetIndex; - Integer rid; - try { - sheetIndex = Integer.parseInt(idOrRidOrSheetName); - rid = ridReader.getRidBySheetIdBase0(sheetIndex); - return (null != rid) ? rid : sheetIndex; - } catch (NumberFormatException ignore) { - // 非数字,可能为sheet名称 - rid = ridReader.getRidByNameBase0(idOrRidOrSheetName); + if (StrUtil.startWithIgnoreCase(idOrRidOrSheetName, SHEET_NAME_PREFIX)) { + // name:开头的被认为是sheet名称直接处理 + idOrRidOrSheetName = StrUtil.removePrefixIgnoreCase(idOrRidOrSheetName, SHEET_NAME_PREFIX); + final Integer rid = ridReader.getRidByNameBase0(idOrRidOrSheetName); if (null != rid) { return rid; } + } else { + // 尝试查找名称 + Integer rid = ridReader.getRidByNameBase0(idOrRidOrSheetName); + if (null != rid) { + return rid; + } + + try { + final int sheetIndex = Integer.parseInt(idOrRidOrSheetName); + rid = ridReader.getRidBySheetIdBase0(sheetIndex); + // 如果查找不到对应index,则认为用户传入的直接是rid + return ObjectUtil.defaultIfNull(rid, sheetIndex); + } catch (NumberFormatException ignore) { + // 非数字,说明非index,且没有对应名称,抛出异常 + } } throw new IllegalArgumentException("Invalid rId or id or sheetName: " + idOrRidOrSheetName); } // --------------------------------------------------------------------------------------- Private method end -} \ No newline at end of file +} diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxReader.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxReader.java index eef707551..5c084f115 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxReader.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/ExcelSaxReader.java @@ -17,6 +17,8 @@ public interface ExcelSaxReader { // sheet r:Id前缀 String RID_PREFIX = "rId"; + // sheet name前缀 + String SHEET_NAME_PREFIX = "sheetName:"; /** * 开始读取Excel diff --git a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java index 3429d9356..cda21e304 100644 --- a/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java +++ b/hutool-poi/src/test/java/cn/hutool/poi/excel/ExcelSaxReadTest.java @@ -32,6 +32,17 @@ public class ExcelSaxReadTest { ExcelUtil.readBySax("aaa.xlsx", 0, createRowHandler()); } + @Test + public void excel07ByNameTest() { + // 工具化快速读取 + // sheet名称是区分大小写的 + ExcelUtil.readBySax("aaa.xlsx", "Sheet1", createRowHandler()); + // 纯数字名称也支持 + ExcelUtil.readBySax("aaa.xlsx", "12", createRowHandler()); + // 前缀支持 + ExcelUtil.readBySax("aaa.xlsx", "sheetName:12", createRowHandler()); + } + @Test public void excel07FromStreamTest() { // issue#1225 非markSupport的流读取会错误 @@ -51,6 +62,7 @@ public class ExcelSaxReadTest { public void excel03ByNameTest() { Excel03SaxReader reader = new Excel03SaxReader(createRowHandler()); reader.read("aaa.xls", "校园入学"); + reader.read("aaa.xls", "sheetName:校园入学"); } @Test(expected = POIException.class) diff --git a/hutool-poi/src/test/resources/aaa.xlsx b/hutool-poi/src/test/resources/aaa.xlsx index ed2ebf358..97ba4bfad 100644 Binary files a/hutool-poi/src/test/resources/aaa.xlsx and b/hutool-poi/src/test/resources/aaa.xlsx differ