Apache POI Excel – wie konfiguriert man zu erweiternde Spalten?
Lesezeit: 5 Minuten
ich benutze Apache POI API generieren excel spreadsheet um einige Daten auszugeben.
Das Problem, mit dem ich konfrontiert bin, besteht darin, dass beim Erstellen und Öffnen der Tabelle Spalten nicht erweitert werden, sodass ein langer Text wie Text im Datumsformat auf den ersten Blick nicht angezeigt wird.
Ich könnte einfach auf den Spaltenrand in Excel doppelklicken, um ihn zu erweitern, oder den Rand ziehen, um die Spaltenbreite anzupassen, aber es könnte mehr als 20 Spalten geben, und ich möchte das auf keinen Fall jedes Mal manuell tun, wenn ich die Tabelle öffne 🙁
Ich fand heraus (obwohl es eine falsche Methode sein könnte) groupRow() und setColumnGroupCollapsed() könnte in der Lage sein, den Trick zu machen, aber kein Glück. Vielleicht benutze ich es falsch.
Beispiel-Code-Snippet
Workbook wb = new HSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
//create sheet
Sheet sheet = wb.createSheet("masatoSheet");
//not really working yet.... :(
//set group for expand/collapse
//sheet.groupRow(0, 10); //just random fromRow toRow argument values...
//sheet.setColumnGroupCollapsed(0, true);
//create row
Row row = sheet.createRow((short)0);
//put a cell in the row and store long text data
row.createCell(0).setCellValue("Loooooooong text not to show up first");
Wenn diese Tabelle erstellt wird, befindet sich die Zeichenfolge „Looooooong text to show up first“ in der Zelle, aber da die Spalte nicht erweitert wird, wird nur „Looooooooo“ angezeigt.
Wie kann ich es so konfigurieren, dass die Spalte bereits erweitert ist, wenn ich meine Tabelle öffne???
stackoverflow.com/questions/20190317/…
– Givenkoa
7. Februar 2014 um 11:07 Uhr
Sie scheinen nach einer Möglichkeit zu suchen, POI zu verwenden, um dies zu erreichen. Aber um es einfach in Excel zu tun, wählen Sie das gesamte Blatt aus und doppelklicken Sie auf die Begrenzung der Spaltenüberschrift AB. Wenn Sie dies für mehrere Blätter tun müssen, ist eine codierte Lösung möglicherweise besser für Sie geeignet.
– durchschn
11. April 2014 um 18:21 Uhr
Sean
Nach Sie haben alle Ihre Daten in das Blatt eingetragen, Sie können anrufen autoSizeColumn(int column) auf Ihrem Blatt, um die Spalten automatisch an die richtige Größe anzupassen
Weitere Informationen finden Sie in diesem Beitrag Problem beim Anpassen der Excel-Zellengröße an die Größe des Inhalts bei Verwendung von Apache Poi
Wollte nur darauf hinweisen autoSizeColumn skaliert nicht gut und wird es sein super langsam, wenn Sie viele Zeilen haben. Ich musste ein wenig hacky werden und etwas Ähnliches tun, was in dieser Frage vorgeschlagen wurde.
– lbstr
17. April 2014 um 20:17 Uhr
Warnung vorautoSizeColumn, hierfür muss Java Font verfügbar sein. Dies ist nicht Teil des Headless-Java-JRE, das auf Servern verwendet wird, und löst eine NullPointerException aus.
– Stephen Dillon
2. Oktober 2017 um 20:28 Uhr
@StephenDillon Irgendeine Idee, wie man den Nullzeiger für die Schriftartkonfiguration repariert?
– Veeshal
16. Juli 2020 um 17:03 Uhr
Der beste Weg, den wir gefunden haben, war, jede Zeile in der Spalte zu durchlaufen, die längste Zeichenlänge zu finden und mit x zu multiplizieren + einen Puffer hinzuzufügen. X Verwenden Sie Versuch und Irrtum, um zu sehen, was passt, aber es sollte eine durchschnittliche Breite eines Zeichens sein. Ich glaube nicht, dass Sie es ohne Schriftart richtig machen können, aber wir kommen dem ziemlich nahe. Andernfalls können Sie ein Makro zu Excel hinzufügen, um es beim ersten Öffnen durch den Benutzer zu beheben. Dies war die beste Methode, erfordert jedoch, dass Makros aktiviert sind
– Stephen Dillon
17. Juli 2020 um 19:26 Uhr
Wie andere in Kommentaren betonten, funktioniert autoSizeColumn, aber es verlangsamt VIEL, ich habe es in meinem Projekt verwendet und der Unterschied betrug etwa 3 Sekunden bei 10 Zeilen, stellen Sie sich vor, Sie hätten Hunderte – Tausende von Zeilen
– Benutzer9802118
1. Juli 2021 um 17:19 Uhr
Unni Kris
Tipp : Damit die automatische Größe funktioniert, muss der Aufruf an sheet.autoSizeColumn(columnNumber) sollte gemacht werden nach Füllen der Daten in das Excel.
Das Aufrufen der Methode vor dem Auffüllen der Daten hat keine Auswirkung.
stackoverflow.com/questions/37069820/… manchmal funktioniert das nicht
– Roman Soviak
26. März 2019 um 12:19 Uhr
Die hier gegebene Antwort bezieht sich auf Java, während sich der im Kommentar angegebene Link auf Android bezieht. Die Antwort funktioniert weiterhin in allen Java-Fällen (mit Ausnahme von kopflosen Java-JREs, für die die Java-Schriftart nicht verfügbar ist).
– Unni Kris
29. März 2019 um 8:28 Uhr
danke, ich habe func berechnet und setColumnWidth wie folgt verwendet: (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
– Roman Soviak
29. März 2019 um 15:03 Uhr
@ user7856586 kannst du diese Methode etwas detaillierter für mich erläutern
– Mehroz Mustafa
20. Juli 2020 um 15:31 Uhr
Ondrej Kvasnovsky
Wenn Sie die Größe aller Spalten in einer Arbeitsmappe automatisch anpassen möchten, ist hier eine Methode, die nützlich sein könnte:
public void autoSizeColumns(Workbook workbook) {
int numberOfSheets = workbook.getNumberOfSheets();
for (int i = 0; i < numberOfSheets; i++) {
Sheet sheet = workbook.getSheetAt(i);
if (sheet.getPhysicalNumberOfRows() > 0) {
Row row = sheet.getRow(sheet.getFirstRowNum());
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
int columnIndex = cell.getColumnIndex();
sheet.autoSizeColumn(columnIndex);
}
}
}
}
ich bekomme NullPointerException bei row.cellIterator(). Liegt es daran, dass ich in einer der Zellen keinen Wert habe?
– rakeee
18. Juni 2020 um 13:09 Uhr
UVM
Du kannst so etwas versuchen:
HSSFSheet summarySheet = wb.createSheet();
summarySheet.setColumnWidth(short column, short width);
Hier sind die Parameter: Spaltennummer im Blatt und seine Breite. Aber die Breiteneinheiten sind ziemlich klein, Sie können zum Beispiel 4000 versuchen.
Adnan Ghaffar
Für Excel-POI:
sheetName.autoSizeColumn(cellnum);
Beispielcode unten
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("your sheet name");
HSSFRow row = sheet.createRow(0);
cell = row.createCell(0);
cell.setCellValue("A BIG NAME WITH AUTO SIZE FEATURE ENABLED");
//Das ist entscheidend
sheet.autoSizeColumn(0);
//Argument muss Zellennummer sein
cell = row.createCell(1);
cell.setCellValue("a big name without auto size feature enabled");
Überprüfen Sie die Ausgabe und gehen Sie verrückt 🙂
Wenn Sie die Anzahl Ihrer Spalten kennen (z. B. einer Sammlungsliste). Sie können einfach diesen einen Liner verwenden, um alle Spalten eines Blattes anzupassen (wenn Sie mindestens Java 8 verwenden):
Ein paar Jahre alt, aber wenn Sie schon dabei sind, machen Sie es kürzer, indem Sie die Methodenreferenz verwenden: IntStream.range(0, columnCount).forEach(sheet::autoSizeColumn)
– BÄRUS
24. Mai um 11:32 Uhr
@BAERUS danke! Ich habe es angepasst, um Ihre vorgeschlagene kürzere Variante zu verwenden
– schnappen
24. Mai um 11:52 Uhr
13299100cookie-checkApache POI Excel – wie konfiguriert man zu erweiternde Spalten?yes
stackoverflow.com/questions/20190317/…
– Givenkoa
7. Februar 2014 um 11:07 Uhr
Sie scheinen nach einer Möglichkeit zu suchen, POI zu verwenden, um dies zu erreichen. Aber um es einfach in Excel zu tun, wählen Sie das gesamte Blatt aus und doppelklicken Sie auf die Begrenzung der Spaltenüberschrift AB. Wenn Sie dies für mehrere Blätter tun müssen, ist eine codierte Lösung möglicherweise besser für Sie geeignet.
– durchschn
11. April 2014 um 18:21 Uhr