当前位置: 首页 > article >正文

项目功能--运营数据统计报表导出

一、需求分析

        运营数据统计报表导出就是将统计数据写入到Excel并提供给客户端浏览器进行下载,以便体检机构管理人员对运营数据的查看和存档。


 我们要将运营统计数据通过POI写入到Excel文件,对应的Excel效果如下:

        通过上面的Excel效果可以看到,表格比较复杂,涉及到合并单元格、字体、字号、字体加粗、对齐方式等的设置。如果我们通过POI编程的方式来设置这些效果代码会非常繁琐。

        在企业实际开发中,对于这种比较复杂的表格导出一般我们会提前设计一个Excel模板文件,在这个模板文件中提前将表格的结构和样式设置好,我们的程序只需要读取这个文件并在文件中的相应位置写入具体的值就可以了。

二、代码实现

实现步骤:

步骤一:在页面提供导出按钮并绑定事件

<div class="excelTitle" >
  <el-button @click="exportExcel">导出Excel</el-button>运营数据统计
</div>

事件:

methods:{
  //导出Excel报表
  exportExcel(){
    window.location.href = '/report/exportBusinessReport.do';
  }
}

步骤二:后台代码,基于POI将数据写入到Excel中并通过输出流下载到客户端

具体实现:

1、远程调用报表服务获取报表数据
2、读取模板文件创建Excel表格对象,写入数据
3、通过输出流进行文件下载

@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);
  }
}

实现成功,测试运行。


http://www.kler.cn/a/388008.html

相关文章:

  • 管家婆财贸ERP BB059.银行流水导入对账
  • 信捷 PLC C语言 POU 指示灯交替灭0.5秒亮0.5秒(保持型定时器)
  • 超子物联网HAL库笔记:定时器[外部模式]篇
  • Vue 3 中,computed 和 watch的区别
  • linux禁止和开启ping的方法
  • ssm093基于Java Web的毕业生就业状况管理系统设计与实现+jsp(论文+源码)_kaic
  • 【真题笔记】21年系统架构设计师案例理论点总结
  • 【SpringBoot】19 文件/图片下载(MySQL + Thymeleaf)
  • 说说webpack中常见的Plugin?解决了什么问题?
  • Ubuntu18.04更换PREEMPT RT内核
  • 软考:论容器编排
  • 微信小程序——01开发前的准备和开发工具
  • C++builder中的人工智能(20):如何在C++中开发一个简单的Hopfield网络
  • 推荐一款管道数据检索工具:Pipedata-Pro
  • C语言复习第9章 字符串/字符/内存函数
  • 卫星授时服务器,单北斗授时服务器,北斗卫星时钟服务器
  • 域名邮箱推荐:安全与稳定的邮件域名邮箱!
  • 【go从零单排】迭代器(Iterators)
  • chrony服务器(linux)
  • w029基于springboot的网上购物商城系统研发
  • Kubernetes中的statefulset控制器
  • 构建智能防线 灵途科技光电感知助力轨交全向安全防护
  • 现代Web开发:React Hooks深入解析
  • 鸿蒙移动应用开发-------初始arkts
  • php 之添加图片水印,根据比例计算水印的新尺寸
  • ssm080削面快餐店点餐服务系统的设计与实现+jsp(论文+源码)_kaic