Đây là việc triển khai sao chép trang tính từ sổ làm việc này sang sổ làm việc khác. Giải pháp này làm việc cho tôi. Mã này sẽ hoạt động nếu các trang tính không có bảng, vv Nếu các trang tính chứa văn bản đơn giản (String, boolean, int, v.v.), các công thức, giải pháp này sẽ hoạt động.
Workbook oldWB = new XSSFWorkbook(new FileInputStream("C:\\input.xlsx"));
Workbook newWB = new XSSFWorkbook();
CellStyle newStyle = newWB.createCellStyle(); // Need this to copy over styles from old sheet to new sheet. Next step will be processed below
Row row;
Cell cell;
for (int i = 0; i < oldWB.getNumberOfSheets(); i++) {
XSSFSheet sheetFromOldWB = (XSSFSheet) oldWB.getSheetAt(i);
XSSFSheet sheetForNewWB = (XSSFSheet) newWB.createSheet(sheetFromOldWB.getSheetName());
for (int rowIndex = 0; rowIndex < sheetFromOldWB.getPhysicalNumberOfRows(); rowIndex++) {
row = sheetForNewWB.createRow(rowIndex); //create row in this new sheet
for (int colIndex = 0; colIndex < sheetFromOldWB.getRow(rowIndex).getPhysicalNumberOfCells(); colIndex++) {
cell = row.createCell(colIndex); //create cell in this row of this new sheet
Cell c = sheetFromOldWB.getRow(rowIndex).getCell(colIndex, Row.CREATE_NULL_AS_BLANK); //get cell from old/original WB'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.
if (c.getCellType() == Cell.CELL_TYPE_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("who");
break;
default:
System.out.println();
}
}
}
}
}
//Write over to the new file
FileOutputStream fileOut = new FileOutputStream("C:\\output.xlsx");
newWB.write(fileOut);
oldWB.close();
newWB.close();
fileOut.close();
Nếu yêu cầu của bạn là sao chép toàn bộ trang tính mà không cần thoát hoặc thêm bất kỳ thứ gì. Tôi nghĩ rằng quá trình loại bỏ hoạt động tốt hơn và nhanh hơn sau đó mã trên. Và bạn không phải lo lắng về việc mất công thức, bản vẽ, bảng, kiểu, phông chữ, v.v.
XSSFWorkbook wb = new XSSFWorkbook("C:\\abc.xlsx");
for (int i = wb.getNumberOfSheets() - 1; i >= 0; i--) {
if (!wb.getSheetName(i).contentEquals("January")) //This is a place holder. You will insert your logic here to get the sheets that you want.
wb.removeSheetAt(i); //Just remove the sheets that don't match your criteria in the if statement above
}
FileOutputStream out = new FileOutputStream(new File("C:\\xyz.xlsx"));
wb.write(out);
out.close();
Nguồn
2016-12-21 04:47:15
[Link] này (http://www.coderanch.com/t/420958/open-source/Copying-sheet-excel-file-another) sẽ hữu ích: – hkansal
@hkansal liên kết mà tôi tìm thấy khi tôi đang googling. Tôi phải đối mặt với một vấn đề với mã được đưa ra trong liên kết đó, khi ô được nhóm theo nhóm khôn ngoan như A1: A4, nó hiển thị lỗi giống như vùng trùng nhau chồng chéo, tôi không thể đăng trả lời trong liên kết đó. Nó thực sự tốt. –