2019年1月4日

版权声明:本文为博主原创文章,未经博主允许不得转载,如需转载请在明显处标明出处! https://blog.csdn.net/qq_36291682/article/details/85753104

1月3日  修改了一天bug 主要是之前代码作者有点儿问题 进行了优化,还有一些业务上的修改 

有一个关于导出excel的问题 

            

//js 代码 
var form = $("<form>");//定义一个form表单
			form.attr('style', 'display:none');//设置为不展示
			form.attr('target', '');
			form.attr('method', 'post');
			form.attr('action', url);//url为后台请求的地址 
            //参数以input的方式 放入form中 params :{key:value}
for(var key in params){
	form.append(
          "<input  type='hidden' name='" + key + "' value='" + params[key] + "' />"           
     );
}
			$('body').append(form);//将表单放置在web中
			form.submit();//表单提交
			form.remove();//下载完成之后 删除form
 后台代码就不赘述了 不过有一点 
    String fileName = "测试";
    fileName=URLEncoder.encode(fileName,"UTF-8");
    response.setHeader("Content-disposition", "attachment;filename="+new 
    String(fileName.getBytes("UTF-8"),"iso-8859-1")+".xls");
    
    //有一些浏览器下载的时候会出现文件名称会出现乱码情况 
    //可以先把fileName编码 然后再getBytes 再转换成iso-8859-1
    //这样就可以解决乱码  当然可能还会出现其他乱码 那我暂时没遇到~
         

  下边是一个excel简单导出的util类 可能存在很多不足 但是基本的应用倒是没问题

/** 这是一个excel简单导出的util类 
 * Created by Lm  
 */
public class ExportMapExcel {
	/**
	 * 
	 * @param title  sheet页名称
	 * @param headersName 表格头名称
	 * @param headersId 表格头对应数据中Map的key
	 * @param dtoList   数据
	 * @param fileName  导出文件名称
	 * @param response
	 */
    @SuppressWarnings({ "rawtypes", "unchecked" })
	public void exportExcel(String title, List<String> headersName, List<String> headersId,
                            List<Map<String, Object>> dtoList,String fileName,HttpServletResponse response) {
        /*
               (一)表头--标题栏
         */
        Map<Integer, String> headersNameMap = new HashMap<Integer, String>();
        int key = 0;
        for (int i = 0; i < headersName.size(); i++) {
            if (!headersName.get(i).equals(null)) {
                headersNameMap.put(key, headersName.get(i));
                key++;
            }
        }
        /*
                (二)字段---标题的字段
         */
        Map<Integer, String> titleFieldMap = new HashMap<Integer, String>();
        int value = 0;
        for (int i = 0; i < headersId.size(); i++) {
            if (!headersId.get(i).equals(null)) {
                titleFieldMap.put(value, headersId.get(i));
                value++;
            }
        }
       /*
                (三)声明一个工作薄:包括构建工作簿、表格、样式
       */
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet(title);
        sheet.setDefaultColumnWidth(15);
        
        // 生成一个样式
        HSSFCellStyle style = wb.createCellStyle();
        HSSFRow row = sheet.createRow(0);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        HSSFCell cell;
        Collection c = headersNameMap.values();//拿到表格所有标题的value的集合
        Iterator<String> headersNameIt = c.iterator();//表格标题的迭代器
        /*
                (四)导出数据:包括导出标题栏以及内容栏
        */
        //根据选择的字段生成表头--标题
        int size = 0;
        while (headersNameIt.hasNext()) {
            cell = row.createCell(size);
            cell.setCellValue(headersNameIt.next().toString());
            cell.setCellStyle(style);
            size++;
        }
        //表格一行的字段的集合,以便拿到迭代器
        Collection zdC = titleFieldMap.values();
        Iterator<Map<String, Object>> titleFieldIt = dtoList.iterator();//总记录的迭代器
        int zdRow = 1;//真正的数据记录的列序号
        while (titleFieldIt.hasNext()) {//记录的迭代器,遍历总记录
            Map<String, Object> mapTemp = titleFieldIt.next();//拿到一条记录
                row = sheet.createRow(zdRow);
                zdRow++;
                int zdCell = 0;
                Iterator<String> zdIt = zdC.iterator();//一条记录的字段的集合的迭代器
                while (zdIt.hasNext()) {
                    String tempField =zdIt.next();//字段的暂存
                    if (mapTemp.get(tempField) != null) {
                    	Object valueObj = mapTemp.get(tempField);
                    	boolean isNum  = false;
                    	if(valueObj != null && !"".equals(valueObj)){
                            isNum = valueObj.toString().matches("^(-?\\d+)(\\.\\d+)?$");
                    	}
                    	if(isNum){//数字
                    		row.createCell(zdCell).setCellValue(Double.valueOf(StrUtil.ObjToStr(mapTemp.get(tempField))));//写进excel对象
                    	}else{
                    		row.createCell(zdCell).setCellValue(String.valueOf(mapTemp.get(tempField)));//写进excel对象
                    	}
                        zdCell++;
                    }
                }
        }
        
        try {
        	response.setContentType("application/vnd.ms-excel;charset=UTF-8");
        	response.setCharacterEncoding("utf-8");
        	fileName=URLEncoder.encode(fileName,"UTF-8");
        	response.setHeader("Content-disposition", "attachment;filename="+new String(fileName.getBytes("UTF-8"),"iso-8859-1")+".xls");
        	OutputStream out = response.getOutputStream();
        	wb.write(out);
        	out.flush();
        	out.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

昨天晚上抽空听了李智慧老师(《大型网站技术架构核心原理与案例分析》作者)的一个小小直播 ,他说在工作中要有输出,这个输出点到了我 ,他说的输出不是简简单单的踏踏实实的上班,他说的输出的意思是要有一些自己的作品,让别人可以或者说愿意去消费的作品,这样自己才能进步。 是啊 我工作快三年了 有什么输出呢  最多的输出就是在CSDN写一些小问题的解决方案 那还是抄来抄去的文章....

输出这个事情说简单也简单,说难也难,我感觉我现在的任务还是要再继续学习,多看视频,多看文章,多写代码,多学习。输出的话,我想继续写CSDN,把自己遇到的一些问题和解决方案拿出来分享一下,这也算是一种小小的输出吧。

听老师的直播很有感慨,感觉自己还是很差劲的,可能我是那种努力之后才能赶上或者说不至于落后别人的人,但是努力总归是没错的吧。所以呢还是要用闲杂时间来学习、输出、提升自己。 

不生活在安逸区,不做温水里的青蛙,要时刻保持头脑清晰,知道去做什么,知道该做什么。

猜你喜欢

转载自blog.csdn.net/qq_36291682/article/details/85753104