Допустимые символы для имен листов Excel

в Java мы используем следующий пакет для программного создания документов excel:

org.apache.poi.hssf

Если вы попытаетесь установить имя листа (не файл, а внутренний лист Excel), вы получите сообщение об ошибке, если:

  • имя более 31 символов
  • имя содержит любой из следующих символов:/*? [ ]

однако, после создания документа с именем листа:

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

ошибка не выводится, и все кажется прекрасным в Java. Когда вы откроете файл excel в Office 2003, он выдаст вам сообщение об ошибке, что имя листа было недопустимым и что он переименовал его во что-то общее, например "лист 1".

Я мало знаю о ранее заявленном пакете, который мы используем, но похоже, что он неправильно фильтрует недопустимые имена листов Excel. Любая идея о том, как я могу отфильтровать все известные недействительные персонажи? Я не решаюсь просто отфильтровать все символы без слов.

4 ответов


Я думаю, проблема в двоеточии, а не в восклицательном знаке.

Если вы открываете Excel и пытаетесь вручную редактировать имя листа, единственными символами, которые он не позволяет вам вводить, являются [ ] */\ ? :

если вставить один из этих символов, вы получите следующую ошибку: (Excel 2003)

переименовать лист или диаграмму, вы введено недопустимое имя. Попробуйте один из следующее:

  • убедитесь, что введенное вами имя не превышать 31 символа.
  • убедитесь, что имя не должно содержать следующие знаков: \ / ? * [ или ]
  • убедитесь, что вы не оставить имя пустым.

вы можете использовать WorkbookUtil POI Apache.createSafeSheetName (строка s) для безопасного создания имени листа.

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


Это то, что я использую в 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);
}

вы можете использовать это:

protected Sheet createSheet(XSSFWorkbook book, String nameSheet) {
    return book.createSheet(WorkbookUtil.createSafeSheetName(nameSheet));
}