java 上传excel的zip,解压并读取文件内容

因为业务需要,就写了一个例子

代码很详细了,这里不解释了

package com.ctsi.dataservice.controller;


import com.ctsi.core.common.entity.ApiResult;
import com.ctsi.core.common.utils.ApiResultUtil;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/test")
@ApiSupport(order = 12)
@Api(tags = "测试", description = "测试")
@ApiResponses(value = {@ApiResponse(code = 200, message = "OK"),
        @ApiResponse(code = 500, message = "ERROR", response = ApiResult.class)})
public class TestController {
    @PostMapping("/v1/dealfile")
    @ApiOperation("测试上传")
    @ApiOperationSupport(order = 1)
    public ApiResult<String> dealfile(@RequestParam("file")  MultipartFile file) throws IOException {
        Path filePath = uploadFile(file);
        System.out.println("上传完成");

        Path fullPath = Paths.get(filePath.toString());
        Path directoryPath = fullPath.getParent(); //
        System.out.println("解压完成");

        searchExcel(extractXlsXlsxFiles(directoryPath));
        System.out.println("遍历excel");
        return ApiResultUtil.createSuccessApiResult("查询成功",null);
        //删除
    }
    private void searchExcel(String directoryPath) {
        //遍历excel
        File directory = new File(directoryPath);

        // Get all files in the directory
        File[] files = directory.listFiles((dir, name) -> name.endsWith(".xls") || name.endsWith(".xlsx"));

        if (files != null) {
            for (File file : files) {
                try (FileInputStream fis = new FileInputStream(file)) {
                    Workbook workbook = WorkbookFactory.create(fis);
                    Sheet sheet = workbook.getSheetAt(0); // Assuming 'sheet1' is the first sheet

                    DataFormatter formatter = new DataFormatter();
                    // Skip the first row
                    boolean skipFirstRow = true;
                    for (Row row : sheet) {
                        if (skipFirstRow) {
                            skipFirstRow = false;
                            continue;
                        }
                        for (Cell cell : row) {
                            String cellValue = formatter.formatCellValue(cell);
                            System.out.print(cellValue + "\t");
                        }
                        System.out.println();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public String extractXlsXlsxFiles(Path path) throws IOException {
        // 获取当前时间戳,作为新文件夹的名称
        long timestamp = System.currentTimeMillis();
        // 在当前路径下创建以时间戳命名的文件夹
        Path extractDir = path.resolve(timestamp + "");
        Files.createDirectory(extractDir);

        // 获取所有zip文件
        DirectoryStream<Path> directoryStream = Files.newDirectoryStream(path, "*.zip");
        for (Path zipFilePath : directoryStream) {
            try (ZipFile zipFile = new ZipFile(zipFilePath.toFile())) {
                Enumeration<? extends ZipEntry> entries = zipFile.entries();
                while (entries.hasMoreElements()) {
                    ZipEntry entry = entries.nextElement();
                    String entryName = entry.getName();
                    // 只解压.xls和.xlsx文件
                    if (entryName.endsWith(".xls") || entryName.endsWith(".xlsx")) {
                        Path extractedFilePath = extractDir.resolve(entryName);
                        if (!entry.isDirectory()) {
                            try (InputStream is = zipFile.getInputStream(entry);
                                 OutputStream os = Files.newOutputStream(extractedFilePath)) {
                                byte[] buffer = new byte[1024];
                                int length;
                                while ((length = is.read(buffer)) >= 0) {
                                    os.write(buffer, 0, length);
                                }
                            }
                        }
                    }
                }
            }
        }
        return extractDir.toString();
    }

    public Path uploadFile(MultipartFile file) {
        if (file.isEmpty()) {
            System.out.println("File is empty");
            return null;
        }
        // 获取环境变量中配置的上传目录,或者直接指定路径
        String uploadDir = System.getenv("UPLOAD_DIR");
        if (uploadDir == null || uploadDir.isEmpty()) {
            // 如果环境变量未设置,则使用默认路径
            uploadDir = "D:\\code\\upload\\"+ LocalDate.now();
        }
        // 构建文件完整路径
        String filename = file.getOriginalFilename();
        Path path = Paths.get(uploadDir + File.separator + filename);
        // 检查文件是否已存在
        if (Files.exists(path)) {
            System.out.println("File already exists: " + filename);
            return null;
        }
        try {
            byte[] bytes = file.getBytes();
            File directory = new File(uploadDir);
            if (!directory.exists()) {
                directory.mkdirs();
            }
            Files.write(path, bytes);
            System.out.println("File uploaded successfully: " + file.getOriginalFilename());
            return path;
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("File upload failed: " + e.getMessage());
            return null;
        }
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Javajava.util.zip来实现解压zip文件并读取内容。下面是一个示例代码: ```java import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; public class UnzipExample { public static void main(String[] args) { String zipFilePath = "path/to/your/zip/file.zip"; String destinationFolder = "path/to/destination/folder"; try { unzip(zipFilePath, destinationFolder); readContents(destinationFolder); } catch (IOException e) { e.printStackTrace(); } } public static void unzip(String zipFilePath, String destinationFolder) throws IOException { byte[] buffer = new byte[1024]; File folder = new File(destinationFolder); if (!folder.exists()) { folder.mkdirs(); } try (ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(new FileInputStream(zipFilePath)))) { ZipEntry zipEntry; while ((zipEntry = zipInputStream.getNextEntry()) != null) { String entryName = zipEntry.getName(); File entryFile = new File(destinationFolder + File.separator + entryName); if (entryFile.getParentFile() != null && !entryFile.getParentFile().exists()) { entryFile.getParentFile().mkdirs(); } if (!zipEntry.isDirectory()) { int bytesRead; while ((bytesRead = zipInputStream.read(buffer)) != -1) { entryFile.createNewFile(); FileOutputStream fileOutputStream = new FileOutputStream(entryFile); fileOutputStream.write(buffer, 0, bytesRead); fileOutputStream.close(); } } else { entryFile.mkdirs(); } zipInputStream.closeEntry(); } } } public static void readContents(String folderPath) { File folder = new File(folderPath); if (folder.exists() && folder.isDirectory()) { File[] files = folder.listFiles(); if (files != null) { for (File file : files) { if (file.isDirectory()) { System.out.println("Directory: " + file.getName()); } else { System.out.println("File: " + file.getName()); } } } } } } ``` 在上述示例代码中,你需要替换`zipFilePath`和`destinationFolder`变量的值为你实际的zip文件路径和解压后的目标文件夹路径。`unzip`方法负责解压zip文件,`readContents`方法用于读取解压后的文件夹内容并打印。 请确保你已经正确配置了Java环境,并导入了必要的类和。运行示例代码后,它将解压zip文件并打印出解压后的文件和文件夹列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值