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.
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.
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
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);
}
Vous pouvez utiliser ceci:
protected Sheet createSheet(XSSFWorkbook book, String nameSheet) {
return book.createSheet(WorkbookUtil.createSafeSheetName(nameSheet));
}