解决EasyExcel写入数据时的Invalid char错误

问题背景

在最近的一个项目开发过程中,需要将数据写入Excel中。理所当然的,笔者第一时间使用了EasyExcel作为读写Excel的第三方工具类。 然而在写入数据的时候,系统有时候会遇到类似如下的错误信息:

properties 复制代码
写入数据时候报错- Invalid char (:) found at index (6) in sheet name '图表3 xx:xxx:xxx'
java.lang.IllegalArgumentException: Invalid char (:) found at index (6) in sheet name '图表3 xx:xxx:xxx'
        at org.apache.poi.ss.util.WorkbookUtil.validateSheetName(WorkbookUtil.java:150)
        at org.apache.poi.xssf.usermodel.XSSFWorkbook.createSheet(XSSFWorkbook.java:911)
        at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:745)
        at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:102)
        at com.alibaba.excel.util.WorkBookUtil.createSheet(WorkBookUtil.java:66)
        at com.alibaba.excel.context.WriteContextImpl.createSheet(WriteContextImpl.java:205)
        at com.alibaba.excel.context.WriteContextImpl.initSheet(WriteContextImpl.java:182)
        at com.alibaba.excel.context.WriteContextImpl.currentSheet(WriteContextImpl.java:122)
        at com.alibaba.excel.write.ExcelBuilderImpl.addContent(ExcelBuilderImpl.java:53)
        at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:161)
        at com.alibaba.excel.ExcelWriter.write(ExcelWriter.java:146)

经过排查,发现这种错误通常是由于Excel表格命名规范不符合要求导致的。 Excel对工作表名有一些基本的规定,例如

  • 工作表名不能超过31个字符。
  • 工作表名不能以空格开头或结尾。
  • 工作表名不能包含以下字符::、/、\、?、*、[、]。

为了解决这个问题,我们可以通过以下步骤进行修复:

分析问题

首先,我们需要明确造成错误的原因。根据错误信息,我们可以看到问题出现在工作表名中包含了不合法字符":"(冒号),而Excel不允许工作表名中包含这个字符。

制定修复计划

在指定修复计划的时候,笔者有两种方案:

  1. 直接提示错误信息,由客户自己修改之后再重新导入Excel中;
  2. 导入数据时,程序自主判断并替换不符合要求的符号。

因为该功能的最终目的是提供Excel文件,用户对于导出的文件名称并没有严格限制,因此最终和主管讨论后,采用方案2。 为了符合Excel的规定,我们需要对工作表名进行一些替换和调整。具体来说,我们需要:

  • 将不合法字符替换为合法字符,这里使用下划线(_)代替。
  • 移除工作表名开头和结尾的空格。
  • 限制工作表名长度为不超过31个字符。

实施修复

为了修复BUG,保证项目能够正常运行,提供了一个替换修改的函数:

JAVA 复制代码
public static String correctSheetName(String sheetName) {
    // 替换不合法字符
    String correctedSheetName = sheetName
        .replaceAll("[:/\\?\\*\\[\\]<>:]", "_")  // 替换不合法字符为下划线
        .replaceAll("^\\s+|\\s+$", "")      // 移除开头和结尾的空格
        .substring(0, Math.min(sheetName.length(), 31)); // 限制长度为31个字符
    return correctedSheetName;
}

这段代码中,我们使用replaceAll方法替换了工作表名中的不合法字符,并使用substring方法限制了工作表名的长度。这样,修复后的工作表名就符合Excel的规定了。 需要注意的是,在使用过程中,笔者发现使用中文的":",也会导致报错,因此在匹配替换的时候,也加上了中文字符的冒号。

调用修复方法

在EasyExcel写入数据之前,调用上述修复方法,将要写入的工作表名传入,获取修复后的工作表名,然后使用修复后的工作表名进行数据写入。

通过以上步骤,就能够有效地解决EasyExcel写入数据时遇到的Invalid char错误,确保工作表名符合Excel的命名规范。

相关推荐
m0_748251082 分钟前
docker安装nginx,docker部署vue前端,以及docker部署java的jar部署
java·前端·docker
A22744 分钟前
Redis——缓存雪崩
java·redis·缓存
Mr.朱鹏5 分钟前
操作002:HelloWorld
java·后端·spring·rabbitmq·maven·intellij-idea·java-rabbitmq
顽疲25 分钟前
从零用java实现 小红书 springboot vue uniapp (6)用户登录鉴权及发布笔记
java·vue.js·spring boot·uni-app
oscar9991 小时前
Maven项目中不修改 pom.xml 状况下直接运行OpenRewrite的配方
java·maven·openrewrite
南宫生1 小时前
力扣-数据结构-3【算法学习day.74】
java·数据结构·学习·算法·leetcode
工业甲酰苯胺1 小时前
聊一聊 C#线程池 的线程动态注入
java·开发语言·c#
m0_748240251 小时前
docker--压缩镜像和加载镜像
java·docker·eureka
向宇it1 小时前
【从零开始入门unity游戏开发之——C#篇30】C#常用泛型数据结构类——list<T>列表、`List<T>` 和数组 (`T[]`) 的选择
java·开发语言·数据结构·unity·c#·游戏引擎·list
葡萄架子1 小时前
Python中的logger作用(from loguru import logger)
java·前端·python