使用Java过滤excel中sheetName的特殊字符和长度限制

使用Java过滤excel中sheetName中的特殊字符和长度限制

需求

  • 在开发中遇到一个文件导出错误,原因是由于XSSFWorkbook workbook = new XSSFWorkbook();生成excel文件的时候没有采取过滤措施,选择的是抛出异常,因此报错,而且由于数据库中存在数据,用户的选项中已经删除了,因此出现了那个时间段内导出的文件一直失败的现象。好在通过查询日志找到准确的错误位置,并且写了方法解决这个情况,现在写文章记录此事件。
  • 这个名称在编写的时候存在这种情况
    在这里插入图片描述

具体实现代码

下面展示 代码片.

public class Tmp {
    public static void main(String[] args) {
        Tmp tmp = new Tmp();
        String sheetName = "'Hello*/'\\n'[]**12aldajslslad'a'l'rvdv'";
        String sheetName1 = "";
        System.out.println(sheetName.length());
        //String ans = tmp.validateSheetName(sheetName);
        String ans = validateSheetName(sheetName);
        sheetName1 = validateSheetName(sheetName1);
        //System.out.println(sheetName);
        System.out.println(sheetName1+sheetName1.length());
        System.out.println(ans);
        System.out.println(ans.length());
    }

    public static String validateSheetName(String sheetName) {
        String result = "";
        if (sheetName == null) {
            throw new IllegalArgumentException("sheetName must not be null");
        } else {
            if (sheetName.length() > 31) {
                sheetName = sheetName.substring(0, 31);
            }
            String newStr[] = sheetName.split("");
            int len = sheetName.length();
            if (len >= 1 && len <= 31) {
                int i = 0;
                while (i < len) {
                    if ("*".equals(newStr[i])
                            || "/".equals(newStr[i])
                            || ":".equals(newStr[i])
                            || "?".equals(newStr[i])
                            || "[".equals(newStr[i])
                            || "]".equals(newStr[i])
                            || "\\".equals(newStr[i])
                    ) {
                        newStr[i] = "";
                    }
                    ++i;
                }
                if (sheetName.charAt(0) == '\'') {
                    newStr[0] = "";
                }
                if (sheetName.charAt(len - 1) == '\'') {
                    newStr[len - 1] = "";
                }
            }

            for (int i = 0; i < newStr.length; i++) {
                result += newStr[i];
            }
        }
        return result;
    }

}



正则表达式实现版本具体实现代码

public class Tmp {
    public static void main(String[] args) {
        Tmp tmp = new Tmp();
        String sheetName = "'Hello*/'\\n'[]**12aldajslslad'a'l'rvdv'";
        String sheetName1 = "";
        System.out.println(sheetName.length());
        //String ans = tmp.validateSheetName(sheetName);
        String ans = validateSheetName(sheetName);
        sheetName1 = validateSheetName(sheetName1);
        //System.out.println(sheetName);
        System.out.println(sheetName1+sheetName1.length());
        System.out.println(ans);
        System.out.println(ans.length());
    }

    public static String validateSheetName(String sheetName) {
        if (StringUtils.isBlank(sheetName)) {
            throw new IllegalArgumentException("sheetName must not be null");
        } else {
            if (sheetName.length() > 31) {
                sheetName = sheetName.substring(0, 31);
            }
            sheetName=sheetName.replaceAll("[\\[*\\]*/*\n?*:*\\\\]","");
            sheetName=sheetName.replaceAll("^'*|'*$","");
        }
        return sheetName;
    }

}



  • 需要注意的是,正则表达式不可以写成一条,那样将会照成头或尾存在单引号过滤不完全的问题,原因是存在以下这种情况
    String nameTmp2 = "’’'H??:e’ll’o*///’\\n’[][][[\\\\]][][[*’";
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值