1.需求
使用poi进行excel的操作,再将操作之后的文档上传到指定服务器,用过poi的同学都知道,我们使用poi进行操作的时候,他的通常写法就是.write(输出流),将我们的数据直接输出到输出流。那如果这个时候,我要的不是输出流,而是要输入流呢,我需要输入流去调用一个文件上传接口。这个需求有两种做法:
- 先将生成的excel保存到指定的服务器路径,在通过路径获取到文件,调用上传接口,最后删除文件,避免数据堆积(当然也可以不删除,作为存档留着,以后统一做数据备份,这个具体看需求和文件重要程度)
- 直接将poi操作之后的excel转为输入流,可以节省持久化到磁盘的时间,提高效率,
2.简化版代码
public static void main(String[] args) throws IOException {
//excel模板的位置
String path = "d:\\Users\\xychenkj\\Desktop\\demo.xlsx";
FileInputStream inputStream = new FileInputStream(path);
//创建工作簿 注意这个是针对于xlsx文件的 xls用的是另一个类
XSSFWorkbook sheets = new XSSFWorkbook(inputStream);
//创建工作表
XSSFSheet sheet = sheets.getSheetAt(0);
//模拟添加10行数据
for (int i = 1; i <= 10; i++) {
//创建一行
XSSFRow rowX = sheet.createRow(i);
//创建一列
XSSFCell cell0 = rowX.createCell(0);
//向这一列设置数据
cell0.setCellValue(i);
}
//核心代码如下 主要的思路就是把输出流的数据直接获取到,再用输入流去读取输出流的数据,从而实现流转换
//创建字节数组输出流
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//输出缓冲流
OutputStream output = new BufferedOutputStream(byteArrayOutputStream);
//将excel写入到输出流中
sheets.write(output);
//刷新缓冲区
output.flush();
//把输出流的数据拿到
byte[] bytes = byteArrayOutputStream.toByteArray();
//读取数据
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
//字节流转为字符流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(bais));
}
3.分析
以上代码只是简单的书写,存在没有关闭流等一系列问题,但是这个代码的目的是为了告诉大家,在我们需要进行文件,流等一系列转换的时候,有这么一个思路,可以绕开持久化到本地直接存储,在文件量庞大并且无需做本地保存的时候,可以通过这个思路优化代码。并且流与流之间可以使用读取字节数组的方式相互转换,不仅仅是字节流可以转为字符流,输入流也可以转为输出流使用。