• Apache POI


    介绍

    可以对Microsoft Office格式档案实现读和写的功能,包括Excel、Word等。

    jxl:专门操作Excel

    POI结构:
    HSSF - 提供读写Microsoft Excel XLS格式档案的功能
    XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能
    HWPF - 提供读写Microsoft Word DOC格式档案的功能
    HSLF - 提供读写Microsoft PowerPoint格式档案的功能
    HDGF - 提供读Microsoft Visio格式档案的功能
    HPBF - 提供读Microsoft Publisher格式档案的功能
    HSMF - 提供读Microsoft Outlook格式档案的功能

    步骤

    1. 导入maven坐标

    <dependency>
      <groupId>org.apache.poigroupId>
      <artifactId>poiartifactId>
      <version>3.14version>
    dependency>
    <dependency>
      <groupId>org.apache.poigroupId>
      <artifactId>poi-ooxmlartifactId>
      <version>3.14version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    2. 场景开发

    1)读取excel文件数据

    POI操作Excel表格封装了几个核心对象:
    XSSFWorkbook:工作簿
    XSSFSheet:工作表
    Row:行
    Cell:单元格

    //创建工作簿
    XSSFWorkbook workbook = new XSSFWorkbook("D:\\hello.xlsx");
    //获取工作表,既可以根据工作表的顺序获取,也可以根据工作表的名称获取
    XSSFSheet sheet = workbook.getSheetAt(0);
    //遍历工作表获得行对象
    for (Row row : sheet) {
      //遍历行对象获取单元格对象
      for (Cell cell : row) {
        //获得单元格中的值
        String value = cell.getStringCellValue();
        System.out.println(value);
      }
    }
    workbook.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    还有一种方式就是获取工作表最后一个行号,从而根据行号获得行对象,通过行获取最后一个单元格索引,从而根据单元格索引获取每行的一个单元格对象。

    2)数据写入excel文件

    使用POI可以在内存中创建一个Excel文件并将数据写入到这个文件,最后通过输出流将内存中的Excel文件下载到磁盘

    //在内存中创建一个Excel文件
    XSSFWorkbook workbook = new XSSFWorkbook();
    //创建工作表,指定工作表名称
    XSSFSheet sheet = workbook.createSheet("传智播客");
    
    //创建行,0表示第一行
    XSSFRow row = sheet.createRow(0);
    //创建单元格,0表示第一个单元格
    row.createCell(0).setCellValue("编号");
    row.createCell(1).setCellValue("名称");
    row.createCell(2).setCellValue("年龄");
    
    XSSFRow row1 = sheet.createRow(1);
    row1.createCell(0).setCellValue("1");
    row1.createCell(1).setCellValue("小明");
    row1.createCell(2).setCellValue("10");
    
    XSSFRow row2 = sheet.createRow(2);
    row2.createCell(0).setCellValue("2");
    row2.createCell(1).setCellValue("小王");
    row2.createCell(2).setCellValue("20");
    
    //通过输出流将workbook对象下载到磁盘
    FileOutputStream out = new FileOutputStream("D:\\itcast.xlsx");
    workbook.write(out);
    out.flush();
    out.close();
    workbook.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    3)excel数据批量导入

    在这里插入图片描述

    批量导入操作过程:

    1、点击模板下载按钮下载Excel模板文件

    2、将预约设置信息录入到模板文件中

    3、点击上传文件按钮将录入完信息的模板文件上传到服务器

    4、通过POI读取上传文件的数据并保存到数据库

    POIUtils工具类:读入excel文件,解析后返回

        /**
         * Excel文件上传,并解析文件内容保存到数据库
         * @param excelFile
         * @return
         */
        @RequestMapping("/upload")
        public Result upload(@RequestParam("excelFile")MultipartFile excelFile){
            try {
                //读取Excel文件数据
                List<String[]> list = POIUtils.readExcel(excelFile);
                if(list != null && list.size() > 0){
                    List<OrderSetting> orderSettingList = new ArrayList<>();
                    for (String[] strings : list) {
                        OrderSetting orderSetting = 
                          new OrderSetting(new Date(strings[0]), Integer.parseInt(strings[1]));
                        orderSettingList.add(orderSetting);
                    }
                    orderSettingService.add(orderSettingList);
                }
            } catch (IOException e) {
                e.printStackTrace();
                return new Result(false, MessageConstant.IMPORT_ORDERSETTING_FAIL);
            }
            return new Result(true,MessageConstant.IMPORT_ORDERSETTING_SUCCESS);
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    4)运营数据统计报表导出

    在这里插入图片描述
    将运营统计数据通过POI写入到Excel文件

    /**
      * 导出Excel报表
      * @return
    */
    @RequestMapping("/exportBusinessReport")
    public Result exportBusinessReport(HttpServletRequest request, HttpServletResponse response){
      try{
        //远程调用报表服务获取报表数据
        Map<String, Object> result = reportService.getBusinessReport();
        
        //取出返回结果数据,准备将报表数据写入到Excel文件中
        String reportDate = (String) result.get("reportDate");
        Integer todayNewMember = (Integer) result.get("todayNewMember");
        Integer totalMember = (Integer) result.get("totalMember");
        Integer thisWeekNewMember = (Integer) result.get("thisWeekNewMember");
        Integer thisMonthNewMember = (Integer) result.get("thisMonthNewMember");
        Integer todayOrderNumber = (Integer) result.get("todayOrderNumber");
        Integer thisWeekOrderNumber = (Integer) result.get("thisWeekOrderNumber");
        Integer thisMonthOrderNumber = (Integer) result.get("thisMonthOrderNumber");
        Integer todayVisitsNumber = (Integer) result.get("todayVisitsNumber");
        Integer thisWeekVisitsNumber = (Integer) result.get("thisWeekVisitsNumber");
        Integer thisMonthVisitsNumber = (Integer) result.get("thisMonthVisitsNumber");
        List<Map> hotSetmeal = (List<Map>) result.get("hotSetmeal");
    	
        //获得Excel模板文件绝对路径
        String temlateRealPath = request.getSession().getServletContext().getRealPath("template") +
          											File.separator + "report_template.xlsx";
    	
        //读取模板文件创建Excel表格对象
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File(temlateRealPath)));
        XSSFSheet sheet = workbook.getSheetAt(0);
        
        XSSFRow row = sheet.getRow(2);
        row.getCell(5).setCellValue(reportDate);//日期
    
        row = sheet.getRow(4);
        row.getCell(5).setCellValue(todayNewMember);//新增会员数(本日)
        row.getCell(7).setCellValue(totalMember);//总会员数
    
        row = sheet.getRow(5);
        row.getCell(5).setCellValue(thisWeekNewMember);//本周新增会员数
        row.getCell(7).setCellValue(thisMonthNewMember);//本月新增会员数
    
        row = sheet.getRow(7);
        row.getCell(5).setCellValue(todayOrderNumber);//今日预约数	
        row.getCell(7).setCellValue(todayVisitsNumber);//今日到诊数
    
        row = sheet.getRow(8);
        row.getCell(5).setCellValue(thisWeekOrderNumber);//本周预约数
        row.getCell(7).setCellValue(thisWeekVisitsNumber);//本周到诊数
    
        row = sheet.getRow(9);
        row.getCell(5).setCellValue(thisMonthOrderNumber);//本月预约数
        row.getCell(7).setCellValue(thisMonthVisitsNumber);//本月到诊数
    
        int rowNum = 12;
        for(Map map : hotSetmeal){//热门套餐
          String name = (String) map.get("name");
          Long setmeal_count = (Long) map.get("setmeal_count");
          BigDecimal proportion = (BigDecimal) map.get("proportion");
          row = sheet.getRow(rowNum ++);
          row.getCell(4).setCellValue(name);//套餐名称
          row.getCell(5).setCellValue(setmeal_count);//预约数量
          row.getCell(6).setCellValue(proportion.doubleValue());//占比
        }
    
        //通过输出流进行文件下载
        ServletOutputStream out = response.getOutputStream();
        response.setContentType("application/vnd.ms-excel");
        response.setHeader("content-Disposition", "attachment;filename=report.xlsx");
        workbook.write(out);
        
        out.flush();
        out.close();
        workbook.close();
        
        return null;
      }catch (Exception e){
        return new Result(false, MessageConstant.GET_BUSINESS_REPORT_FAIL,null);
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
  • 相关阅读:
    系统启动其实就2个步骤BIOS和MBR(和之后的init/systemd的关系)
    uniapp项目实践总结(十一)自定义网络检测组件
    Java学生管理系统
    Hive的基本知识
    Node学习笔记之模块化
    Ceph入门到精通-sysctl.conf 配置
    MyBatis-Plus(二、常用注解)
    攻防千层饼
    k8s教程(11)-pod调度概述
    AI绘画:StableDiffusion实操教程-斗罗大陆-朱竹清(附高清图下载)
  • 原文地址:https://blog.csdn.net/weixin_40816843/article/details/127842610