Excel表格名称的有效字符

34
在Java中,我们使用以下包来编程创建Excel文档:
org.apache.poi.hssf

如果你试图设置一个工作表的名称(不是文件,而是内部Excel工作表),那么如果:

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

你将会收到一条错误信息。

然而,在创建一个带有以下工作表名称的文档之后:

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

在Java中不会输出错误信息,并且一切似乎都正常。但是,当你在Office 2003中打开Excel文件时,它将给出一条错误消息,说工作表名称无效,并将其重命名为类似“Sheet 1”的通用名称。

我对我们使用的先前包不太了解,但看起来它没有正确过滤无效的Excel工作表名称。有没有办法可以过滤掉所有已知的无效字符?我不想简单地过滤掉所有非单词字符。

4个回答

45

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

如果你打开Excel并尝试手动编辑工作表名称,唯一不能输入的字符是[ ] * / \ ? :

如果你粘贴其中一个字符,你会得到以下错误:(Excel 2003)

 

重命名工作表或图表时,您输入了无效的名称。请尝试以下操作:

   
     
  • 确保您输入的名称不超过31个字符。
  •  
  • 确保名称不包含以下任何字符::\ /?* [或]
  •  
  • 确保您没有留空名称。
  •  

1
如果可以的话,为什么我不能获取一个带有冒号的工作表名称呢? - Patrick Cuff
1
当我粘贴一个时,我得到了包含的消息,然后当我在工作表上点击时,冒号已经变成了一个空格。请仔细检查您的。 - BradC
1
如果你忽略这个消息,然后再次按下< enter >,Excel 将以!@#$%&()+〜`“’:;,. | 作为名称。但是你说得对,尽管你可以复制一个冒号,但 Excel 不允许你手动输入它。 - Patrick Cuff
我没有注意到,他们能把工作表名称的默认字体变小吗?从快速浏览中,名称中的分号看起来像冒号,但你是对的(再次) :) - Patrick Cuff
尝试使用 1:2\3/4?5*6[7]8。这样更明显一些。 - BradC
1
这可能对某些人有用,<br> setSheetName(wb.getNumberOfSheets()-1,cName,HSSFCell.ENCODING_UTF_16); <br> 我无法将中文字符输入为工作表名称,但文件名接受中文字符。设置工作表名称的编码后,现在可以接受这些字符。 - Vimal Raj

22

6
警告:在POI 3.7中,这个方法允许使用冒号(Excel不允许)。在POI 3.9版本中已经修复了这个问题。 - David Kerr

10
这是我在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);
}

不允许使用相同名称的多个工作表,因此当采用固定默认值来命名工作表时,应当小心。 - Mopper

7
您可以使用以下方法:
protected Sheet createSheet(XSSFWorkbook book, String nameSheet) {
    return book.createSheet(WorkbookUtil.createSafeSheetName(nameSheet));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接