Caractères valides pour les noms de feuilles Excel

En Java, nous utilisons le package suivant pour créer des documents excel par programmation:

org.apache.poi.hssf

Si vous essayez de définir le nom d'une feuille (pas un fichier, mais une feuille Excel interne), vous obtiendrez une erreur si:

  • le nom comporte plus de 31 caractères
  • Le nom contient l'un des caractères suivants: / * ? [ ]

Cependant, après avoir créé un document avec un nom de feuille de:

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

Aucune erreur n'est sortie, et tout semble bien en Java. Lorsque vous ouvrez le fichier excel dans Office 2003, il vous donnera une erreur indiquant que le nom de la feuille n'était pas valide et qu'il l'a renommé en quelque chose de générique comme "feuille 1".

Je ne sais pas grand - chose sur le paquet précédemment indiqué que nous utilisons, mais il semble qu'il ne filtre pas correctement les noms de feuilles Excel non valides. Une idée de comment je peux filtrer tous les caractères invalides connus? J'hésite à filtrer simplement tous les caractères non-word.

29
demandé sur Ross 2009-01-16 21:26:27

4 réponses

Je pense que le problème est le côlon, pas le point d'exclamation.

Si vous ouvrez Excel et essayez de modifier manuellement un nom de feuille, les seuls caractères qu'il ne vous permet pas de taper sont []*/\ ? :

Si vous collez un de ces personnages, vous obtenez l'erreur suivante: (Excel 2003)

Lors du changement de nom d'une feuille ou d'un entré un nom non valide. Essayez l'une de ce qui suit:

  • Assurez-vous que le nom que vous avez entré ne dépasse pas 31 caractères.
  • assurez-vous que le nom ne contient aucun des éléments suivants caractères: : \ / ? * [ ou ]
  • Assurez-vous que vous n'avez pas laissé le nom vide.
38
répondu BradC 2009-01-16 18:40:58

Vous pouvez utiliser le WorkbookUtil du POI Apache.createSafeSheetName (chaîne S) pour créer en toute sécurité votre nom de feuille.

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

12
répondu Tago Fabic 2013-09-17 01:23:05

C'est ce que j'utilise en C# (devrait être similaire en 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
répondu Dunc 2013-03-25 11:03:55

Vous pouvez utiliser ceci:

protected Sheet createSheet(XSSFWorkbook book, String nameSheet) {
    return book.createSheet(WorkbookUtil.createSafeSheetName(nameSheet));
}
1
répondu Jesús Sánchez 2018-02-07 19:45:16