J'utilise Apache POI en Java pour créer un fichier Excel. Je remplis les données, puis j'essaie d'auto-dimensionner chaque colonne, mais les tailles sont toujours fausses (et I pense cohérent). Les deux premières lignes sont toujours (?) Complètement réduites. Lorsque je redimensionne automatiquement les colonnes dans Excel, cela fonctionne parfaitement.
Aucune cellule vierge n'est en cours d'écriture (je crois) et le redimensionnement est la dernière chose que je fais.
Voici le code pertinent: Ceci est une version réduite sans traitement d'erreur, etc.
public static synchronized String storeResults(ArrayList<String> resultList, String file) {
if (resultList == null || resultList.size() == 0) {
return file;
}
FileOutputStream stream = new FileOutputStream(file);
//Create workbook and result sheet
XSSFWorkbook book = new XSSFWorkbook();
Sheet results = book.createSheet("Results");
//Write results to workbook
for (int x = 0; x < resultList.size(); x++) {
String[] items = resultList.get(x).split(PRIM_DELIM);
Row row = results.createRow(x);
for (int i = 0; i < items.length; i++) {
row.createCell(i).setCellValue(items[i]);
}
}
//Auto size all the columns
for (x = 0; x < results.getRow(0).getPhysicalNumberOfCells(); x++) {
results.autoSizeColumn(x);
}
//Write the book and close the stream
book.write(stream);
stream.flush();
stream.close();
return file;
}
Je sais que quelques questions similaires sont similaires, mais la plupart d’entre elles sont simplement un cas de dimensionnement avant de remplir les données. Et les rares qui ne le sont pas sont plus compliqués/sans réponse.
EDIT: J'ai essayé d'utiliser deux polices différentes et cela n'a pas fonctionné. Ce qui n’est pas surprenant, car quelle que soit la police, toutes les colonnes doivent être complètement réduites ou aucune ne doit l'être.
De plus, à cause du problème de polices, je lance le programme sous Windows 7.
RESOLU: C'était un problème de police de caractères. La seule police qui a fonctionné est Serif.
Juste pour répondre à mon commentaire. Les lignes ne pouvaient pas dimensionner correctement car Java ne connaissait pas la police que vous essayiez d'utiliser ce lien devrait vous aider si vous souhaitez installer de nouvelles polices dans Java afin de pouvoir utiliser quelque chose de plus sophistiqué. Il contient également la liste des polices par défaut connues de Java.
Heureux que cela vous ait aidé et que votre problème soit résolu!
Ceci est probablement lié à ce bogue de POI qui est lié à bogue Java JDK-8013716: Le rendu des polices Calibri et Cambria a échoué depuis la mise à jour 45 .
Dans ce cas, changer le Font ou utiliser JRE au-dessus de 6u45/7u21 devrait résoudre le problème.
Vous pouvez également atténuer le problème et éviter que les colonnes ne soient totalement réduites en utilisant un code comme celui-ci
sheet.autoSizeColumn(x);
if (sheet.getColumnWidth(x) == 0) {
// autosize failed use MIN_WIDTH
sheet.setColumnWidth(x, MIN_WIDTH);
}
Je rencontrais aussi ce problème et c'était ma solution.
Pas:
Code:
// initialize objects
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet spreadsheet = workbook.createSheet(sheetName);
XSSFRow row = spreadsheet.createRow(0);
XSSFCell cell;
// font/style
XSSFFont font = workbook.createFont();
font.setFontName("Arial");
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
// create/set cell & style
cell = row.createCell(0);
cell.setCellValue("New Cell");
cell.setCellStyle(style);
// auto size
spreadsheet.autoSizeColumn(0);
// create file
File aFile = new File("Your Filename");
FileOutputStream out = new FileOutputStream(aFile);
workbook.write(out);
Ressources:
J'ai eu un problème similaire sur Windows 7.
J'utilisais la police Calibri (prise en charge par ma machine virtuelle Java) . Avec cette police, la getBounds().getWidth()
du Java.awt.font.TextLayout
utilisé par la méthode de POI autoSizeColumn()
renvoie 0.
Changer la police en Calibri-Regular a résolu le problème dans mon cas.
Voici mes 2 cents -
J'utilisais la police par défaut (Arial dans mon cas) en l'utilisant pour rendre certains champs en gras dans les xls. Travaillé comme un charme dans Windows avec la fonction autoSizeColumn ().
Linux n'était pas si tolérant. L'auto-dimensionnement était incorrect à certains endroits. Après avoir parcouru ce fil et d’autres, j’ai trouvé la solution suivante.
J'ai copié les fichiers .tff de la police Arial dans le répertoire Java/jre/lib/fonts et ai relancé l'application. A bien fonctionné.
J'ai utilisé la police Helvetica pour essayer de remplacer la police Arial (en fait, Helvetica est similaire à Arial).
XSSFFont font = wb.createFont();
font.setFontName("Helvetica");
J'ai constaté que le redimensionnement automatique ne rendait pas la colonne suffisamment large lorsque la chaîne la plus large commençait par des espaces, par exemple.
cell.setCellValue(" New Cell");
Cela peut être corrigé en utilisant des indentations, par ex.
// font/style
XSSFFont font = workbook.createFont();
font.setFontName("Arial");
XSSFCellStyle style = workbook.createCellStyle();
style.setFont(font);
style.setIndention((short)2);
// create/set cell & style
cell = row.createCell(0);
cell.setCellValue("New Cell");
cell.setCellStyle(style);
// auto size
spreadsheet.autoSizeColumn(0);
Ce qui suit fonctionne pour moi.
Je règle la police et utilise autoSizeColumn () après avoir saisi toutes les données.
public static XSSFWorkbook createExcel(List<ChannelVodFileInfoList> resList) {
XSSFWorkbook hwb = new XSSFWorkbook();
String[] title = { "1", "2", "3", "4"};
XSSFSheet sheet = hwb.createSheet("dataStats");
XSSFRow firstrow = sheet.createRow(0);
for (int i = 0; i < title.length; i++) {
XSSFCell xh = firstrow.createCell(i);
xh.setCellValue(title[i]);
}
if (resList == null || resList.size() == 0) {
return hwb;
}
for (int i = 0; i < resList.size(); i++) {
ChannelVodFileInfoList doTemp = resList.get(i);
XSSFRow row = sheet.createRow(i + 1);
for (int j = 0; j < title.length; j++) {
XSSFCell cell = row.createCell(j);
Font font111 = hwb.createFont();
font111.setBoldweight(Font.BOLDWEIGHT_NORMAL);
XSSFCellStyle cellStyle111 = hwb.createCellStyle();
cellStyle111.setFont(font111);
cell.setCellStyle(cellStyle111);
if (j == 0) {
cell.setCellValue(dateStr);
} else if (j == 1) {
cell.setCellValue(doTemp.getChannelName());
}else if (j == 2) {
cell.setCellValue(doTemp.getBitrate());
}else if (j == 3) {
cell.setCellValue(doTemp.getWh());
}
}
for (int j = 0; j < title.length; j++) {
sheet.autoSizeColumn(j);
}
return hwb;
}