如何使用Apache POI和Java将Excel工作簿中的Excel工作表复制到另一个工作簿?

我试图将一个格式化的Excel工作表从一个工作簿复制到另一个包含合并的单元格,字体大小,字体颜色,字体的面。

我能够将所有工作表从多个Excel工作簿复制到一个工作簿,但我无法获得格式。 请帮忙

import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Workbook; public class CopyExcelSheets { public static void main(String args[]) throws IOException { //Excel sheet names to read from String [] excelSheets = {"Crystal1.xls","Crystal2.xls","Crystal3.xls","Crystal4.xls","Crystal5Complex.xls"}; //Root folder from where the excel files are read final String ROOT_FOLDER = "C:\\demo\\shaji\\"; //Output file name for merged excel file (consolidated file) final String OUTPUT_FILE = "C:\\demo\\shaji\\mergedOutput.xls"; Workbook [] workbook = new Workbook[excelSheets.length]; for(int i = 0; i < excelSheets.length; i++) { workbook[i] = new HSSFWorkbook(new FileInputStream(ROOT_FOLDER + excelSheets[i])); } Workbook newWorkbook = new HSSFWorkbook(); for(int i = 0; i < excelSheets.length; i++) { newWorkbook = CopyExcelSheets.copy(workbook[i], newWorkbook, "Book-" + i); } //Write over to the new file FileOutputStream fileOut; fileOut = new FileOutputStream(OUTPUT_FILE); newWorkbook.write(fileOut); for(int i = 0; i < excelSheets.length; i++) { workbook[i].close(); } newWorkbook.close(); fileOut.close(); } /* * Based on the implementation by Faraz Durrani on Stackoveflow * http://stackoverflow.com/questions/3333021/how-to-copy-one-workbook-sheet-to-another-workbook-sheet-using-apache-poi-and-ja */ public static Workbook copy(Workbook oldWorkbook, Workbook newWorkbook, String bookName) throws IOException { // Need this to copy over styles from old sheet to new sheet. Next step will be processed below CellStyle newStyle = newWorkbook.createCellStyle(); Row row; Cell cell; for (int i = 0; i < oldWorkbook.getNumberOfSheets(); i++) { HSSFSheet sheetFromOldWorkbook = (HSSFSheet) oldWorkbook.getSheetAt(i); HSSFSheet sheetForNewWorkbook = (HSSFSheet) newWorkbook.createSheet(bookName + "-" + sheetFromOldWorkbook.getSheetName()); for (int rowIndex = 0; rowIndex < sheetFromOldWorkbook.getPhysicalNumberOfRows(); rowIndex++) { row = sheetForNewWorkbook.createRow(rowIndex); //create row in this new sheet for (int colIndex = 0; colIndex < sheetFromOldWorkbook.getRow(rowIndex).getPhysicalNumberOfCells(); colIndex++) { cell = row.createCell(colIndex); //create cell in this row of this new sheet //get cell from old/original Workbook's sheet and when cell is null, return it as blank cells. //And Blank cell will be returned as Blank cells. That will not change. Cell c = sheetFromOldWorkbook.getRow(rowIndex).getCell(colIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK ); if (c.getCellTypeEnum() == CellType.BLANK){ //System.out.println("This is BLANK " + ((XSSFCell) c).getReference()); } else { //Below is where all the copying is happening. //First it copies the styles of each cell and then it copies the content. CellStyle origStyle = c.getCellStyle(); newStyle.cloneStyleFrom(origStyle); cell.setCellStyle(newStyle); switch (c.getCellTypeEnum()) { case STRING: cell.setCellValue(c.getRichStringCellValue().getString()); break; case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { cell.setCellValue(c.getDateCellValue()); } else { cell.setCellValue(c.getNumericCellValue()); } break; case BOOLEAN: cell.setCellValue(c.getBooleanCellValue()); break; case FORMULA: cell.setCellValue(c.getCellFormula()); break; case BLANK: cell.setCellValue(""); break; default: System.out.println(); } } } } } return newWorkbook; } }