2011-01-06 21 views
68

Sto utilizzando Apache POI API per generare excel spreadsheet per l'output di alcuni dati.POI Apache Excel: come configurare le colonne da espandere?

Il problema che sto affrontando è quando il foglio di calcolo viene creato e aperto, le colonne non vengono espanse in modo che alcuni testi lunghi come il testo formattato per Data non vengano visualizzati a prima vista.

Posso 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 è possibile che lo faccia manualmente ogni volta che apro il foglio di calcolo: (

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

codice di esempio frammento

 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 questo foglio di calcolo viene creato, la stringa "Looooooong text not to show first" è nella cella ma poiché la colonna non è espansa, viene visualizzato solo "Loooooooo".

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

+0

http://stackoverflow.com/questions/20190317/apache-poi-excel-big- auto-column-width – gavenkoa

+0

Sembra che tu stia cercando un modo per utilizzare POI per raggiungere questo obiettivo. Ma per farlo semplicemente in Excel selezionare l'intero foglio e fare doppio clic sul bordo di intestazione della colonna A-B. Se hai bisogno di fare questo a diversi fogli, una soluzione codificata può servire meglio. – avg

risposta

126

Dopo aver aggiunto tutti i dati al foglio, è possibile chiamare autoSizeColumn(int column) sul foglio su Adatta le colonne per la dimensione corretta

Ecco un link al API.

Vedi questo post per ulteriori riferimento Problem in fitting the excel cell size to the size of the content when using apache poi

+3

Volevo solo sottolineare che 'autoSizeColumn' non scala bene e sarà * super * lento se ci sono molte righe. Ho dovuto ottenere un po 'di hacky e fare qualcosa di simile a ciò che è stato suggerito [in questa domanda] (http://stackoverflow.com/questions/18983203/how-to-speed-up-autosizing-columns-in-apache-poi). – lbstr

+3

** Avviso su ** * autoSizeColumn *, questo richiede che il carattere java sia disponibile. Questo non fa parte del java java senza testa utilizzato sui server e genererà una NullPointerException. –

5

si può provare qualcosa di simile:

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

Qui parametri sono: numero di colonna in lamiera e la sua larghezza Ma, le unità di larghezza sono piuttosto piccole, si può provare 4000, per esempio.

+0

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

36

Suggerimento: per rendere il lavoro automatico delle dimensioni, la chiamata a sheet.autoSizeColumn(columnNumber) dovrebbe essere fatta dopo popolano i dati in Excel.

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

8

Per Excel POI:

sheetName.autoSizeColumn(cellnum); 
4

codice di esempio riportato 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 è cruciale

sheet.autoSizeColumn(0); 

// argomento deve essere il numero di cellule

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

controllare l'output e impazzire :)

+2

sheet.setColumnWidth (columnIndex, width) è anche un metodo che vuoi dare un'occhiata – Mateen

18

Se volete automatico delle dimensioni 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(0); 
      Iterator<Cell> cellIterator = row.cellIterator(); 
      while (cellIterator.hasNext()) { 
       Cell cell = cellIterator.next(); 
       int columnIndex = cell.getColumnIndex(); 
       sheet.autoSizeColumn(columnIndex); 
      } 
     } 
    } 
} 
-1

È possibile utilizzare setColumnWidth() se si desidera per espandere la tua cella di più.

0

E 'molto semplice, utilizzare questo codice di una riga dataSheet.autoSizeColumn (0)

o dare il numero di colonna nella staffa dataSheet.autoSizeColumn (numero di cellule)

0

Se si conosce il numero di le tue colonne (è uguale a un elenco di raccolte). Si può semplicemente utilizzare questo uno di linea per regolare tutte le colonne di un foglio (se si utilizza almeno java 8):

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