2012-05-27 15 views
10

Ich versuche, einen Zellenstil auf verschiedene Woekbooks anzuwenden. Es funktioniert gut, wenn ich es auf die erste Arbeitsmappe anwende, aber wenn ich versuche, dies mit der zweiten und nächsten Arbeitsmappe zu tun - es wird kein Stil angewendet und die folgende Ausnahme wird ausgelöst.Apache Poi wenden Sie einen Stil auf verschiedene Arbeitsmappen an

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) 

Der folgende Code verwendet:

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

Vielen Dank allen im Voraus!

Antwort

16

Das ist nicht möglich, CellStyle-Objekte sind spezifisch für eine Arbeitsmappe. Es sind ziemlich tiefe Objekte, und ein Großteil des Stils ist in der Arbeitsmappe enthalten, sodass Sie sie nicht einfach wiederverwenden können. Sie erhalten sogar eine hilfreiche Ausnahme, die Ihnen dies erklärt!

Was Sie stattdessen tun müssen, ist die Methode, um die Details des Stils zu kopieren. Etwas wie:

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

aber wie Sie sehen können, erstelle ich einen neuen Stil für jedes Buch. Eigentlich weiß ich nicht, ob es irgendwelche Stile gibt und ich denke nicht, dass das von Ihnen zur Verfügung gestellte Programm für meinen Fall geeignet ist. Ist es möglich, für jedes Buch einen neuen Stil zu erstellen? Und was ist der Fehler meines Codes? Vielen Dank für Ihre Hilfe. –

+3

Sie müssen sicherstellen, dass Sie nur einen Stil mit der Arbeitsmappe verwenden, für die Sie sie erstellt haben. Sie können Styles entweder einmal pro Arbeitsmappe erstellen (und nachverfolgen) oder sie für eine Arbeitsmappe erstellen/laden und sie später klonen – Gagravarr

Verwandte Themen