Apache POI中如何按修剪后工作表名称查询工作表?
实现工作表名称的“修剪查询”(忽略空格匹配)
Apache POI本身并没有提供你提到的trimSheetSearch或indexOfSheetSearch这类现成方法,不过我们可以很容易自己实现符合需求的“修剪查询”逻辑——不管是忽略名称前后的空格,还是忽略所有空格进行匹配,都能通过遍历工作簿的工作表来完成。
方案1:忽略前后空格的精确匹配
如果你的需求是:查询时忽略目标名称和实际表名的前后空格(比如实际表名是" 销售数据 ",你用"销售数据"就能匹配到),可以写一个工具方法来遍历所有工作表,对比trim后的名称:
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; public class SheetUtils { // 根据trim后的名称获取工作表 public static Sheet getSheetByTrimmedName(Workbook workbook, String targetName) { if (workbook == null || targetName == null) { return null; } String trimmedTarget = targetName.trim(); // 遍历所有工作表 for (int i = 0; i < workbook.getNumberOfSheets(); i++) { Sheet sheet = workbook.getSheetAt(i); String sheetName = sheet.getSheetName(); // 对比trim后的名称 if (sheetName.trim().equals(trimmedTarget)) { return sheet; } } // 没找到返回null return null; } }
使用方式很简单:
Sheet sheet = SheetUtils.getSheetByTrimmedName(workbook, "sheetName");
方案2:忽略所有空格的匹配
如果你的需求更宽松,需要忽略名称中所有位置的空格(比如实际表名是"销售 月度 数据",你用"销售月度数据"就能匹配),可以修改匹配逻辑,去掉所有空格后再对比:
public static Sheet getSheetIgnoringAllSpaces(Workbook workbook, String targetName) { if (workbook == null || targetName == null) { return null; } // 去掉目标名称中的所有空格 String targetNoSpaces = targetName.replaceAll("\\s+", ""); for (int i = 0; i < workbook.getNumberOfSheets(); i++) { Sheet sheet = workbook.getSheetAt(i); String sheetNameNoSpaces = sheet.getSheetName().replaceAll("\\s+", ""); if (sheetNameNoSpaces.equals(targetNoSpaces)) { return sheet; } } return null; }
额外优化:不区分大小写匹配
如果还需要忽略大小写(比如实际表名是"SalesData",你用"salesdata"也能匹配),只需要把equals换成equalsIgnoreCase即可,比如:
if (sheetName.trim().equalsIgnoreCase(trimmedTarget)) { return sheet; }
为什么POI没有现成方法?
因为Excel允许工作表名称包含空格,POI的getSheet(String name)方法是严格按照字符串精确匹配设计的——毕竟空格本身是合法的表名一部分,所以这类模糊匹配的逻辑需要我们根据自己的业务需求来实现。
内容的提问来源于stack exchange,提问作者Mukhamedali Zhadigerov
相关产品推荐
相关产品推荐

