Excel 工作表名称的有效字符

IT小君   2021-12-06T07:12:15

在 Java 中,我们使用以下包以编程方式创建 excel 文档:

org.apache.poi.hssf

如果您尝试设置工作表的名称(不是文件,而是内部 Excel 工作表),您将在以下情况下收到错误:

  • 名称超过 31 个字符
  • 该名称包含以下任何字符: / \ * ? [ ]

但是,在创建工作表名称为以下的文档后:

@#$​​%&()+~`"':;,.|

没有错误输出,在 Java 中一切正常。当您在 Office 2003 中打开 Excel 文件时,它会给您一条错误消息,指出工作表名称无效,并将其重命名为诸如“工作表 1”之类的通用名称。

我对我们使用的先前声明的包知之甚少,但看起来它没有正确过滤无效的 Excel 工作表名称。知道如何过滤掉所有已知的无效字符吗?我不愿简单地过滤掉所有非单词字符。

评论(4)
IT小君

我认为问题是冒号,而不是感叹号。

如果您打开 Excel 并尝试手动编辑工作表名称,则它不允许您键入的唯一字符是 [ ] * / \ ?

如果粘贴其中一个字符,则会出现以下错误:(Excel 2003)

重命名工作表或图表时,您输入了无效名称。尝试以下方法之一:

  • 确保您输入的名称不超过 31 个字符。
  • 确保名称不包含以下任何字符: : \ / ? * [ 或者 ]
  • 确保您没有将名称留空。
2021-12-06T07:12:15   回复
IT小君

您可以使用 Apache POI 的 WorkbookUtil.createSafeSheetName(String s) 来安全地创建您的工作表名称。

http://poi.apache.org/apidocs/org/apache/poi/ss/util/WorkbookUtil.html

2021-12-06T07:12:15   回复
IT小君

这是我在 C# 中使用的(在 Java 中应该类似):

const string invalidCharsRegex = @"[/\\*'?[\]:]+";
const int maxLength = 31;

string safeName = Regex.Replace(worksheetName, invalidCharsRegex, " ")
                        .Replace("  ", " ")
                        .Trim();

if (string.IsNullOrEmpty(safeName))
{
    safeName = "Default";   // cannot be empty
}
else if (safeName.Length > maxLength)
{
    safeName = safeName.Substring(0, maxLength);
}
2021-12-06T07:12:15   回复
IT小君

你可以使用这个:

protected Sheet createSheet(XSSFWorkbook book, String nameSheet) {
    return book.createSheet(WorkbookUtil.createSafeSheetName(nameSheet));
}
2021-12-06T07:12:15   回复