2012-05-27 27 views
10

Estoy tratando de aplicar un estilo de celda a los woekbooks defferent. Funciona bien, cuando lo aplico al primer libro de trabajo, pero cuando intento hacer esto con el segundo y el siguiente libro de trabajo, no se aplica ningún estilo y se lanza la siguiente excepción.apache poi aplica un estilo a diferentes libros de trabajo

Exception in thread "Thread-3" java.lang.IllegalArgumentException: This Style does not belong to the supplied Workbook Stlyes Source. Are you trying to assign a style from one workbook to the cell of a differnt workbook? 
    at org.apache.poi.xssf.usermodel.XSSFCellStyle.verifyBelongsToStylesSource(XSSFCellStyle.java:118) 
    at org.apache.poi.xssf.usermodel.XSSFCell.setCellStyle(XSSFCell.java:500) 
    at CoreLayer.ExportManager.ExcelExproter.applyStyle(ExcelExproter.java:224) 
    at CoreLayer.ExportManager.ExcelExproter.groupSchedule(ExcelExproter.java:47) 
    at UILayer.ExportDialog$ExportWorker.run(ExportDialog.java:111) 
    at java.lang.Thread.run(Thread.java:722) 

El siguiente código se utiliza:

public void professorSchedule(Professor professor) { 
     Workbook wb = new XSSFWorkbook(); 
     Sheet sheet = wb.createSheet(TextConstants.SCHEDULE); 
     String safeName = WorkbookUtil.createSafeSheetName(professor.toString() + ".xlsx"); 

     LinkedHashMap<ScheduleSlot, Lesson> professorSchedule = data.getSchedule().getProfessorSchedule(professor); 
     fillProfessorSchedule(sheet, professorSchedule); 

     applyStyle(wb, sheet); 
     try { 
      FileOutputStream fileOutputStream = new FileOutputStream(settings.getSchedulesPath() + safeName); 
      wb.write(fileOutputStream); 
      fileOutputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void applyStyle(Workbook wb, Sheet sheet) { 
     CellStyle style = wb.createCellStyle(); 
     style.setWrapText(true); 

     int columnNumber = 0; 
     sheet.autoSizeColumn(columnNumber); 
     for (Row row : rows) { 
      for (Cell cell : row) { 
       cell.setCellStyle(style); 
       sheet.setColumnWidth(columnNumber++, 5000); 
      } 
     } 
    } 

Gracias a todos por adelantado!

Respuesta

16

No puede hacer eso, los objetos CellStyle son específicos de un libro de trabajo. Son objetos bastante profundos, y gran parte del estilo se mantiene en el libro de trabajo, por lo que no puede simplemente volver a usar. ¡Incluso obtienes una excepción útil que te explica esto!

Lo que debe hacer en su lugar es usar el método cloneStyleFrom(CellStyle) para copiar los detalles del estilo. Algo como:

Workbook wb = WorkbookFactory.create(new File("existing.xls")); 
CellStyle origStyle = wb.getCellStyleAt(1); // Or from a cell 

Workbook newWB = new XSSFWorkbook(); 
Sheet sheet = newWB.createSheet(); 
Row r1 = sheet.createRow(0); 
Cell c1 = r1.createCell(0); 

CellStyle newStyle = newWB.createCellStyle(); 
newStyle.cloneStyleFrom(origStyle); 
c1.setCellStyle(newStyle); 

newWB.write(new FileOutpuStream("new.xlsx")); 
+0

pero como puede ver, creo un nuevo estilo para cada libro. En realidad, no sé si hay estilos creados y no creo que el enfoque que proporcionaste sea adecuado para mi caso. Entonces, ¿es posible crear un nuevo estilo para cada libro? ¿Y el error que tiene mi código? Muchas gracias por su ayuda. –

+3

Debe asegurarse de usar solo un estilo con el libro de trabajo para el que lo creó. Puede crear estilos una vez por libro de trabajo (y seguimiento!), O crear/cargarlo para un libro de trabajo y clonarlo más tarde – Gagravarr

Cuestiones relacionadas