外卖小程序11

目录

  • Apache POI
    • 介绍
    • 入门案例
      • maven坐标引入
      • 将数据写入Excel文件
        • 代码开发
      • 读取Excel文件中的数据
        • 代码开发
    • 应用
      • 需求
      • 实现步骤
      • 代码实现
      • Controller层
        • ReportController
      • Service层
        • ReportService
        • Service层实现思路
        • ReportServiceImpl

Apache POI

介绍

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

入门案例

maven坐标引入

<dependency>
    <groupId>org.apache.poigroupId>
    <artifactId>poiartifactId>
    <version>3.16version>
dependency>
<dependency>
    <groupId>org.apache.poigroupId>
    <artifactId>poi-ooxmlartifactId>
    <version>3.16version>
dependency>

将数据写入Excel文件

代码开发


    /**
     * 测试使用POI将数据写入excel文件
     *
     * @throws Exception
     */
    @Test
    public void testWrite() throws Exception {
        //在内存中创建一个excel文件对象
        XSSFWorkbook excel = new XSSFWorkbook();

        //使用excel创建sheet页
        XSSFSheet sheet = excel.createSheet();

        //创建行,0代表第一行
        XSSFRow row1 = sheet.createRow(0);

        //创建单元格并赋值,1代表第二个单元格
        row1.createCell(0).setCellValue("姓名");
        row1.createCell(1).setCellValue("城市");

        XSSFRow row2 = sheet.createRow(1);
        row2.createCell(0).setCellValue("张三");
        row2.createCell(1).setCellValue("武汉");
        XSSFRow row3 = sheet.createRow(2);
        row3.createCell(0).setCellValue("李四");
        row3.createCell(1).setCellValue("广州");

        FileOutputStream out = new FileOutputStream("H:\\JavaProjects\\javaFrameWork\\sky-take-out\\shifan.xlsx");
        //通过输出流将内存中的excel文件写到磁盘上
        excel.write(out);

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

读取Excel文件中的数据

代码开发

    /**
     * 测试使用POI读取excel文件
     */
    @Test
    public void testRead() throws Exception {
        FileInputStream in = new FileInputStream("H:\\JavaProjects\\javaFrameWork\\sky-take-out\\shifan.xlsx");
        //读取excel文件为对象
        XSSFWorkbook excel = new XSSFWorkbook(in);
        //获取第一个sheet页
        XSSFSheet sheet = excel.getSheetAt(0);
        //获取sheet页中最后一行的行号
        int lastRowNum = sheet.getLastRowNum();

        for (int i = 0; i <= lastRowNum; i++) {
            //获取当前行
            XSSFRow row = sheet.getRow(i);
            //获取单元格的文本值
            String cell1 = row.getCell(0).getStringCellValue();
            String cell2 = row.getCell(1).getStringCellValue();
            System.out.println(cell1 + " " + cell2);
        }

        in.close();
        excel.close();
    }

应用

需求

导出运营数据Excel报表

实现步骤

  1. 设计excel模板
  2. 查询数据
  3. 写入数据
  4. 输出流输出

代码实现

Controller层

ReportController

    /**
     * 导出运营数据报表
     *
     * @return
     */
    @ApiOperation("导出运营数据报表")
    @GetMapping("/export")
    public void export(HttpServletResponse response) {
        reportService.export(response);
    }

Service层

ReportService

    /**
     * 导出运营数据报表
     *
     * @param response
     */
    void export(HttpServletResponse response);

Service层实现思路

将设计好的数据导出Excel文件模板添加到resource中去,使用模板文件在内存中创建一个excel对象,获取sheet页,查询需要的近30天的运营数据,然后根据下标为设计好的单元格赋值,数据写入完成后将excel对象通过输出流将文件下载到客户端浏览器中

ReportServiceImpl


    /**
     * 导出运营数据报表
     *
     * @param response
     */
    @Override
    @SneakyThrows
    public void export(HttpServletResponse response) {
        //获取运营数据报表模板
        InputStream in = this.getClass().getClassLoader().getResourceAsStream("template/运营数据报表模板.xlsx");
        //在内存中以模板生成excel表格
        XSSFWorkbook excel = new XSSFWorkbook(in);
        //根据名称获取sheet页
        XSSFSheet sheet = excel.getSheet("sheet1");
        //计算起始,结束日期
        LocalDate begin = LocalDate.now().minusDays(30);
        LocalDate end = LocalDate.now().minusDays(1);
        //获取运营数据
        BusinessDataVO businessData = workspaceService.getBusinessData(LocalDateTime.of(begin, LocalTime.MIN), LocalDateTime.of(end, LocalTime.MAX));
        //设置第二行第二个单元格日期数据
        sheet.getRow(1).getCell(1).setCellValue(begin + "至" + end);
        //获取第四行
        XSSFRow row = sheet.getRow(3);
        //设置第3,5,7个单元格的数据
        row.getCell(2).setCellValue(businessData.getTurnover());
        row.getCell(4).setCellValue(businessData.getOrderCompletionRate());
        row.getCell(6).setCellValue(businessData.getNewUsers());
        //获取第五行
        XSSFRow row1 = sheet.getRow(4);
        //设置第3,5个单元格数据
        row1.getCell(2).setCellValue(businessData.getValidOrderCount());
        row1.getCell(4).setCellValue(businessData.getUnitPrice());

        //设置明细数据
        for (int i = 0; i < 30; i++) {
            LocalDate date = begin.plusDays(i);
            LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);
            LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);
            //获取当天运营数据
            businessData = workspaceService.getBusinessData(beginTime, endTime);
            //获取行
            XSSFRow row2 = sheet.getRow(7 + i);
            row2.getCell(1).setCellValue(date.toString());
            row2.getCell(2).setCellValue(businessData.getTurnover());
            row2.getCell(3).setCellValue(businessData.getValidOrderCount());
            row2.getCell(4).setCellValue(businessData.getOrderCompletionRate());
            row2.getCell(5).setCellValue(businessData.getUnitPrice());
            row2.getCell(6).setCellValue(businessData.getNewUsers());
        }
        //获取响应输出流
        ServletOutputStream out = response.getOutputStream();
        //通过输出流输出excel表格
        excel.write(out);

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

你可能感兴趣的:(Java,java)