2012-05-27 3 views
10

Я пытаюсь применить один стиль ячейки к разным woekbooks. Он работает хорошо, когда я применяю его к первой книге, но когда я пытаюсь сделать это со второй и следующей книгами - ни один стиль не применяется и исключается следующее исключение.apache poi применить один стиль к разным книгам

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) 

Следующий код используются:

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

Спасибо всего заранее!

ответ

16

Вы не можете этого сделать, объекты CellStyle относятся к одной книге. Они довольно глубокие объекты, и большая часть стиля хранится в книге, поэтому вы не можете просто повторно использовать. Вы даже получаете полезное исключение, которое объясняет это вам!

Что вам нужно сделать, это использовать метод cloneStyleFrom(CellStyle), чтобы скопировать детали стиля. Что-то вроде:

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

но, как вы можете видеть, я создаю новый стиль для каждой книги. На самом деле я не знаю, создаются ли стили, и я не думаю, что предоставленный qpproach подходит для моего дела. Можно ли просто создать новый стиль для каждой книги? И какова ошибка моего кода? Большое спасибо за Вашу помощь. –

+3

Вам нужно убедиться, что вы используете только стиль с книгой, для которой вы ее создали. Вы можете создавать стили один раз на одну книгу (и отслеживать!) Или создавать/загружать ее для одной книги и клонировать ее позже – Gagravarr

Смежные вопросы