Apache POI + HttpServletResponse实现浏览器请求服务端下载数据报表统计功能

目录

Apache POI介绍

实现步骤

利用POI向excel写数据Demo

利用POI读取excel表格数据Demo

HttpServletRequest、HttpServletResponse介绍

功能实现

参考链接

Apache POI介绍

        Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。 一般情况下,POI 都是用于操作 Excel 文件。

        基于SpringBoot的Web项目使用POI用于excel表格的读取\创建首先需要在pom文件中引入maven坐标:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.16</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version>
</dependency>

实现步骤

  1. 构造excel表格数据。
  2. 创建工作薄,工作薄可以根据输入流进行创建指定模板的工作薄,也可以创建空的工作薄。
    1. XSSFWorkbook excel = new XSSFWorkbook(inputStream); 根据指定输入流创建工作薄。
    2. XSSFWorkbook excel = new XSSFWorkbook(); 创建一个空的工作薄。
  3. 根据创建的工作薄对象创建sheet页;如果创建指定模板的工作薄,此处为获取sheet页。
    1. XSSSheet = excel.creatSheet("name");   创建名为name的sheet页。
    2. XSSSheet = excel.getSheetAt(0);        获取第一页。
  4. 创建行对象、获取行对象。
    1. XSSFRow row1 = sheet.createRow(0);        创建第一行。
    2. XSSFRow row1 = sheet.get(0); 获取行对象。
  5. 创建单元格对象、获取单元格对象。
    1. row2.createCell(1).setCellValue("张三");
    2. row2.getCell(1).setCellValue("张三");
  6. 填充数据。
  7. 通过输出流发送excel文件给客户端。

利用POI向excel写数据Demo

public class POITest {

    /**
     * 基于POI向Excel文件写入数据
     * @throws Exception
     */
    public static void write() throws Exception{
        //在内存中创建一个Excel文件对象
        XSSFWorkbook excel = new XSSFWorkbook();
        //创建Sheet页
        XSSFSheet sheet = excel.createSheet("itcast");

        //在Sheet页中创建行,0表示第1行
        XSSFRow row1 = sheet.createRow(0);
        //创建单元格并在单元格中设置值,单元格编号也是从0开始,1表示第2个单元格
        row1.createCell(1).setCellValue("姓名");
        row1.createCell(2).setCellValue("城市");

        XSSFRow row2 = sheet.createRow(1);
        row2.createCell(1).setCellValue("张三");
        row2.createCell(2).setCellValue("北京");

        XSSFRow row3 = sheet.createRow(2);
        row3.createCell(1).setCellValue("李四");
        row3.createCell(2).setCellValue("上海");

        FileOutputStream out = new FileOutputStream(new File("D:\\itcast.xlsx"));
        //通过输出流将内存中的Excel文件写入到磁盘上
        excel.write(out);

        //关闭资源
        out.flush();
        out.close();
        excel.close();
    }
    public static void main(String[] args) throws Exception {
        write();
    }
}

利用POI读取excel表格数据Demo

public class POITest {
    /**
     * 基于POI读取Excel文件
     * @throws Exception
     */
    public static void read() throws Exception{
        FileInputStream in = new FileInputStream(new File("D:\\itcast.xlsx"));
        //通过输入流读取指定的Excel文件
        XSSFWorkbook excel = new XSSFWorkbook(in);
        //获取Excel文件的第1个Sheet页
        XSSFSheet sheet = excel.getSheetAt(0);

        //获取Sheet页中的最后一行的行号
        int lastRowNum = sheet.getLastRowNum();

        for (int i = 0; i <= lastRowNum; i++) {
            //获取Sheet页中的行
            XSSFRow titleRow = sheet.getRow(i);
            //获取行的第2个单元格
            XSSFCell cell1 = titleRow.getCell(1);
            //获取单元格中的文本内容
            String cellValue1 = cell1.getStringCellValue();
            //获取行的第3个单元格
            XSSFCell cell2 = titleRow.getCell(2);
            //获取单元格中的文本内容
            String cellValue2 = cell2.getStringCellValue();

            System.out.println(cellValue1 + " " +cellValue2);
        }

        //关闭资源
        in.close();
        excel.close();
    }

    public static void main(String[] args) throws Exception {
        read();
    }
}

HttpServletRequest、HttpServletResponse介绍

HttpServletRequest:

        HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。

HttpServletResponse:

        HttpServletResponse类和HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息。我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置。

功能实现

通过HttpServletResponse的方法getOutputStream(...)能够获取到输出字节流,从而实现服务端内存中创建的excel文件由服务端到浏览器的传递。

        通过类加载器获取到对应文件的输入流,通过指定的输入流创建特定的工作薄对象,完成业务操作后,通过HttpServletRespond创建输出流,将excel对象通过输出流返回给客户端。

实现步骤:

  1. 通过this指针获取到对应的字节码文件,随后获取到类加载器,获取对应路径下excel模板文件的输入流。
  2. 选取XSS类型创建.xlsx类型的excel文件,获取excel文件中的sheet页,随后获取行并获取对应的单元格调用setCellValue(...)方法向单元格写入内容。
  3. 通过服务器创建的HttpServletResponse中的getOutputStream(...)方法获取到对应的输出流字节流
  4. 调用excel.write(outputStream)将excel文件从服务端传向浏览器页面。

    /**
     * 导出报表数据
     * @param response
     */
    @Override
    public void exportBusinessData(HttpServletResponse response) {
        // 查找最近一个月的数据
        LocalDate endDate = LocalDate.now().minusDays(1);
        LocalDate beginDate = LocalDate.now().minusDays(30);
        // 查找相应数据
        BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(beginDate, LocalTime.MIN), LocalDateTime.of(endDate, LocalTime.MAX));
        // 获取输入流
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");
        try {
            // 创建excel模板对象
            XSSFWorkbook excel = new XSSFWorkbook(inputStream);
            // 获取sheet页
            XSSFSheet sheet = excel.getSheetAt(0);
            // 写入获取数据时间
            sheet.getRow(1).getCell(1).setCellValue("运营时间:" + beginDate + "至" + endDate);
            // 获取第四行
            XSSFRow row = sheet.getRow(3);
            row.getCell(2).setCellValue(businessData.getTurnover());
            row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
            row.getCell(6).setCellValue(businessData.getNewUsers());
            row = sheet.getRow(4);
            row.getCell(2).setCellValue(businessData.getValidOrderCount());
            row.getCell(4).setCellValue(businessData.getUnitPrice());


            // 完成每日报单填写
            for (int i = 0; i < 30; i++) {
                LocalDateTime beginTime = LocalDateTime.of(beginDate, LocalTime.MIN);
                LocalDateTime endTime = LocalDateTime.of(beginDate, LocalTime.MAX);
                // 查找每日对应数据
                businessData = workspaceService.getBusinessData(beginTime, endTime);
                // 填充excel表格
                sheet.getRow(7 + i).getCell(1).setCellValue(String.valueOf(beginDate));
                sheet.getRow(7 + i).getCell(2).setCellValue(businessData.getTurnover());
                sheet.getRow(7 + i).getCell(3).setCellValue(businessData.getValidOrderCount());
                sheet.getRow(7 + i).getCell(4).setCellValue(businessData.getOrderCompletionRate());
                sheet.getRow(7 + i).getCell(5).setCellValue(businessData.getUnitPrice());
                sheet.getRow(7 + i).getCell(6).setCellValue(businessData.getNewUsers());
                beginDate = beginDate.plusDays(1);
            }

            // 获取输出流
            ServletOutputStream outputStream = response.getOutputStream();
            excel.write(outputStream);
            // 关闭资源
            inputStream.close();
            outputStream.close();
            excel.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

参考链接

HttpServletResponse类的介绍和使用+解决响应传递给客户端数据的中文乱码问题_response写流到客户端-CSDN博客

HttpServletResponse响应对象的详细介绍以及使用方式 - 掘金 (juejin.cn)

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值