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


Benutzer-Avatar
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

Hier ist ein Link zum API.

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 vor autoSizeColumn, 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

Benutzer-Avatar
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

Benutzer-Avatar
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

Benutzer-Avatar
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.

Benutzer-Avatar
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):

IntStream.range(0, columnCount).forEach(sheet::autoSizeColumn)

  • 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

1329910cookie-checkApache POI Excel – wie konfiguriert man zu erweiternde Spalten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy