使用Java 拷贝sheet 到其他excel上

使用Java 拷贝sheet 到其他excel上

话不多说直接上代码,大家自己理解即可,代码比较简单
我都加上了注释,方便理解

    /**
     * 拷贝Excel工作表的方法。
     *
     * @param 
     * @throws Exception 如果发生错误则抛出异常
     */
    public void copySheet() throws Exception {
        // 获取日志记录器实例
        Logger logger = Logger.getLogger("copySheet");
        logger.info("开始拷贝sheet");

        // 设置ZipSecureFile的最小解压比率,防止某些压缩文件导致内存溢出
        ZipSecureFile.setMinInflateRatio(0.001);

        // 获取要复制的工作表名称
        String sheetName = "sheet";
        // 获取源Excel文件路径
        String sourceExcelFilePath = "source.xlsx";
        // 获取目标Excel文件路径
        String targetExcelFilePath = "target.xlsx";

        try (
            // 打开源Excel文件输入流
            FileInputStream sourceFis = new FileInputStream(sourceExcelFilePath);
            // 创建源Workbook对象
            Workbook sourceWorkbook = new XSSFWorkbook(sourceFis);
            // 打开目标Excel文件输入流
            FileInputStream targetFis = new FileInputStream(targetExcelFilePath);
            // 创建目标Workbook对象
            Workbook targetWorkbook = new XSSFWorkbook(targetFis)
        ) {
            // 获取源工作表(这里假设只处理第一个工作表)
            Sheet sourceSheet = sourceWorkbook.getSheetAt(0);
            if (sourceSheet == null) {
                logger.info("没有找到源sheet");
                throw new Exception("没有找到源sheet");
            }

            // 检查目标工作簿中是否已经存在同名的工作表
            Sheet ifExist = targetWorkbook.getSheet(sheetName);
            if (ifExist != null) {
                logger.info("Sheet '" + sheetName + "' 已经存在");
                throw new Exception("Sheet '" + sheetName + "' 已经存在");
            }

            // 在目标工作簿中创建新的工作表
            Sheet targetSheet = targetWorkbook.createSheet(sheetName);

            // 遍历源工作表的所有行并逐行复制到目标工作表
            for (int i = 0; i <= sourceSheet.getLastRowNum(); i++) {
                Row sourceRow = sourceSheet.getRow(i);
                if (sourceRow != null) {
                    Row targetRow = targetSheet.createRow(i);
                    copyRow(sourceWorkbook, targetWorkbook, sourceSheet, targetSheet, sourceRow, targetRow);
                }
            }

            // 将更改写回到目标Excel文件
            try (FileOutputStream fos = new FileOutputStream(targetExcelFilePath)) {
                targetWorkbook.write(fos);
            }

            logger.info("Sheet '" + sheetName + "' 复制成功");
        }
    }

    /**
     * 复制单个行及其单元格的内容和样式。
     *
     * @param sourceWorkbook 源工作簿
     * @param targetWorkbook 目标工作簿
     * @param sourceSheet 源工作表
     * @param targetSheet 目标工作表
     * @param sourceRow 源行
     * @param targetRow 目标行
     */
    private static void copyRow(Workbook sourceWorkbook, Workbook targetWorkbook,
                               Sheet sourceSheet, Sheet targetSheet,
                               Row sourceRow, Row targetRow) {

        // 设置ZipSecureFile的最小解压比率,防止某些压缩文件导致内存溢出
        ZipSecureFile.setMinInflateRatio(0.001);

        // 遍历源行中的所有单元格并逐个复制到目标行
        for (Cell sourceCell : sourceRow) {
            Cell targetCell = targetRow.createCell(sourceCell.getColumnIndex());
            copyCell(sourceWorkbook, targetWorkbook, sourceSheet, targetSheet, sourceCell, targetCell);
        }
    }

    /**
     * 复制单个单元格的内容和样式。
     *
     * @param sourceWorkbook 源工作簿
     * @param targetWorkbook 目标工作簿
     * @param sourceSheet 源工作表
     * @param targetSheet 目标工作表
     * @param sourceCell 源单元格
     * @param targetCell 目标单元格
     */
    private static void copyCell(Workbook sourceWorkbook, Workbook targetWorkbook,
                                Sheet sourceSheet, Sheet targetSheet,
                                Cell sourceCell, Cell targetCell) {
        // 设置ZipSecureFile的最小解压比率,防止某些压缩文件导致内存溢出
        ZipSecureFile.setMinInflateRatio(0.001);

        // 根据源单元格的数据类型设置目标单元格的内容
        switch (sourceCell.getCellType()) {
            case STRING:
                targetCell.setCellValue(sourceCell.getStringCellValue());
                break;
            case NUMERIC:
                targetCell.setCellValue(sourceCell.getNumericCellValue());
                break;
            case BOOLEAN:
                targetCell.setCellValue(sourceCell.getBooleanCellValue());
                break;
            case FORMULA:
                targetCell.setCellFormula(sourceCell.getCellFormula());
                break;
            default:
                break;
        }

        // 复制源单元格的样式到目标单元格
        CellStyle newCellStyle = targetWorkbook.createCellStyle();
        newCellStyle.cloneStyleFrom(sourceCell.getCellStyle());
        targetCell.setCellStyle(newCellStyle);
    }
可以使用 Apache POI 库中的 Workbook 类的 createSheet() 方法和 cloneSheet() 方法来实现拷贝其他 Excel 文件中的 sheet 到本 Excel 文件中。 首先,需要使用 POI 库打开目标 Excel 文件和源 Excel 文件: ```java // 打开目标 Excel 文件 Workbook targetWorkbook = WorkbookFactory.create(new FileInputStream("target.xlsx")); // 打开源 Excel 文件 Workbook sourceWorkbook = WorkbookFactory.create(new FileInputStream("source.xlsx")); ``` 然后,可以使用 createSheet() 方法在目标 Excel 文件中创建新的 sheet: ```java // 在目标 Excel 文件中创建新的 sheet Sheet newSheet = targetWorkbook.createSheet("New Sheet"); ``` 接下来,可以使用 cloneSheet() 方法将源 Excel 文件中的 sheet 拷贝到新创建的 sheet 中: ```java // 拷贝Excel 文件中的 sheet 到新创建的 sheetSheet sourceSheet = sourceWorkbook.getSheetAt(0); // 假设源文件中第一个 sheet 是需要拷贝的 int sourceSheetIndex = sourceWorkbook.getSheetIndex(sourceSheet); targetWorkbook.cloneSheet(sourceSheetIndex, newSheet); ``` 最后,需要将修改后的目标 Excel 文件保存: ```java // 保存目标 Excel 文件 targetWorkbook.write(new FileOutputStream("target.xlsx")); targetWorkbook.close(); ``` 完整示例代码如下: ```java import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.usermodel.Sheet; public class ExcelCopySheetExample { public static void main(String[] args) throws Exception { // 打开目标 Excel 文件 Workbook targetWorkbook = WorkbookFactory.create(new FileInputStream("target.xlsx")); // 打开源 Excel 文件 Workbook sourceWorkbook = WorkbookFactory.create(new FileInputStream("source.xlsx")); // 在目标 Excel 文件中创建新的 sheet Sheet newSheet = targetWorkbook.createSheet("New Sheet"); // 拷贝Excel 文件中的 sheet 到新创建的 sheetSheet sourceSheet = sourceWorkbook.getSheetAt(0); // 假设源文件中第一个 sheet 是需要拷贝的 int sourceSheetIndex = sourceWorkbook.getSheetIndex(sourceSheet); targetWorkbook.cloneSheet(sourceSheetIndex, newSheet); // 保存目标 Excel 文件 targetWorkbook.write(new FileOutputStream("target.xlsx")); targetWorkbook.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值