EasyExcel使用管道流连接InputStream和OutputStream

前言

Java中的InputSteam 是程序从其中读取数据, OutputSteam是程序可以往里面写入数据。
如果我们有在项目中读取数据库的记录, 在转存成Excel文件, 再把文件转存到OSS中。

生成Excel使用的是阿里的EasyExcel 。 他支持Output的方式写出文件内容。 而我使用的OSS的Client却只支持InputSteam的方式传入内容。

这就需要我把excel的数据流从InputStream传输到OutputStream中了。 这就要用到JAVA中的管道流功能了。

用法

下面是用法示例:

	//需要注意顺序, PipedOutputStream是管道的输入端, 需要先关闭, 这样输出端就知道管道结束了,才能正常结束
 	try (PipedOutputStream pipedOutputStream = new PipedOutputStream();
             PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream)) {  
		 ThreadUtil.execute(()->{
             //从数据库中读取内容, 忽略写法 
             List<Object>  data = ......
             //写入数据到output中,
             pipedOutputStream.write(JSON.toJSONBytes(data));
             //一定要调用这个方法, 不然input端不知道啥时候管道结束,就会一直堵塞等待
             pipedOutputStream.close();
        });
        //从input中读取数据上传到OSS中
       ossClient.putObject(path, pipedInputStream)
	} catch (Exception e) {
	   throw new BusinessRuntimeException("接入日志文件下载异常", e);
	}
  1. 注意管道的关闭顺序, 需要先关闭输入端,这样读取端才能结束阻塞。
  2. 两个流需要在两个线程中,如果在一个线程中,如果先写入数据,不写入结束就不会往下继续执行, 这就失去了管道流的意义。

总结

管道流正确的用法,是用于线程之间互相通信的, 上面的例子是由于EasyExcel的API设计不太合理的, EasyExcel使用不灵活, 所以没办法才使用管道流来把EasyExcel与OSSClient关联起来。

### 使用 EasyExcel 进行数据读写操作 #### 数据读取示例 为了实现高效的数据处理,EasyExcel 提供了基于监听器模式的式读取功能。通过这种方式可以逐行解析 Excel 文件中的数据而无需一次性加载整个文件到内存中。 创建自定义监听器来接收每一行的数据: ```java import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; public class DataListener extends AnalysisEventListener<DemoBeanheads> { @Override public void invoke(DemoBeanheads data, AnalysisContext context) { System.out.println(data); } @Override public void doAfterAllAnalysed(AnalysisContext context) { // 所有数据解析完成后的逻辑 } } ``` 使用 `InputStream` 来初始化 `ExcelReader` 并执行读取过程[^2]: ```java import java.io.InputStream; import org.springframework.web.multipart.MultipartFile; // 假设 multipartFile 是上传的 Excel 文件 MultipartFile multipartFile = ... ; try (InputStream inputStream = multipartFile.getInputStream()) { new ExcelReader(inputStream, ExcelTypeEnum.XLSX, null, new DataListener()).read(); } catch (IOException e) { throw new RuntimeException(e); } ``` #### 数据写入示例 对于大数据量场景下的导出需求,同样推荐采用的方式来进行写入操作。这有助于减少程序运行期间占用过多内存资源的风险。 编写用于映射表头与实体属性关系的对象 Bean: ```java package com.wkl.testdemo.excel; import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; @Data public class DemoBeanheads { @ExcelProperty("大学姓名") private String name; @ExcelProperty("大学性别") private String sex; } ``` 利用 `OutputStream` 实现向客户端浏览器发送下载链接的功能[^3]: ```java import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; import java.util.List; List<DemoBeanheads> list = new ArrayList<>(); for(int i=0;i<10000;i++){ DemoBeanheads demoBeanhead=new DemoBeanheads(); demoBeanhead.setName("张三"+i); demoBeanhead.setSex(i%2==0?"男":"女"); list.add(demoBeanhead); } EasyExcel.write(response.getOutputStream(),DemoBeanheads.class).sheet("模板").doWrite(list); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值