2012-05-27 27 views
10

私は1つのセルスタイルを適用してwoekbooksを定義しようとしています。最初のワークブックに適用するとうまくいきますが、2番目と次のワークブックでこれを実行しようとしているときにスタイルが適用されず、次の例外がスローされます。apache poi別のブックに1つのスタイルを適用する

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オブジェクトは1つのブックに固有のものです。それらはかなり深いオブジェクトであり、スタイルの多くはワークブックに保持されているので、再利用することはできません。あなたはこれをあなたに説明する有益な例外を得ることさえできます!

代わりに、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

しかし、わかりましたが、私は各本のための新しいスタイルを作成します。実際に私はスタイルが作成されているかどうかわからないし、あなたが提供した腐敗が私の場合に適しているとは思わない。各本のために新しいスタイルを作成することは可能でしょうか?私のコードには何の誤りがありますか?ご助力ありがとうございます。 –

+3

作成したワークブックでスタイルを使用するようにする必要があります。ブックごとにスタイルを1つ作成(およびトラック!)するか、1つのワークブックに対して作成/ロードして後で複製することができます – Gagravarr

関連する問題