Apache POI生成Excel表格并下载的一些注意事项

需求:从后台读取数据生成一张如下图的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);





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值