Допустимые символы для имен листов 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));
}