Допустимые символы для имен листов Excel - PullRequest
31 голосов
/ 16 января 2009

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

org.apache.poi.hssf

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

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

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

Ошибка не выводится, и все выглядит нормально в Java. Когда вы открываете файл Excel в Office 2003, он выдаст сообщение об ошибке, в котором говорится, что имя листа недопустимо и что оно переименовано в что-то общее, например «Лист 1».

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

Ответы [ 4 ]

40 голосов
/ 16 января 2009

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

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

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

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

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

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

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

3 голосов
/ 21 марта 2013

Это то, что я использую в 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);
}
2 голосов
/ 07 февраля 2018

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

protected Sheet createSheet(XSSFWorkbook book, String nameSheet) {
    return book.createSheet(WorkbookUtil.createSafeSheetName(nameSheet));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...