Apache POI Excel: come configurare le colonne da espandere?


98

Sto usando Apache POI APIper generare excel spreadsheetper produrre alcuni dati.

Il problema che sto affrontando è quando il foglio di calcolo viene creato e aperto, le colonne non vengono espanse in modo che del testo lungo come il testo formattato in data non venga visualizzato a prima vista.

Potrei semplicemente fare doppio clic sul bordo della colonna in Excel per espandere o trascinare il bordo per regolare la larghezza della colonna, ma potrebbero esserci più di 20 colonne e non c'è modo che io voglia farlo manualmente ogni volta che apro il foglio di calcolo :(

Ho scoperto (anche se potrebbe essere un metodo sbagliato) groupRow()e setColumnGroupCollapsed()potrei essere in grado di fare il trucco ma senza fortuna. Forse lo sto usando in modo sbagliato.

Esempio di frammento di codice

        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");

Quando viene creato questo foglio di calcolo, la stringa "Looooooong non deve essere visualizzato per primo" è nella cella ma poiché la colonna non è espansa viene visualizzato solo "Loooooooo".

Come posso configurarlo in modo che quando apro il mio foglio di calcolo, la colonna sia già espansa ???



Sembra che tu stia cercando un modo per utilizzare i POI per farlo. Ma per farlo semplicemente in Excel seleziona l'intero foglio e fai doppio clic sul limite dell'intestazione della colonna AB. Se è necessario eseguire questa operazione su più fogli, una soluzione codificata potrebbe essere più utile.
media

Risposte:


173

Dopo aver aggiunto tutti i tuoi dati al foglio, puoi chiamare autoSizeColumn(int column)il tuo foglio per adattare automaticamente le colonne alla dimensione corretta

Ecco un collegamento all'API .

Vedere questo post per ulteriori riferimenti Problema nell'adattare la dimensione della cella di Excel alla dimensione del contenuto quando si utilizza apache poi


7
Volevo solo sottolineare che autoSizeColumnnon si ridimensiona bene e sarà super lento se hai molte righe. Ho dovuto diventare un po 'hacky e fare qualcosa di simile a quanto suggerito in questa domanda .
lbstr

8
Avviso su autoSizeColumn , questo richiede che il carattere java sia disponibile. Questo non fa parte del java java headless utilizzato sui server e genererà una NullPointerException.
Stephen Dillon

@StephenDillon Qualche idea su come correggere il puntatore nullo per la configurazione dei caratteri?
Veeshal

Il modo migliore che abbiamo trovato è stato quello di ripetere ogni riga nella colonna, trovare la lunghezza del carattere più lunga e moltiplicare per x + aggiungere un buffer. X usa tentativi ed errori per vedere cosa si adatta ma dovrebbe essere una larghezza media di un carattere. Senza font non credo che tu possa effettivamente farlo bene, ma ci siamo molto vicini. Altrimenti puoi aggiungere una macro per eccellere per risolverlo tutto la prima volta che l'utente lo apre, questo era il metodo migliore ma richiede che le macro siano abilitate
Stephen Dillon

45

Suggerimento: per far funzionare la dimensione automatica, la chiamata a sheet.autoSizeColumn(columnNumber)deve essere effettuata dopo aver inserito i dati in Excel.

Chiamare il metodo prima di popolare i dati non avrà alcun effetto.



La risposta fornita qui è relativa a Java, mentre il collegamento fornito nel commento è relativo ad Android. La risposta funziona ancora in tutti i casi Java (ad eccezione dei JRE java headless che non hanno il carattere java disponibile).
Unni Kris

grazie, ho calcolato func e usato setColumnWidth nel modo seguente: (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 puoi elaborare questo metodo in modo un po 'più dettagliato per me
Mehroz Mustafa,

39

Se desideri ridimensionare automaticamente tutte le colonne in una cartella di lavoro, ecco un metodo che potrebbe essere utile:

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);
            }
        }
    }
}

Io sono sempre NullPointerExceptiona row.cellIterator(). È perché non ho alcun valore in una delle celle?
rakeeee

10

Puoi provare qualcosa di simile:

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

Qui i parametri sono: numero di colonna nel foglio e la sua larghezza Ma, le unità di larghezza sono piuttosto piccole, puoi provare 4000 per esempio.


Buono a sapersi grazie! Penso che per il mio scopo in cui la stringa della colonna potrebbe essere generata dinamicamente, il metodo di ridimensionamento automatico si adatterebbe al caso.
Miao


5

codice di esempio di seguito

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");

// questo è fondamentale

sheet.autoSizeColumn(0);

// l'argomento deve essere il numero di cella

cell = row.createCell(1);
cell.setCellValue("a big name without auto size feature enabled");

Controlla l'output e impazzisci :)


2
sheet.setColumnWidth (columnIndex, width) è anche un metodo a cui vuoi dare un'occhiata
Mateen

3

Se conosci il conteggio delle tue colonne (ad esempio è uguale a un elenco di raccolte). Puoi semplicemente usare questo liner per regolare tutte le colonne di un foglio (se usi almeno java 8):

IntStream.range(0, columnCount).forEach((columnIndex) -> sheet.autoSizeColumn(columnIndex));

1

Uso la seguente semplice soluzione:

Questa è la tua cartella di lavoro e il tuo foglio:

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

quindi aggiungi i dati al tuo foglio con colonne e righe. Una volta terminato di aggiungere i dati al foglio, scrivere il seguente codice in autoSizeColumnlarghezza.

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

Qui, invece di 15, aggiungi il numero di colonne nel tuo foglio.

Spero che qualcuno lo aiuti.


0

È molto semplice, usa questo codice di una riga dataSheet.autoSizeColumn (0)

o fornire il numero di colonna nella parentesi dataSheet.autoSizeColumn (numero di cella)


0

Puoi anche avvolgere il testo. Codice di esempio PFB:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.