2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 【java】列表导出excel(支持单元格内容换行展示)

【java】列表导出excel(支持单元格内容换行展示)

时间:2019-01-07 00:48:22

相关推荐

【java】列表导出excel(支持单元格内容换行展示)

这里写目录标题

业务背景前端后端导出效果

业务背景

如下图,想将用户选中的记录导出excel,某一列内容导出后需要换行展示

前端

表格勾选框列代码:

注:cid是记录的主键,绑定cid的方法用的公司封装方法,不通用,大家自主替换即可。

其他表格元素就正常写,不再赘述

<td 绑定cid值,width:'2%',checkbox:true," ><input type="checkbox" name="items" id="items" onclick="setCheckBoxState('cid',this.checked);" ></td>

操作checkbox的选中状态的方法:

/*** 操作checkbox的选中状态.* @param checkbox_name 需要设置状态的checkbox的名称.* @param state true:设置为选中状态;false:设置为未选中状态.*/function setCheckBoxState(checkbox_name, state) {checkbox_name = replaceDollar(checkbox_name);$("input[name="+checkbox_name+"]").each(function(){if($(this).prop("disabled") == false){$(this).prop("checked", state);}});}

导出excel按钮:

<input onclick="excelExport();" type="button" value="excel导出">

导出方法:

/** excel导出*/function excelExport(){var cids = getCheckBoxData("cid","cid"); //getCheckBoxData方法往下看if(cids==""){whir_alert('请选择记录!',function(){});}else{//这一步调用后端导出方法,谁敢信了我还在用jsp,屑!大家的公司肯定没这么拉吧 window.open('/***/***!excelExport.action?recordIds='+cids); }}

/*** 获得checkbox的选中值,如果返回值为空说明没有任何checkbox被选中.* @param checkbox_name checkbox的名称.* @param attr_name 你打算获得的属性值的属性名字,如id、value等属性.* @return 获得的属性值的拼串,多个值之间以英文半角逗号分隔且最后一个逗号被自动去除,如"value1,value2,value3" ,如果返回值为空说明没有任何checkbox被选中.*/function getCheckBoxData(checkbox_name, attr_name) {checkbox_name = replaceDollar(checkbox_name);var r = "" ;$("input[name='"+checkbox_name+"'][type='checkbox']").each(function(){if($(this).prop("checked")==true ){r = r + $(this).attr(attr_name)+",";}});if(r.indexOf(",")>0){r = r.substring(0, r.length-1);}return r;}function replaceDollar(str){if(str.indexOf('$')!=-1) {return str.replace(/\$/m, '\\$');}return str;}

后端

import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFCellStyle;import org.apache.poi.hssf.usermodel.HSSFRichTextString;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;public void excelExport() {//后端代码也很out,总之这段目的就是取到前端传的checkbox的值,然后加到sql筛选条件里String recordIds = request.getParameter("recordIds") == null ? "" : request.getParameter("recordIds");List<String> idList = Arrays.asList(recordIds.split(","));//......把idList作为筛选条件加到原来的列表sql里//得到最终的结果列表:resultList //注:构建resultList时,就要在需要换行的位置加入 \r\n 元素//开始构建exceltry {//1.在内存中创建一个excel文件HSSFWorkbook hssfWorkbook = new HSSFWorkbook();//2.创建工作簿HSSFSheet sheet = hssfWorkbook.createSheet();// 设置列宽sheet.setColumnWidth(0, 7000);sheet.setColumnWidth(1, 7000);sheet.setColumnWidth(2, 7000);sheet.setColumnWidth(3, 7000);sheet.setColumnWidth(4, 7000);sheet.setColumnWidth(5, 7000);sheet.setColumnWidth(6, 7000);sheet.setColumnWidth(7, 7000);//3.创建标题行HSSFRow titleRow = sheet.createRow(0);titleRow.createCell(0).setCellValue("列名0");titleRow.createCell(1).setCellValue("列名1");titleRow.createCell(2).setCellValue("列名2需要换行展示");titleRow.createCell(3).setCellValue("列名3");titleRow.createCell(4).setCellValue("列名4");titleRow.createCell(5).setCellValue("列名5");titleRow.createCell(6).setCellValue("列名6");titleRow.createCell(7).setCellValue("列名7");//4.遍历数据,创建数据行for (int i = 0; i < resultList.size(); i++) {Object[] objs = (Object[]) resultList.get(i);//获取最后一行的行号int lastRowNum = sheet.getLastRowNum();HSSFRow dataRow = sheet.createRow(lastRowNum + 1);dataRow.createCell(0).setCellValue(objs[0].toString());dataRow.createCell(1).setCellValue(objs[1].toString());//第3列需要换行展示,特殊处理如下:HSSFCell cell2 = dataRow.createCell(2);HSSFCellStyle cellStyle=hssfWorkbook.createCellStyle();cellStyle.setWrapText(true);cell2.setCellStyle(cellStyle);//前提:构建resultList时,就在objs[2]中相应位置加入了 \r\n 元素//HSSFRichTextString会自动识别 \r\n 元素进行换行展示cell2.setCellValue(new HSSFRichTextString(objs[2].toString()));dataRow.createCell(3).setCellValue(objs[3].toString());dataRow.createCell(4).setCellValue(objs[4].toString());dataRow.createCell(5).setCellValue(objs[5].toString());dataRow.createCell(6).setCellValue(objs[6].toString());dataRow.createCell(7).setCellValue(objs[7].toString());}//5.创建文件名String fileName = "excel名称.xls";//6.获取输出流对象response.setContentType("application/vnd.ms-excel;charset=UTF-8");response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1));ServletOutputStream outputStream = response.getOutputStream();//7.写出文件,关闭流hssfWorkbook.write(outputStream);outputStream.flush();outputStream.close();} catch (Exception e) {e.printStackTrace(); }}

导出效果

第三列换行了

PS:保险起见,这种测试数据也打厚码了,应该不影响看效果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。