应用场景
业务中有些数据需要导出成excel格式供需求方分析
展示效果
步骤
jsp页面
代码块:
<script type="text/javascript"> $(function(){ $(".export").live("click",function(){ var startDate=$("input[name='startDate']").val(); var endDate=$("input[name='endDate']").val(); var type=$("#type").val(); var str="/statistics/download.json?type="+type; if(!we.utils.isEmpty(startDate)){ str+="&startDate="+startDate; } if(!we.utils.isEmpty(endDate)){ str+="&endDate="+endDate; } window.location.href=str; }); }) </script>
说明
点击导出数据按钮时对应的方法只能用get请求,用post请求无法下载成功
后台代码
代码块
/** * 下载 * <p> * 下载查询的数据 * @throws IOException * @throws WriteException */ @At public Object download(@Param("..") HttpServletResponse response, @Param("..") DownLoadExcelForm form) throws WriteException, IOException { questionnaireStatisticsService.export(response, form); return JsonResult.success("导出数据成功!"); }
private static final String[] HOSPITALIZATION_HEAD_CONTENTS = { "提交问卷时间", "就诊时间", "出院科室", "年龄", "性别", "住院天数", "付费方式", "来自", "医生在对您进行比较大的治疗或操作前,让您或家属签署知情同意书", "您对本次住院的治疗效果满意", "护士的技术水平好", "当您按呼叫器时,护士能及时到您床前", "医务人员向您讲解了出院后的康复和服药方法", "医院向您提供了预约复诊服务", "医务人员服务态度好", "医务人员注意保护您的隐私(如关门或拉帘等)", "病区的环境安静、整洁", "医院的膳食服务好", "办理入/出院手续便捷", "您对B超室的服务", "您对放射科的服务", "您对本次就诊的总体满意程度", "您是否愿意将该医院推荐给您的亲朋或同事?", "您对本公众号的满意程度", "您对住院服务还有什么意见和建议", "您对本公众号还有什么意见和建议" }; public void export(HttpServletResponse response, DownLoadExcelForm form) throws IOException, WriteException { String path = "";//创建excel的路径,统一都按这个中写法来写,只是名称改一下就行了 int columnCount = 0;//设置excel显示的有多少列 List<Record> list;//这个对应的是excel中要填充的数据 if (form.getType() == QuestionnaireTypeEnum.CLINIC.intkey()) { path = kvConfig.getValue(ConfigKey.FILE_SERVER) + "/" + "门诊问卷调查.xls"; columnCount = 31; list = dbDao.query(form.list4ClinicList(sqlManager), null, null); } else { path = kvConfig.getValue(ConfigKey.FILE_SERVER) + "/" + "住院问卷调查.xls"; columnCount = 25; list = dbDao.query(form.list4Hospitalization(sqlManager), null, null); } WritableWorkbook workbook = Workbook.createWorkbook(new File(path)); WritableSheet sheet = workbook.createSheet("First Sheet", 0); int cellWidth = 20; //设置每一列的宽度 开始 for (int i = 0; i < columnCount; i++) { sheet.setColumnView(i, cellWidth); } //设置每一列宽度 结束 //设置excel的首行数据 开始 注意:这里的首行显示的列名称信息,我们是定义了一个数组方便循环 for (int y = 0; y < columnCount; y++) { if (form.getType() == QuestionnaireTypeEnum.CLINIC.intkey()) { sheet.addCell(new Label(y, 0, CLINIC_HEAD_CONTENTS[y])); } else { sheet.addCell(new Label(y, 0, HOSPITALIZATION_HEAD_CONTENTS[y])); } } //设置excel的首行数据 结束 //填充excel中的数据 开始 int rowIndex = 1; //这个代表的是第几行数据 ,以为首行列名占用了一行,所以这个是从1开始的 for (Record record : list) { sheet.addCell(new Label(0, rowIndex, record.getString("createTime"))); for (int x = 1; x <= columnCount; x++) { sheet.addCell(new Label(x, rowIndex, record.getString("temp" + (x - 1)))); } rowIndex++; } //填充excel中的数据 结束 workbook.write(); workbook.close(); if (!FileUtil.isExist(path)) { throw ExceptionUtil.bEx("下载的文件路径不存在"); } try { DownloadUtil.download(response, path); } catch (Exception e) { e.printStackTrace(); } }