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

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

一、需求分析

        运营数据统计报表导出就是将统计数据写入到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.mrgr.cn/news/70042.html

相关文章:

  • 刘知远LLM——大模型微调:prompt-learningdelta tuning
  • 搜索引擎的演变与未来发展趋势分析
  • MySQL多系统安装配置教程(Windows、Ubuntu、Centos)
  • 道可云人工智能元宇宙每日资讯|2024国际虚拟现实创新大会将在青岛举办
  • 最好用的免费多线程下载软件 Free Download Manager
  • Swift 扩展
  • MFC工控项目实例二十九主对话框调用子对话框设定参数值
  • c++ floyd判圈算法
  • Spring中@Autowired@Resource和@Inject注解区别
  • 【Java集合面试1】说说Java中的HashMap原理?
  • int socket(int domain,int type,int protocol);
  • 力扣第47题“全排列 II”
  • 中国智能网联汽车技术规程(C-ICAP-2024版)之基础行车辅助测试介绍及文档分享24年7月1号实施
  • 嵌入式linux中HDMI驱动操作方法
  • 前端面试题23 | 使用require和import引入的资源有什么区别?
  • 连锁会员管理系统开发的必要性
  • 【计网】基于TCP协议的Echo Server程序实现与多版本测试
  • MatSci-LLM ——潜力和挑战以及大规模语言模型在材料科学中的应用
  • CNN中每一层的权重是一样的么?
  • STM32的端口引脚的复用功能及重映射功能解析
  • 【数据结构】交换排序——冒泡排序 和 快速排序
  • 设计模式之责任链模式(Chain Of Responsibility)
  • Python——数列1/2,2/3,3/4,···,n/(n+1)···的一般项为Xn=n/(n+1),当n—>∞时,判断数列{Xn}是否收敛
  • 距离向量路由选择协议和链路状态路由选择协议介绍
  • 【电子通识】TINA-TI中怎么用分段线性源做周期性波形
  • redis集群介绍