应用场景
业务中有些数据需要导出成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();
}
}