Live2D

java读取zip文件中的excel信息

首先要使用到的及时是easyexcel,maven依赖如下

 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>easyexcel</artifactId>
     <version>3.0.4</version>
 </dependency>

创建对象读取

实体类

package com.wl.task;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class TestEntity {

    @ExcelProperty(value = "姓名")
    private String username;
    @ExcelProperty(value = "性别")
    private String gender;
    @ExcelProperty(value = "年龄")
    private String age;
    @ExcelProperty(value = "籍贯")
    private String address;

}

监听器

package com.wl.task;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.extern.slf4j.Slf4j;

@Slf4j
public class TestExcelListner extends AnalysisEventListener {

    @Override
    public void invoke(Object o, AnalysisContext analysisContext) {
        System.out.println(o.toString());
//        log.info(((TestEntity) o).toString());
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("解析完成");
    }

    
}

主类

package com.wl.task;



import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;

import java.io.*;
import java.nio.charset.Charset;
import java.util.Objects;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * @author 没有梦想的java菜鸟
 * @Date 创建时间:2022/7/12 下午6:07
 * @qq 2315290571
 * @Description aa
 */
public class Test {
    public static void main(String[] args) throws IOException {
        // 使用 File 进行本地 ZIP 文件的读取
        String fileName = "/Users/wangliang/Downloads/testa/22.zip";
        File file = new File(fileName);
        // 将 file 文件转换为 ZipInputStream 流,ZipInputStream 为压缩文件输入流,专门用于读取压缩文件
        // 如果 Excel 中包含特殊字符,需要手动去调整编码格式,这里我们暂且使用默认的 utf-8
        ZipInputStream zipStream = new ZipInputStream(new FileInputStream(file), Charset.forName("GBK"));
        // 因为流只可被读取一次的特性,因此我们需要创建一个 ZipEntry 去接收
        ZipEntry zipEntry;
        // 循环读取 ZIP 文件中的每一个子文件,若文件不为空且文件名为我们需要的那个("22.xlsx"),则开始解析
        while ((zipEntry = zipStream.getNextEntry()) != null) {
            if (Objects.equals(zipEntry.getName(), "22.xlsx")) {
                // 逐字节读取 ZipInputStream 文件,并将结果存储至一个字节数组缓冲区(ByteArrayOutputStream)中
                byte[] buffer = new byte[1024];
                int len;
                ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
                while ((len = zipStream.read(buffer)) != -1) {
                    byteStream.write(buffer, 0, len);
                }
                // 关闭流
                byteStream.close();
                // 创建 Excel 解析器对象
                TestExcelListner testExcelListner = new TestExcelListner();
                ExcelReader excelReader;
                // 将之前的 ByteArrayOutputStream 对象转化为 byte数组,然后使用 EasyExcel 进行解析
                excelReader = EasyExcel.read(new ByteArrayInputStream(byteStream.toByteArray()), TestEntity.class, testExcelListner).build();
                ReadSheet readSheet = EasyExcel.readSheet().build();
                excelReader.read(readSheet);
            }
        }
    }
}

不创建对象读取

然后我们读取zip文件,并使用easyexcel提供的读取方法读取内容

package com.wl.task;



import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.read.metadata.ReadSheet;

import java.io.*;
import java.nio.charset.Charset;
import java.util.Objects;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

/**
 * @author 没有梦想的java菜鸟
 * @Date 创建时间:2022/7/12 下午6:07
 * @qq 2315290571
 * @Description aa
 */
public class Test {
    public static void main(String[] args) throws IOException {
        // 使用 File 进行本地 ZIP 文件的读取
        String fileName = "aa.zip";
        File file = new File(fileName);
        // 将 file 文件转换为 ZipInputStream 流,ZipInputStream 为压缩文件输入流,专门用于读取压缩文件
        // 如果 Excel 中包含特殊字符,需要手动去调整编码格式,这里我们暂且使用默认的 utf-8
        ZipInputStream zipStream = new ZipInputStream(new FileInputStream(file), Charset.forName("GBK"));
        // 因为流只可被读取一次的特性,因此我们需要创建一个 ZipEntry 去接收
        ZipEntry zipEntry;
        // 循环读取 ZIP 文件中的每一个子文件,若文件不为空且文件名为我们需要的那个("22.xlsx"),则开始解析
        while ((zipEntry = zipStream.getNextEntry()) != null) {
            if (Objects.equals(zipEntry.getName(), "aa.xls")) {
                // 逐字节读取 ZipInputStream 文件,并将结果存储至一个字节数组缓冲区(ByteArrayOutputStream)中
                byte[] buffer = new byte[1024];
                int len;
                ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
                while ((len = zipStream.read(buffer)) != -1) {
                    byteStream.write(buffer, 0, len);
                }
                // 关闭流
                byteStream.close();
                // 创建 Excel 解析器对象
                EasyExcel.read(new ByteArrayInputStream(byteStream.toByteArray()), new NoModelDataListener()).sheet().doRead();
            }
        }
    }
}

监听器类

package com.wl.task;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Map;

@Slf4j
public class NoModelDataListener extends AnalysisEventListener<Map<Integer, String>> {
    /**
     * 每隔5条存储数据库,实际使用中可以100条,然后清理list ,方便内存回收
     */
    private static final int BATCH_COUNT = 5;
    private List<Map<Integer, String>> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);

    @Override
    public void invoke(Map<Integer, String> data, AnalysisContext context) {
        System.out.println("解析到一条数据:"+JSON.toJSONString(data));
//        log.info("解析到一条数据:{}", JSON.toJSONString(data));
//        cachedDataList.add(data);
//        if (cachedDataList.size() >= BATCH_COUNT) {
//            saveData();
//            cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
//        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
//        saveData();
//        log.info("所有数据解析完成!");
    }

    /**
     * 加上存储数据库
     */
    private void saveData() {
//        log.info("{}条数据,开始存储数据库!", cachedDataList.size());
//        log.info("存储数据库成功!");
    }
}

posted @ 2022-07-12 18:56  没有梦想的java菜鸟  阅读(186)  评论(0编辑  收藏  举报