Tip Apache POI Excel XLSX : avoir plusieurs lignes dans le prompt d'un DataValidation
par
, 14/11/2016 à 18h55 (1400 Affichages)
Comme j'ai un peu galéré pour trouver comment mettre plusieurs lignes dans le prompt d'un validateur Excel en xlsx, l'API ne le gérant pas directement (ça sent le bogue), je vous partage le truc que j'ai trouvé en décortiquant un xlsx pour le faire : il suffit de remplacer le caractère \n dans la chaîne par _x000a_.
J'ai analysé les différents whitespaces (du moins les classiques sauf l'espace (\n, \n, \t, \b, \f)) et fait une petite méthode de conversion :
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 public class Utils { public static String escapeWhitespaces(String string) { final StringBuilder sb = new StringBuilder(string.length()); for(int i=0; i<string.length(); i++) { char c = string.charAt(i); if( c!=' ' && Character.isWhitespace(c) ) { switch(c) { case '\f': // ff render a female sign if escaped or make doc corrupted if not case '\b': // backspace make doc corrupted (escaped or not) break; case '\t': // render a single space (not escaped) or nothing (escaped) sb.append(" "); break; case '\r': // cr render nothing if escaped or space if escaped if ( !equals(string,i+1,'\n') ) { // (except if followed with \n) sb.append(' '); // replace with a char } break; case '\n': // lf sb.append(String.format("_x%04x_",(int)c)); break; default: // ignore others } } else { sb.append(c); } } return sb.toString(); } private static boolean equals(String string, int i, char c) { if ( i<string.length() ) { return c==string.charAt(i); } return false; } }
Exemple d'appel (une validation avec combo de choix):
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 final CellRangeAddressList regions = new CellRangeAddressList(firstRowNum, lastRowNum, colNum, colNum); final DataValidation dataValidation; if( sheet instanceof HSSFSheet ) { final DVConstraint constraint = DVConstraint.createExplicitListConstraint(values); dataValidation = new HSSFDataValidation(regions, constraint); } else if ( sheet instanceof XSSFSheet ) { final XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper((XSSFSheet) sheet); final XSSFDataValidationConstraint constraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(values); dataValidation = (XSSFDataValidation)dvHelper.createValidation(constraint, regions); } else { throw new IllegalStateException(); } if ( prompt!=null ) { final String message; if ( sheet instanceof XSSFSheet ) { message = Utils.escapeWhitespaces(prompt.message); } else { message = prompt.message; } dataValidation.createPromptBox(prompt.title, message); dataValidation.setShowPromptBox(true); } sheet.addValidationData(dataValidation);