自由自在,废话省略
因为excel文档是一部分需要自动填充,另外一部分 需要手动写入,所以后端只获取存在于数据库中的数据,
1.生成文档结构(一行数据)如下:
2.后端生成excel代码:
package com.adao.review.service; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.CellStyle; import com.linyang.review.util.ExcelUtil; /** * * 生成excel文件相关逻辑 * * @author TT 2020-03-14 */ public class FileService { public String createExcel(Map<String, String> dataMap) { System.out.println("Create excel start ... "); // 定义文档标题以及对应dataMap的key final String[] titles = { "[责任人]*", "流程状态*", "标题", "描述和建议", "所属项目", "严重性", "提出人", "派生来源", "[关联对象]", "[对象编号]", "评审点", "附件" }; final String[] attrs = { "owner", "status", "flowName", "advise", "project", "ponderance", "creator", "source", "object", "code", "point", "accessory" }; FileOutputStream output = null; String sheetName = "sheet"; String fileName = dataMap.get("flowName")+"-评审缺陷模板"; String fileParentpath = "D:\Program Files\power\temp\"; File file = new File(fileParentpath + fileName + ".xls"); // 创建HSSFWorkbook对象 HSSFWorkbook wb = exportExcel(dataMap, sheetName, titles, attrs); try { if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } // 生成或者覆盖 file.createNewFile(); output = new FileOutputStream(file); wb.write(output); output.flush(); System.out.println("Create excel :" + file.toString()); } catch (Exception e) { System.out.println("error :" + e); } finally { try { if (output != null) { output.close(); } } catch (IOException e) { System.out.println("error :" + e); } } return file.getName(); } public static HSSFWorkbook exportExcel(Map<String, String> datas, String sheetName, String[] titles, String[] attrs) { HSSFWorkbook wb = new HSSFWorkbook(); // 创建HSSFWorkbook对象 HSSFSheet sheet = ExcelUtil.createSheet(wb, sheetName); HSSFRow r; // 行 HSSFCell c; // 列 CellStyle headcs = wb.createCellStyle(); // 表头样式实例 CellStyle bodycs = wb.createCellStyle(); // 内容样式实例 bodycs.setDataFormat(wb.createDataFormat().getFormat("@")); // 设置报表内容为文本 // System.out.println("titles.length" + titles.length); // 1、标题设置 r = sheet.createRow((int) 0); for (int i = 0; i < titles.length; i++) { c = r.createCell(i); c.setCellValue(titles[i]); c.setCellStyle(ExcelUtil.createHeadCellStyle(wb, headcs)); } // 2、表格内容填充以及样式设置 r = sheet.createRow((int) 1); for (int j = 0; j < titles.length; j++) { String attr = attrs[j]; String attrValue = getStrFromMap(attr, datas, ""); c = r.createCell(j); c.setCellValue(attrValue); c.setCellStyle(ExcelUtil.createBodyCellStyle(bodycs)); } // copy,多生成一行 r = sheet.createRow((int) 2); for (int j = 0; j < titles.length; j++) { String attr = attrs[j]; String attrValue = getStrFromMap(attr, datas, ""); c = r.createCell(j); c.setCellValue(attrValue); c.setCellStyle(ExcelUtil.createBodyCellStyle(bodycs)); } sheet.autoSizeColumn((short) 2); // 调整第三列宽度 sheet.autoSizeColumn((short) 4); // 调整第五列宽度 return wb; } /** * 从获取数据中进行查找对应,没有的值为空 * @param name * @param map * @param defaultValue * @return */ public static String getStrFromMap(String name, Map<String, String> map, String defaultValue) { try { String value = map.get(name); if (value == null) { return defaultValue; } else { return value.toString(); } } catch (Exception e) { return defaultValue; } } }
public class ExcelUtil { public static HSSFSheet createSheet(HSSFWorkbook wb, String sheetName){ HSSFSheet sheet = wb.createSheet(sheetName); sheet.setDefaultColumnWidth(12); sheet.setGridsPrinted(false); //表格阴影取消 (这一条坑了我很久),不注销的话生成的excel空白处都是白板,没有阴影 // sheet.setDisplayGridlines(false); return sheet; } /** * 创建表头CellStyle样式 * @param wb HSSFWorkbook对象 * @param cs cellStyle实例 * @return */ public static CellStyle createHeadCellStyle(HSSFWorkbook wb, CellStyle cs){ cs.setBorderBottom(CellStyle.BORDER_THIN); // 设置border cs.setBorderLeft(CellStyle.BORDER_THIN); cs.setBorderRight(CellStyle.BORDER_THIN); cs.setBorderTop(CellStyle.BORDER_THIN); cs.setAlignment(CellStyle.ALIGN_CENTER); // 设置水平对齐 Font f = wb.createFont(); // 设置字体 f.setBoldweight(Font.BOLDWEIGHT_BOLD); // f.setFontHeightInPoints((short) 11); // 大小 cs.setFont(f); cs.setFillForegroundColor((short) 13); return cs; } /** * 创建表格内容CellStyle样式 * @param cs cellStyle实例 * @return */ public static CellStyle createBodyCellStyle(CellStyle cs){ cs.setBorderBottom(CellStyle.BORDER_THIN); // 设置border cs.setBorderLeft(CellStyle.BORDER_THIN); cs.setBorderRight(CellStyle.BORDER_THIN); cs.setBorderTop(CellStyle.BORDER_THIN); cs.setAlignment(CellStyle.ALIGN_CENTER); // 设置水平对齐 cs.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 设置垂直对齐 cs.setWrapText(false); // 设置是否自动换行 return cs; } }
3.前端增加按钮进行下载导出,后端返回给前端文件路径,前端获取并调用下载。可以使用三种方式
附上添加按钮操作代码,
objectId为前端调用后端时,给后端传的关键参数
var rdm_url = window.location.href; //console.info(rdm_url); if(rdm_url.indexOf("/pages/workflow/entityTab.jsf?workflowType=REW&objectId=")>0){ //debugger; initScript([powerPath + "scripts/workflow/entity.js"]); //调用方法 地址栏名字是什么就传什么参数 var objectId = getObjectId(rdm_url); var domain = getDomain(rdm_url); //console.info('---------------------------------'); //console.info(objectId); //console.info(domain); //console.info('---------------------------------'); var $list = $(".dropdown-menu-list ul"); var h = "<li onclick='exportEntityTem();' val='Export Template' class='dropdown-menu-list-item'><a class='dropdown- menu-list-item-link' style='padding-bottom: 6px; padding-top: 6px;'><div class='dropdown-menu-list-item-div' onmouseover='showCommonTip($(this))' title='导出为缺陷评审模板' style=' 109px;'>导出为缺陷评审模板</div></a></li>"; $list.append(h); function exportEntityTem(){ //debugger; labelCall("com.linyang.review.ReviewExport","exportToTemplate",[objectId],function(d){ if(d){ var url= domain + "temp/" + d ; // rdmAlert("url = " +url ); console.log("url = " +url ); //下载文件 downloadFile(url); }else{ rdmAlert("download fail"); } }); } } function downloadFile(url){ //定义一个form表单,通过form表单来发送请求 var form=$("<form>"); //设置表单状态为不显示 form.attr("style","display:none"); //method属性设置请求类型为post form.attr("method","post"); //action属性设置请求路径, //请求类型是post时,路径后面跟参数的方式不可用 //可以通过表单中的input来传递参数 form.attr("action",url); $("body").append(form);//将表单放置在web中 //在表单中添加input标签来传递参数 //如有多个参数可添加多个input标签 var input1=$("<input>"); input1.attr("type","hidden");//设置为隐藏域 //input1.attr("name","id");//设置参数名称 //input1.attr("value","123");//设置参数值 form.append(input1);//添加到表单中 form.submit();//表单提交 } //获取参数objectId function getObjectId(rdm_url) { // var query = window.location.search.substring(1); var vars = rdm_url.split("&"); for (var i=0;i<vars.length;i++) { var pair = vars[i].split("="); if(pair[0] =='objectId'){ return pair[1]; } } return(false); } //获取服务域名 function getDomain(rdm_url){ var var1s = rdm_url.split(":"); var var2s = var1s[2].split("/"); var address = var1s[0] + ":" + var1s[1]; var port = var2s[0] ; var domain = address + ":" + port + "/" ; //console.log("domain = " + domain); return domain ; }
另外 downloadFile方法为post方法,另外提供其他几种方法
//get //例如:url为htpp://127.0.0.1/test function downloadFile(url){ //定义一个form表单,通过form表单来发送请求 var form=$("<form>"); //设置表单状态为不显示 form.attr("style","display:none"); //method属性设置请求类型为get form.attr("method","get"); //action属性设置请求路径,(如有需要,可直接在路径后面跟参数) //例如:htpp://127.0.0.1/test?id=123 form.attr("action",url); //将表单放置在页面(body)中 $("body").append(form); //表单提交 form.submit(); } //window.open 该方式许多浏览器不兼容,会出现打开新标签并关闭的效果。且txt、xml等文本文件浏览器会自动解析, window.open("htpp://127.0.0.1/test.rar"); //download.js 改方法也是可行的,没有亲测。 具体请看官网:http://danml.com/download.html
-------------------------------------------------- 更新 2020.4.18
程序运行过程中发现 如果对某一个字段需要单独处理的时候,需要做一些修改 ,将单元格的样式全部放在了方法体内。这样保证每个单元格处理相互不会影响。
public static HSSFWorkbook exportExcel(Map<String, Object> datas, String sheetName, String[] titles, String[] attrs) { HSSFWorkbook wb = new HSSFWorkbook(); // 创建HSSFWorkbook对象 HSSFSheet sheet = ExcelUtil.createSheet(wb, sheetName); HSSFRow row; // 行 HSSFCell c; // 列 CellStyle bodycs = wb.createCellStyle(); // 内容样式实例 bodycs.setDataFormat(wb.createDataFormat().getFormat("@")); // 设置报表内容为文本 List<String> adviceList = new ArrayList<String>(); adviceList = (List<String>) datas.get("adviceList"); // 1、标题设置 // 表头样式实例 row = sheet.createRow((int) 0); for (int i = 0; i < titles.length; i++) { if (5 == i) { ExcelUtil.createHeadCellStyleRed(wb, row, i, titles[i]); } else { ExcelUtil.createHeadCellStyle(wb, row, i, titles[i]); } } // 需要多行内容 String adviceKey = null; String adviceValue = null; int bodyRow = adviceList.size(); if (0 == adviceList.size() || null == adviceList) { bodyRow = 1; } for (int i = 1; i < bodyRow + 1; i++) { int k = 1; if (!adviceList.isEmpty()) { for (String str : adviceList) { if (i == k) { String[] adviceArr = str.split("="); adviceKey = adviceArr[0]; adviceValue = adviceArr[1]; } k++; } } row = sheet.createRow((int) i); for (int j = 0; j < titles.length; j++) { String attr = attrs[j]; String attrValue = getStrFromMap(attr, datas, ""); if (2 == j) { attrValue = StringUtil.strFormatNormal(adviceValue); ExcelUtil.createBodyCellStyleLeft(wb, row, j, attrValue); } if (7 == j) { attrValue = StringUtil.strFormatNormal(adviceKey); ExcelUtil.createBodyCellStyle(wb, row, j, attrValue); } else { ExcelUtil.createBodyCellStyle(wb, row, j, attrValue); } } } // 设置sheet样式等 setSheetStyle(sheet, bodyRow); return wb; }
/** * 创建表头CellStyle样式 * * @param wb HSSFWorkbook对象 * @param r HSSFRow实例 * @param i 单元格编号 * @param value 单元格内容 * */ public static void createHeadCellStyle(HSSFWorkbook wb, HSSFRow r, int i, String value) { HSSFCell cell = r.createCell(i); // 设置字体 Font font = wb.createFont(); font.setBoldweight(Font.BOLDWEIGHT_BOLD);//加粗 // font.setFontHeightInPoints((short) 11); // 大小 // 设置style CellStyle style = wb.createCellStyle(); style.setBorderBottom(CellStyle.BORDER_THIN); // 设置border style.setBorderLeft(CellStyle.BORDER_THIN); style.setBorderRight(CellStyle.BORDER_THIN); style.setBorderTop(CellStyle.BORDER_THIN); style.setAlignment(CellStyle.ALIGN_CENTER); // 设置水平对齐 style.setFillForegroundColor((short) 13); style.setFont(font); cell.setCellStyle(style); cell.setCellValue(value); } /** * 创建表头CellStyle样式 红色字体 * * @param wb HSSFWorkbook对象 * @param r HSSFRow实例 * @param i 单元格编号 * @param value 单元格内容 * */ public static CellStyle createHeadCellStyleRed(HSSFWorkbook wb, HSSFRow r, int i, String value) { HSSFCell cell = r.createCell(i); // 设置字体 Font font = wb.createFont(); font.setBoldweight(Font.BOLDWEIGHT_BOLD); //redFont.setFontName("宋体"); // font.setFontHeightInPoints((short) 11); // 大小 font.setColor(Font.COLOR_RED);//红色 // 设置style CellStyle style = wb.createCellStyle(); style.setBorderBottom(CellStyle.BORDER_THIN); // 设置border style.setBorderLeft(CellStyle.BORDER_THIN); style.setBorderRight(CellStyle.BORDER_THIN); style.setBorderTop(CellStyle.BORDER_THIN); style.setAlignment(CellStyle.ALIGN_CENTER); // 设置水平对齐 style.setFillForegroundColor((short) 13); style.setFont(font); cell.setCellStyle(style); cell.setCellValue(value); return style; }
ex: