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());
            }
        }
    }
}
相关推荐
_大龄20 小时前
前端解析excel
前端·excel
johnny2331 天前
智能电子表格:Airtable、NocoDB、teable、APITable
excel
2501_930707782 天前
如何使用C#代码在Excel 文件中添加工作表
excel
shouchaobao2 天前
免费PDF工具:PDF转Word/Excel/图片+AI总结+合并拆分+OCR识别,多端无广告!
pdf·word·excel
allbs2 天前
spring boot项目excel导出功能封装——4.导入
spring boot·后端·excel
m5655bj2 天前
使用 Python 高效复制 Excel 行、列、单元格
开发语言·python·excel
温轻舟3 天前
Python自动办公工具01-Excel文件编辑器
开发语言·python·编辑器·excel·温轻舟
WarPigs3 天前
Unity编辑器开发笔记
unity·编辑器·excel
allbs3 天前
spring boot项目excel导出功能封装——3.图表导出
spring boot·后端·excel
lqz19933 天前
根据html导出excel和word
html·word·excel