Apache POI Excel - Wie konfiguriere ich Spalten, die erweitert werden sollen?


98

Ich verwende Apache POI APIzum Generieren, excel spreadsheetum einige Daten auszugeben.

Das Problem, mit dem ich konfrontiert bin, besteht darin, dass beim Erstellen und Öffnen der Tabelle Spalten nicht erweitert werden, sodass Langtext wie datumsformatierter Text nicht auf den ersten Blick 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önnten mehr als 20 Spalten vorhanden sein, und ich möchte dies auf keinen Fall jedes Mal manuell tun, wenn ich die Tabelle öffne :(

Ich fand es heraus (obwohl es eine falsche Methode sein könnte ) groupRow()und setColumnGroupCollapsed()könnte den Trick machen, aber kein Glück. Vielleicht benutze ich es falsch.

Beispielcode-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, der nicht zuerst angezeigt wird" in der Zelle. Da die Spalte jedoch nicht erweitert wird, wird nur "Loooooooo" angezeigt.

Wie kann ich es so konfigurieren, dass beim Öffnen meiner Tabelle die Spalte bereits erweitert wird?



Sie scheinen nach einer Möglichkeit zu suchen, POI zu verwenden, um dies zu erreichen. Wählen Sie dazu einfach in Excel das gesamte Blatt aus und doppelklicken Sie auf die Überschriftengrenze der AB-Spalte. Wenn Sie dies für mehrere Blätter tun müssen, kann eine codierte Lösung Ihnen besser dienen.
Durchschnitt

Antworten:


172

Nachdem Sie alle Ihre Daten zum Blatt hinzugefügt haben, können Sie autoSizeColumn(int column)Ihr Blatt aufrufen, um die Spalten automatisch auf die richtige Größe anzupassen

Hier ist ein Link zur 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


7
Ich wollte nur darauf hinweisen , dass autoSizeColumnnicht skaliert gut und sein Super langsam , wenn Sie viele Zeilen haben. Ich musste ein wenig hacky werden und etwas Ähnliches tun, wie es in dieser Frage vorgeschlagen wurde .
17.

8
Warnung vor autoSizeColumn , dafür muss Java Font verfügbar sein. Dies ist nicht Teil des auf Servern verwendeten kopflosen Java JRE und löst eine NullPointerException aus.
Stephen Dillon

@StephenDillon Haben Sie eine Idee, wie Sie den Nullzeiger für die Schriftartkonfiguration korrigieren können?
Veeshal

Der beste Weg, den wir gefunden haben, bestand darin, jede Zeile in der Spalte zu durchlaufen, die längste Zeichenlänge zu finden und mit x + zu multiplizieren und einen Puffer hinzuzufügen. X Verwenden Sie Versuch und Irrtum, um zu sehen, was passt, aber es sollte eine durchschnittliche Breite eines Zeichens sein. Ohne Schrift glaube ich nicht, dass man es tatsächlich richtig machen kann, aber wir kommen uns ziemlich nahe. Andernfalls können Sie ein Excel-Makro hinzufügen, um es beim ersten Öffnen durch den Benutzer zu beheben. Dies war die beste Methode, erfordert jedoch die Aktivierung von Makros
Stephen Dillon,

45

Tipp: Um die automatische Größe Arbeit zu machen, um der Anruf sheet.autoSizeColumn(columnNumber)gemacht werden soll , nachdem bevölkerte die Daten in die Excel.

Das Aufrufen der Methode vor dem Auffüllen der Daten hat keine Auswirkung.


stackoverflow.com/questions/37069820/… manchmal funktioniert das nicht
user7856586

Die hier angegebene Antwort bezieht sich auf Java, während sich der im Kommentar angegebene Link auf Android bezieht. Die Antwort funktioniert immer noch in allen Java-Fällen (mit Ausnahme von Headless-Java-JREs, für die die Java-Schriftart nicht verfügbar ist).
Unni Kris

danke, ich habe func berechnet und setColumnWidth folgendermaßen verwendet: (5 until row.lastCellNum).forEach { colNum -> val columnWidth = (row.getCell(colNum).toString().length * 0.44 + 2.24) * 768 reportSheet.setColumnWidth(colNum, columnWidth.toInt()) }
user7856586

@ user7856586 können Sie diese Methode für mich etwas detaillierter
ausarbeiten

39

Wenn Sie die Größe aller Spalten in einer Arbeitsmappe automatisch ändern möchten, ist folgende Methode hilfreich:

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 komme NullPointerExceptionan row.cellIterator(). Liegt es daran, dass ich keinen Wert in einer der Zellen habe?
Rakeeee

10

Sie können so etwas ausprobieren:

HSSFSheet summarySheet = wb.createSheet();
summarySheet.setColumnWidth(short column, short width);

Hier sind die Parameter: Spaltennummer im Blatt und seine Breite Die Breiteneinheiten sind jedoch ziemlich klein. Sie können beispielsweise 4000 ausprobieren.


Gut zu wissen, danke! Ich denke, für meinen Zweck, bei dem die Spaltenzeichenfolge möglicherweise dynamisch generiert wird, würde die Methode der automatischen Größenanpassung in den Fall passen.
Miau


5

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 verrückt werden :)


2
sheet.setColumnWidth (columnIndex, width) ist auch eine Methode, die Sie sich ansehen möchten
Mateen

3

Wenn Sie die Anzahl Ihrer Spalten kennen (zB entspricht dies 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((columnIndex) -> sheet.autoSizeColumn(columnIndex));

1

Ich benutze unten einfache Lösung:

Dies ist Ihre Arbeitsmappe und Ihr Arbeitsblatt:

XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("YOUR Workshhet");

Fügen Sie dann Ihrem Blatt Daten mit Spalten und Zeilen hinzu. Wenn Sie mit dem Hinzufügen von Daten zum Blatt fertig sind, schreiben Sie den folgenden Code in die autoSizeColumnBreite.

for (int columnIndex = 0; columnIndex < 15; columnIndex++) {
                    sheet.autoSizeColumn(columnIndex);
                }

Hier fügen Sie statt 15 die Anzahl der Spalten in Ihrem Blatt hinzu.

Hoffe jemand hilft das.


0

Es ist sehr einfach, verwenden Sie diesen einzeiligen Code dataSheet.autoSizeColumn (0)

oder geben Sie die Anzahl der Spalten in Klammern an dataSheet.autoSizeColumn (Zellennummer)


0

Sie können den Text auch umbrechen. PFB-Beispielcode:

CellStyle wrapCellStyle = new_workbook.createCellStyle();
                    wrapCellStyle.setWrapText(true);

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.