需求:从后台读取数据生成一张如下图的Excel表格,并提供Excel下载功能。
生成的Excel表格格式如下:
实现步骤:
一、通过Apache POI生成Excel:
1、请求链接为:
<a href="${ctx}/……/statistic?feedbackId=${f.feedbackId}&type=${feedback.type}&feedbackName=${f.feedbackName}">统计</a>
2、在Controller中,获取后台数据,这里数据格式用JSON格式表示(同时Servcie层的 getStatisticList()方法此处操作省略):
//给service发送 type和feedbackId 两个数,获得统计元数据statisticsList List<StatisticBean> statisticsList = feedbackService.getStatisticList(type, feedbackId);
[
StatisticBean [title=1.药品使用效果, optionNames=[一般, 不满意, 满意, 非常满意], selectedList=[13, 1, 1, 0]],
StatisticBean [title=2.疫苗使用效果, optionNames=[一般, 不满意, 满意, 非常满意], selectedList=[11, 4, 0, 0]],
…………
StatisticBean [title=11.您认为本公司售前售中配合态度如何, optionNames=[一般, 不满意, 满意, 非常满意], selectedList=[3, 6, 5, 1]],
StatisticBean [title=12.您认为本公司售后服务态度如何, optionNames=[一般, 不满意, 满意, 非常满意], selectedList=[4, 6, 3, 2]],
StatisticBean [title=13.您对产品、服务及公司的其他意见过建议, optionNames=[], selectedList=[]]
]
3、在Servcie中,生成Excel表格,方法名为 createExcelTable():
注意:public HSSFWorkbook createExcelTable(List<StatisticBean> statisticsList) { HSSFWorkbook book = new HSSFWorkbook(); // 创建excel文件 HSSFSheet sheet = book.createSheet("统计表"); // 创建excel中的表格 HSSFRow row = sheet.createRow(0); // 创建第一行表头 sheet.setColumnWidth(0, ("题目".getBytes().length) * 256 * 10); // 设置第一列的宽度 // 设置单元格有边框 HSSFCellStyle borderStyle = book.createCellStyle(); borderStyle.setBorderTop(CellStyle.BORDER_THIN); borderStyle.setBorderBottom(CellStyle.BORDER_THIN); borderStyle.setBorderLeft(CellStyle.BORDER_THIN); borderStyle.setBorderRight(CellStyle.BORDER_THIN); // 单元格文字居中 borderStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER); borderStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER); // 自动换行 borderStyle.setWrapText(true); HSSFCell cell0 = row.createCell(0); // 创建第一个格。 HSSFCell cell1 = row.createCell(1); HSSFCell cell2 = row.createCell(2); cell0.setCellValue("题目"); cell1.setCellValue("选项"); cell2.setCellValue("投票数"); cell0.setCellStyle(borderStyle); cell1.setCellStyle(borderStyle); cell2.setCellStyle(borderStyle); if (statisticsList != null) { int j = 0; for (StatisticBean staBean : statisticsList) { HSSFRow datarow = null; // 设置题目列,i是每一个staBean子集需要创建的行数 for (int i = 0; i < staBean.getOptionNames().size(); i++) { // 设置Title值 datarow = sheet.createRow(j + i + 1); HSSFCell cellTitle = datarow.createCell(0); cellTitle.setCellValue(staBean.getTitle()); cellTitle.setCellStyle(borderStyle); // 设置单元格样式 <span style="color:#ff0000;">//合并单元格,参数规则是(开始行<不包含>,结束行<包含>,开始列,结束列) CellRangeAddress cra0 = new CellRangeAddress(j + 1, j + staBean.getOptionNames().size(), 0, 0); sheet.addMergedRegion(cra0);</span> // 设置OptionName值 HSSFCell cellOptionName = datarow.createCell(1); cellOptionName.setCellValue(staBean.getOptionNames().get(i)); cellOptionName.setCellStyle(borderStyle); // 设置单元格样式 <span style="color:#ff0000;">CellRangeAddress cra1 = new CellRangeAddress(j + 2, j + 2, 1, 1); sheet.addMergedRegion(cra1);</span> // 设置selected值 HSSFCell cellSelected = datarow.createCell(2); cellSelected.setCellValue(staBean.getSelectedList().get(i)); cellSelected.setCellStyle(borderStyle); // 设置单元格样式 <span style="color:#ff0000;">CellRangeAddress cra2 = new CellRangeAddress(j + 2, j + 2, 2, 2); sheet.addMergedRegion(cra2);</span> } j += staBean.getOptionNames().size(); } } return book; }
1、合并单元格时每一列都要合并,不需要合并的单元格参数 “开始行=结束行,开始列=结束列”。
2、合并单元格参数,“开始行”&“开始列”不包含进合并,“结束行”&“结束列”包含进合并。
4、在Service层中,实现Excel表格下载方法:
/*
* 下载Excel表格
*/
public void runExcelFileExport(HttpServletResponse response,
HSSFWorkbook wb,
String filename) {
try {
ServletOutputStream sos = response.getOutputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
wb.write(buffer);
response.setContentType("application/vnd.ms-excel"); //设置下载文件类型为 Excel
response.setContentLength(buffer.size());
response.setHeader("Content-Disposition", "attachment; filename="+ URLEncoder.encode(filename,"utf-8")); //防止中文乱码
response.setHeader("Pragma", "public");
response.setHeader("Cache-Control", "max-age=0");
sos.write(buffer.toByteArray());
buffer.flush();
sos.flush();
} catch (IOException e){
e.printStackTrace();
}
}
5、在Controller中调用下载方法:
// 创建Excel表格,将statisticsList数据传入,生成 待下载 数据。 HSSFWorkbook book = feedbackService.createExcelTable(statisticsList); String filename = feedbackName+"_"+System.currentTimeMillis()+".xls"; feedbackService.runExcelFileExport(response,book,filename);