java导出数据到excel
代码
//导出运营数据
@RequestMapping("/exportBusinessReport")
public Result exportBusinessReport(HttpServletRequest request, HttpServletResponse response){
try {
//读取要填写的数据
Map result = reportService.getBusinessReportData();
//取出返回结果数据,准备将报表数据写入到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");
//获取exel模板的绝对路径
String realPath = request.getSession().getServletContext().getRealPath("template")
+ File.separator + "report_template.xlsx";
//读取模板创建Excel对象,使用现有的模板,构造函数的参数是文件输入流
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(new File(realPath)));
XSSFSheet sheet = xssfWorkbook.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 num = 12;
for (Map map : hotSetmeal) {
row = sheet.getRow(num++);
String name = (String) map.get("name");
Long setmeal_count = (Long) map.get("setmeal_count");
BigDecimal proportion = (BigDecimal) map.get("proportion");
row.getCell(4).setCellValue(name);
row.getCell(5).setCellValue(setmeal_count);
row.getCell(6).setCellValue(proportion.doubleValue());
}
//传回表格,通过输出流传输回表格
ServletOutputStream os = response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
//以附件的形式下载
response.setHeader("content-Disposition", "attachment;filename=report.xlsx");
xssfWorkbook.write(os);
os.flush();
os.close();
xssfWorkbook.close();
} catch (Exception e) {
e.printStackTrace();
return new Result(false, MessageConstant.GET_BUSINESS_REPORT_FAIL);
}
return null;
}
获取绝对路径
需要使用HttpServletRequest
//获取exel模板的绝对路径
String realPath = request.getSession().getServletContext().getRealPath("template")
+ File.separator + "report_template.xlsx";
BigDecimal的显示
使用proportion.doubleValue(),使用默认提示转换的RichTextString没用
for (Map map : hotSetmeal) {
row = sheet.getRow(num++);
String name = (String) map.get("name");
Long setmeal_count = (Long) map.get("setmeal_count");
BigDecimal proportion = (BigDecimal) map.get("proportion");
row.getCell(4).setCellValue(name);
row.getCell(5).setCellValue(setmeal_count);
row.getCell(6).setCellValue(proportion.doubleValue());
}
回传数据
通过ServletOutputStream输出,文件的格式需要设置为附件形式
//传回表格,通过输出流传输回表格
ServletOutputStream os = response.getOutputStream();
response.setContentType("application/vnd.ms-excel");
//以附件的形式下载
response.setHeader("content-Disposition", "attachment;filename=report.xlsx");
xssfWorkbook.write(os);
os.flush();
os.close();
xssfWorkbook.close();