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());
            }
        }
    }
}
相关推荐
曹牧1 天前
Excel:筛选两列中不匹配项
excel
それども1 天前
Excel文件解析 - 什么是SAX和DOM
java·excel
それども1 天前
Excel文件解析 - SAX和DOM方式的区别
java·前端·excel
それども1 天前
Excel文件解析 - SAX startRow cell endRow 执行顺序
java·前端·excel
梦因you而美1 天前
Python win32com操作Excel:彻底禁用链接更新及各类弹窗(实测有效)
python·excel·win32com·禁用链接更新·excel弹框
それども1 天前
Excel文件解析 - SAX startRow cell endRow 执行时机
java·excel
HWL56791 天前
在网页中实现WebM格式视频自动循环播放
前端·css·html·excel·音视频
开开心心就好2 天前
图片校正漂白工具永久免费,矫正实时预览
网络·人工智能·windows·计算机视觉·计算机外设·电脑·excel
开开心心_Every2 天前
音频视频转文字工具,离线语音识别免费
人工智能·游戏·微信·pdf·excel·语音识别·memcache
开开心心_Every2 天前
电脑网速加速工具,无线有线叠加网络
网络·游戏·微信·pdf·电脑·excel·语音识别