Java将多个excel文件合并到一个excel文件中。

本文介绍了如何在Java项目中,通过Maven引入ApachePOI库,处理多个Excel文件并将第一个工作表复制到一个新的Excel文件中,同时处理合并单元格和样式。
摘要由CSDN通过智能技术生成

maven依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

代码

这里只做了合并多个excel文件中第一个sheet页,多sheet页需要再做循环

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class ExcelCopyExample {

    public static void main(String[] args) {
        List<String> originalFilePathList = new ArrayList();
        originalFilePathList.add("E:/常用文件/测试/20240110/1704702600103-workbook.xlsx");
        originalFilePathList.add("E:/常用文件/测试/20240110/RPT20240107063042_20_1_.xls");
        originalFilePathList.add("E:/常用文件/测试/20240110/RPT20240107063322_20_1_.xls");
        originalFilePathList.add("E:/常用文件/测试/20240110/RPT20240107063810_2_1_.xls");

        FileInputStream originalFile = null;
        Workbook originalWorkbook;
        // 创建新的Excel文件
        // .xls和.xlsx格式在不同版本需要注意是用XSSFWorkbook还是HSSFWorkbook
        Workbook newWorkbook = new XSSFWorkbook(); 

        try {

            for (int i = 0; i < originalFilePathList.size(); i++) {

                String originalFilePath = originalFilePathList.get(i);

                // 读取原始Excel文件
                originalFile = new FileInputStream(originalFilePath);
                
                originalWorkbook = new XSSFWorkbook(originalFile);

                Sheet originalSheet = originalWorkbook.getSheetAt(0);

                Sheet newSheet = newWorkbook.createSheet("Sheet" + i);

                // 复制原始Sheet到新文件(包括内容和样式)
                copySheet(originalSheet, newSheet, newWorkbook);
            }
            // 保存新文件
            try (FileOutputStream fileOut = new FileOutputStream("E:/常用文件/测试/20240110/新文件.xls")) {
                newWorkbook.write(fileOut);
            }

            System.out.println("复制完成");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 在finally块中关闭文件流
            if (originalFile != null) {
                try {
                    originalFile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    private static void copySheet(Sheet source, Sheet target, Workbook newWorkbook) {
        // 处理合并单元格
        for (int i = 0; i < source.getNumMergedRegions(); i++) {
            CellRangeAddress mergedRegion = source.getMergedRegion(i);
            target.addMergedRegion(mergedRegion);
        }

        // 复制内容和样式
        for (int rowNum = 0; rowNum <= source.getLastRowNum(); rowNum++) {
            Row sourceRow = source.getRow(rowNum);
            Row newRow = target.createRow(rowNum);

            if (sourceRow != null) {
                // 复制每个单元格的内容和样式
                for (int colNum = 0; colNum < sourceRow.getLastCellNum(); colNum++) {
                    Cell sourceCell = sourceRow.getCell(colNum, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                    Cell newCell = newRow.createCell(colNum);

                    // 复制内容
                    copyCellValue(sourceCell, newCell);

                    // 复制样式
                    CellStyle newCellStyle = newWorkbook.createCellStyle();
                    newCellStyle.cloneStyleFrom(sourceCell.getCellStyle());
                    newCell.setCellStyle(newCellStyle);

                    // 复制宽度和高度
                    target.setColumnWidth(colNum, source.getColumnWidth(colNum));
                    newRow.setHeight(sourceRow.getHeight());
                }
            }
        }
    }

    private static void copyCellValue(Cell sourceCell, Cell newCell) {
        if (sourceCell == null) {
            return;
        }

        DataFormatter dataFormatter = new DataFormatter();
        String formattedValue = dataFormatter.formatCellValue(sourceCell);

        if (sourceCell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(sourceCell)) {
            // 处理日期格式
            newCell.setCellValue(sourceCell.getDateCellValue());
        } else {
            newCell.setCellValue(formattedValue);
        }
    }
}
  • 13
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!很高兴能为您答问题。对于合并多个Excel文件,可以通过Java的Apache POI库来处理。下面是一个简单的示例代码,可以实现将多个Excel文件合并一个工作表: ``` import java.io.*; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.*; import org.apache.poi.hssf.usermodel.*; public class ExcelMerge { public static void main(String[] args) throws IOException { String[] files = {"file1.xlsx", "file2.xlsx", "file3.xlsx"}; String outputFileName = "merged.xlsx"; // 创建新工作簿 Workbook mergedWorkbook = new XSSFWorkbook(); for (String fileName : files) { // 读取Excel文件 FileInputStream inputStream = new FileInputStream(new File(fileName)); Workbook workbook = null; if (fileName.endsWith(".xlsx")) { workbook = new XSSFWorkbook(inputStream); } else if (fileName.endsWith(".xls")) { workbook = new HSSFWorkbook(inputStream); } // 遍历工作簿的每个工作表 for (int i = 0; i < workbook.getNumberOfSheets(); i++) { Sheet sheet = workbook.getSheetAt(i); // 创建新工作表 Sheet mergedSheet = mergedWorkbook.createSheet(sheet.getSheetName() + "_" + fileName); // 复制工作表数据到新工作表 copySheet(mergedSheet, sheet); } // 关闭输入流 inputStream.close(); } // 输出合并后的文件 FileOutputStream outputStream = new FileOutputStream(outputFileName); mergedWorkbook.write(outputStream); mergedWorkbook.close(); outputStream.close(); } // 复制工作表数据到新工作表 private static void copySheet(Sheet destSheet, Sheet srcSheet) { int rowCount = srcSheet.getLastRowNum() - srcSheet.getFirstRowNum(); for (int i = 0; i <= rowCount; i++) { Row srcRow = srcSheet.getRow(i); Row destRow = destSheet.createRow(i); if (srcRow != null) { int columnCount = srcRow.getLastCellNum() - srcRow.getFirstCellNum(); for (int j = 0; j < columnCount; j++) { Cell srcCell = srcRow.getCell(j); Cell destCell = destRow.createCell(j); if (srcCell != null) { destCell.setCellValue(srcCell.getStringCellValue()); } } } } } } ``` 以上代码将多个Excel文件合并一个工作簿,并且新工作表的名称包含原文件名和工作表名。需要注意的是,如果合并Excel文件有相同的工作表名称,可能会导致数据覆盖。因此,可以在新工作表名称添加一些前缀或后缀来避免这种情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值