apache poi将一种风格应用于不同的工作簿

我正尝试将一种单元格样式应用于不同的woekbook。 它运行良好,当我将它应用到第一个工作簿,但是当我试图用第二个和下一个工作簿来做到这一点 – 没有应用样式,并引发下面的exception。

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

谢谢大家提前!

你不能这样做,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"));