zoukankan      html  css  js  c++  java
  • 浏览器js调用后端java服务模块下载excel文档到本地

    自由自在,废话省略

    因为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:

      

  • 相关阅读:
    PAT甲级——A1006 Sign In and Sign Out
    PAT甲级——A1005 Spell It Right
    左神算法书籍《程序员代码面试指南》——1_05用一个栈实现另一个栈的排序
    左神算法书籍《程序员代码面试指南》——1_03如何使用递归函数和栈操作逆序一个栈
    PAT甲级——A1004 Counting Leaves
    PAT甲级——A1003Emergency
    Dijkstra算法
    PAT甲级——A1002 A+B for Polynomials
    PAT甲级——A1001A+BFormat
    Oil Deposits UVA
  • 原文地址:https://www.cnblogs.com/adao21/p/12512693.html
Copyright © 2011-2022 走看看