2011-01-06 30 views
68

Estoy usando Apache POI API para generar excel spreadsheet para generar algunos datos.Apache POI Excel: cómo configurar columnas para expandir?

El problema al que me enfrento es cuando se crea y abre la hoja de cálculo, las columnas no se expanden, por lo que algunos textos largos como el texto con formato de fecha no se muestran a primera vista.

Podría simplemente hacer doble clic en el borde de la columna en excel para expandir o arrastrar el borde para ajustar el ancho de la columna, pero podría haber más de 20 columnas y no hay manera de hacerlo manualmente cada vez que abra la hoja de cálculo: (

descubrí (aunque podría ser un método equivocado) groupRow() y setColumnGroupCollapsed() podría ser capaz de hacer el truco, pero sin suerte. Tal vez lo estoy usando en el camino equivocado.

fragmento de código de ejemplo

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

Cuando se crea esta hoja de cálculo, la cadena "Looooooong text to to the first" está en la celda pero como la columna no está expandida, solo aparece "Loooooooo".

¿Cómo puedo configurarlo para que cuando abra mi hoja de cálculo, la columna ya esté expandida?

+0

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

+0

Parece que está buscando una forma de usar POI para lograr esto. Pero para hacerlo simplemente en Excel, seleccione la hoja completa y haga doble clic en el límite del encabezado de la columna A-B. Si necesita hacer esto en varias hojas, una solución codificada puede servirle mejor. – avg

Respuesta

126

Después que haya agregado todos los datos a la hoja, puede llamar autoSizeColumn(int column) en su hoja de Autofit las columnas al tamaño adecuado

Aquí hay un enlace a la API.

Ver este post para más referencia Problem in fitting the excel cell size to the size of the content when using apache poi

+3

Solo quería señalar que 'autoSizeColumn' no se escala bien y será * super * lento si tiene muchas filas. Tenía que ser un poco hacky y hacer algo similar a lo que se sugirió [en esta pregunta] (http://stackoverflow.com/questions/18983203/how-to-speed-up-autosizing-columns-in-apache-poi) – lbstr

+3

** Advertencia sobre ** * autoSizeColumn *, esto requiere que la fuente java esté disponible. Esto no es parte de java jre sin cabeza usada en servidores y arrojará una NullPointerException. –

5

Usted puede intentar algo como esto:

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

Aquí params son: número de columna en la hoja y su anchura embargo, las unidades de ancho son bastante pequeñas, se puede tratar, por ejemplo, 4000.

+0

¡Es bueno saber gracias! Creo que para mi propósito, donde la columna de la columna podría generarse dinámicamente, el método de auto-tamaño encajaría en el caso. –

36

Consejo: para hacer el trabajo de tamaño automático, la llamada a sheet.autoSizeColumn(columnNumber) debe hacerse después de poblar los datos en el Excel.

Llamar al método antes de rellenar los datos, no tendrá ningún efecto.

8

Para Excel PDI:

sheetName.autoSizeColumn(cellnum); 
4

código de ejemplo siguiente

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

// Esto es crucial

sheet.autoSizeColumn(0); 

// argumento debe ser el número de células

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

comprobar la salida y se vuelven locos :)

+2

sheet.setColumnWidth (columnIndex, width) es también un método que desea ver – Mateen

18

Si desea tamaño automático todas las columnas en un libro, que aquí es un método que podría ser útil:

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

Puede utilizar setColumnWidth() si quieres para expandir más tu celular

0

Es muy simple, utilice el código de una línea dataSheet.autoSizeColumn (0)

o dar el número de la columna en el soporte dataSheet.autoSizeColumn (número de células)

0

Si conoce el recuento de sus columnas (si es igual a una lista de colección). Simplemente puede utilizar este un trazador de líneas para ajustar todas las columnas de una hoja (si se utiliza al menos java 8):

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