POI 导出 Excel 替换 sheet 名不支持的字符

使用 POI 导出 Excel 时,出现如下报错:

1
2
3
4
5
6
7
8
[2021-05-14 15:00:34 138] [T=EYtsxmMxAX, U=] [ERROR] GroupController.downloadExcel(457) - Invalid char ([) found at index (0) in sheet name '[ajax 接口]发送短信给用户'
java.lang.IllegalArgumentException: Invalid char ([) found at index (0) in sheet name '[ajax 接口]发送短信给用户'
at org.apache.poi.ss.util.WorkbookUtil.validateSheetName(WorkbookUtil.java:153)
at org.apache.poi.hssf.record.BoundSheetRecord.setSheetname(BoundSheetRecord.java:94)
at org.apache.poi.hssf.model.InternalWorkbook.setSheetName(InternalWorkbook.java:591)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.createSheet(HSSFWorkbook.java:789)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.createSheet(HSSFWorkbook.java:73)
at net.sf.jxls.transformer.XLSTransformer.transformMultipleSheetsList(XLSTransformer.java:334)

是因为 Excel 对 sheet 名有字符限制,不支持 \/?*[]: 这几个字符。所以我们在导出时需要替换掉,或者在前面的逻辑里就要限制住。

如果是替换可用如下正则:

1
sheetName.replaceAll("(\\*|/|:|\\\\|\\[|\\]|\\?)", ""); // 替换不支持的字符

同时还要注意 sheet 名不能超过 31 个字符。

参考资料

https://social.msdn.microsoft.com/Forums/en-US/84c0c4d2-52b9-4502-bece-fdc616db05f8/invalid-characters-for-excel-sheet-names