poi操作文档转为输入流

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.分析

以上代码只是简单的书写,存在没有关闭流等一系列问题,但是这个代码的目的是为了告诉大家,在我们需要进行文件,流等一系列转换的时候,有这么一个思路,可以绕开持久化到本地直接存储,在文件量庞大并且无需做本地保存的时候,可以通过这个思路优化代码。并且流与流之间可以使用读取字节数组的方式相互转换,不仅仅是字节流可以转为字符流,输入流也可以转为输出流使用。

你可能感兴趣的:(JAVA知识,java,poi,输出流转输入流)