java8循环解压zip文件---实现Excel文件数据追加

java8循环追加Excel数据

实际遇到问题:定期获取zip文件,zip文件内有几个固定模板的Excel文件,有的Excel文件可能还包含多个sheet。
有段时间一次性获取到好几个zip包,需要将这些包都解压,并且按照不同的文件名、sheet进行数据整合到一个sheet-Excel中。


可以在 pom.xml 中添加以下依赖:

xml 复制代码
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml-schemas</artifactId>
    <version>4.1.2</version>
</dependency>
<dependency>
    <groupId>org.apache.xmlbeans</groupId>
    <artifactId>xmlbeans</artifactId>
    <version>5.1.1</version>
</dependency>
java 复制代码
import org.apache.poi.ss.usermodel.*;

import java.io.*;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.Arrays;
import java.util.Collections;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

public class ZipExcelMerger {

    public static void main(String[] args) {
        // 原始zip文件路径
        String zipDirectory = "path/to/zip/files";
        // 解压zip文件至新的路径
        String outputDirectory = "path/to/output";

        File dir = new File(zipDirectory);
        File[] zipFiles = dir.listFiles((d, name) -> name.endsWith(".zip"));

        if (zipFiles != null) {
            // 升序
            Collections.sort(Arrays.asList(zipDirectory));
            for (File zipFile : zipFiles) {
                unzipAndMerge(zipFile, outputDirectory);
            }
        }
    }

    private static void unzipAndMerge(File zipFile, String outputDirectory) {
        try (ZipInputStream zis = new ZipInputStream(new FileInputStream(zipFile))) {
            ZipEntry entry;
            while ((entry = zis.getNextEntry()) != null) {
                if (!entry.isDirectory() && (entry.getName().endsWith(".xls") || entry.getName().endsWith(".xlsx"))) {
                    File outputFile = new File(outputDirectory, entry.getName());
                    byte[] buffer = new byte[1024];
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    int len;
                    while ((len = zis.read(buffer)) > 0) {
                        baos.write(buffer, 0, len);
                    }
                    baos.close();

                    if (outputFile.exists()) {
                        mergeExcelFiles(outputFile, new ByteArrayInputStream(baos.toByteArray()));
                    } else {
                        saveToFile(outputFile, new ByteArrayInputStream(baos.toByteArray()));
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

	private static void mergeExcelFiles(File existingFile, InputStream newFileStream) {
        File tempFile = null;
        try {
            // 创建临时文件
            tempFile = File.createTempFile("temp", ".xlsx");
            Files.copy(existingFile.toPath(), tempFile.toPath(), StandardCopyOption.REPLACE_EXISTING);

            // 读取临时文件
            Workbook existingWorkbook;
            try (InputStream is = new FileInputStream(tempFile)) {
                existingWorkbook = WorkbookFactory.create(is);
            }

            // 读取新文件
            try (Workbook newWorkbook = createWorkbook(newFileStream, existingFile.getName())) {
                for (int i = 0; i < newWorkbook.getNumberOfSheets(); i++) {
                    Sheet newSheet = newWorkbook.getSheetAt(i);
                    Sheet existingSheet = existingWorkbook.getSheet(newSheet.getSheetName());

                    if (existingSheet != null) {
                        for (int j = 1; j <= newSheet.getLastRowNum(); j++) {
                            Row newRow = newSheet.getRow(j);
                            if (newRow != null) {
                                Row existingRow = existingSheet.createRow(existingSheet.getLastRowNum() + 1);
                                copyRow(newRow, existingRow);
                            }
                        }
                    }
                }
            }

            // 将合并后的内容写回临时文件
            try (OutputStream os = new FileOutputStream(tempFile)) {
                existingWorkbook.write(os);
            }

            // 用临时文件替换原文件
            Files.move(tempFile.toPath(), existingFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 删除临时文件
            if (tempFile != null && tempFile.exists()) {
                tempFile.delete();
            }
        }
    }

	private static Workbook createWorkbook(InputStream inputStream, String fileName) throws IOException {
        if (fileName.endsWith(".xlsx")) {
            return WorkbookFactory.create(inputStream);
        } else if (fileName.endsWith(".xls")) {
            return WorkbookFactory.create(inputStream);
        } else {
            throw new IllegalArgumentException("Unsupported file format: " + fileName);
        }
    }

    private static void saveToFile(File file, InputStream inputStream) {
        try (FileOutputStream fos = new FileOutputStream(file)) {
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer)) > 0) {
                fos.write(buffer, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

	private static void copyRow(Row sourceRow, Row targetRow) {
        for (int i = 0; i < sourceRow.getLastCellNum(); i++) {
            Cell sourceCell = sourceRow.getCell(i);
            if (sourceCell != null) {
                Cell targetCell = targetRow.createCell(i);
                targetCell.setCellValue(sourceCell.toString());
            }
        }
    }
}
相关推荐
福兮说14 小时前
在浏览器里写一个“够用就好“的 Excel 公式求值器
前端·javascript·excel·编译原理
慧都小妮子1 天前
标签打印如何减少手工抄数?用Bartender 直连 Excel 批量打印
excel·bartender·条码打印·标签打印软件·数据驱动打印·工业打印机
SunnyDays10112 天前
Java 设置 Excel 数据验证:整数、日期、文本长度、下拉列表和时间
java·excel·数据验证·下拉列表
Metaphor6922 天前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
用户0332126663672 天前
使用 Python 设置 Excel 行列自适应 【代码示例】
python·excel
企业数字化笔记2 天前
固定资产Excel批量导入怎么防重复?资产编码、重复检查和错误回执
java·后端·excel
CORNERSTONE3653 天前
低代码开发有哪些应用场景?
低代码·excel·erp·mes·企业数字化
小葱炖豆腐3 天前
python绘制excel折线图
python·excel·numpy·pandas·matplotlib
cspttty4 天前
2026年财务分析岗JD中的Excel、SQL、BI与业务分析要求
大数据·sql·excel
cspttty4 天前
HR数字化校招准备路线:Excel、SQL、BI和AI工具怎么学
人工智能·sql·excel