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("存储数据库成功!");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2021-07-12 QUI按钮的权限笔记