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());
            }
        }
    }
}
相关推荐
开开心心就好13 小时前
自定义屏幕显示方向的实用软件
java·服务器·python·eclipse·pdf·word·excel
杜子腾dd1 天前
6.Excel:通过 Power Query 处理从网上获取的数据
大数据·python·excel
杜大哥1 天前
python将整个txt文件写入excel的一个单元格?
开发语言·python·excel
Smilecoc2 天前
EXCEL报错:无法共享此工作薄,因表包含excel表或xml映射的解决方法
xml·excel
我是六月生2 天前
右击没有Word、PPT、Excel功能
word·powerpoint·excel
杜子腾dd3 天前
4.用 Excel 录入数据
excel
杜子腾dd3 天前
21.Excel自动化:如何使用 xlwings 进行编程
运维·python·自动化·excel·numpy·pandas
姚瑞南3 天前
【Excel使用技巧】某列保留固定字段或内容
chatgpt·aigc·excel
杜子腾dd4 天前
4.Matplotlib:基础绘图
大数据·python·excel·matplotlib