不管是xml的导入和导出还是Excel的导入和导出,对应的无非都是文件的解析和下载,下面来讲解的主要是导出(下载)

导入:上传---》解析并组装javaBean(javaBeanList)--》插入数据库(多数为数据库)


导出: 查询需要下载的数据--》将JavaBean生成对应的文件(eg:xml、poi、json等)--》下载



  • poi导出--即下载poi
  • 前台:
  • 下载form表单提交(下载不可以采用ajax提交)(form表单提交查看常识题中form表单的几种提交方式,即给form标签一个id,根据id获取的对象值.action属性或者是采用.attr(“action”,url路径的方式),注意,提交方式为post,不然会发生汉字乱码的问题)
    ===============form表单提交的几种方式=========== 。。。。。。。。。。。第一种方法。。。。。。。。。。。。。。。。。。

1.给form定义一个id,通过jquery获取对应的form表单的数据

2.通过jquery中的一个attr("属性",属性值)给action属性赋值,同理,即可以对method属性赋值

3.通过jquery的一个submit()方法提交


$(function(){    
    $('#exportId').bind('click', function(){    
        $.messager.confirm('您正在操作导出poi','您确定继续执行该操作吗?',function(r){
            if(r){
                $("#userInfoId").attr("action","<%=request.getContextPath()%>/user/exportUser.action");
                $("#userInfoId").submit();
            }else{
                $.messager.alert('提示','您取消了该操作!')
            }
        })

    });    
});

。。。。。。。。。。第一种方法结束。。。。。。。。。。。。。。。。。。。

。。。。。。。。。。。第二种方法开始。。。。。。。。。。。。。。。。。。

1.通过原生js获取数据值

2.给action赋值

3.给method赋值

4.submit提交

function poiExcel_() {
           $.messager.confirm("提示","确认要下载吗?",function(r){
                  if(r){
                     $.messager.alert('提示','下载成功!');   
                    var v_productForm = document.getElementById("esayui_poi_list_id");
                    v_productForm.action = "<%=request.getContextPath()%>/esayui/poiExcel.jhtml";
                    v_productForm.submit();
                  }else {
                     $.messager.alter('提示','下载失败!');
                  }
               });
    }

。。。。。。。。。。。第二种方法结束。。。。。。。。。。。。。。。。。。

  • 下载按钮,下载的合理提示,查看,需要下载成的样式,及需要的条件


  • 后台:
  • 根据条件查询集合数据
  • 创建webwork工作薄对象
  • 通过工作薄对象创建sheet
  • 通过sheet创建row
  • 通过row创建cell
  • 列的赋值及样式的设置
  • 合并单元格(开始行,结束行,开始列,结束列)
  • 图片的设置
  • 文本样式
  • 下载
  • 通过response进行相依下载

  • 项目结合,本项目的需求主要是,两张表的联查(产品表与品牌表),要求每个sheet对应的是品牌,excel中的内容标题是XX品牌展示,内容是拥有该品牌的所有产品,要求样式的设置及图片的设置
  • 案例
  • poi导出excel,三大步骤
    1.根据需求查询
    2.创建workbook
    3.下载
@RequestMapping(value="/downloadXLS",method=RequestMethod.POST)
    public void downloadXLS(Product product,HttpServletRequest request,HttpServletResponse response) {
        //根据查询条件查询产品表集合
        List<Product> productList=productService.findProductList(product);
        //根据查询条件查询品牌表集合
        List<Brand> brandList=brandService.findBrandList();
        //3.创建workbook
        HSSFWorkbook workBook =new HSSFWorkbook();
        //下载
        createExcelPoi(productList,brandList, workBook,request, response);
    }
  • 创建excel
    1.循环获取对应的需求条件
    2.根据workBook创建sheet
    3.createTitle(sheet, brand.getBrandName());根据sheet创建row,根据row创建cell
    4.标题头的样式设置
    5.内容标题头的创建
    6.根据行创建表头(主体内容),并赋值
    7.导出下载
private void createExcelPoi(List<Product> productList, List<Brand> brandList, HSSFWorkbook workBook,HttpServletRequest request,HttpServletResponse response) {
		for (int i=0;i<brandList.size();i++) {
			Brand brand = brandList.get(i);
			List<Product> eligibilityBrand = returnStudentList(productList,brand);
			if(eligibilityBrand.size()>0) {
				//根据workBook创建sheet
				HSSFSheet sheet = workBook.createSheet(brand.getBrandName()+"("+eligibilityBrand.size()+"个)");
				createTitle(sheet, brand.getBrandName());
				//标题头的样式设置
				HSSFCellStyle style=buildStyleTitle(workBook, sheet); 
				
				//标题头
				HSSFCell titleCell = buildTitleLike(brandList,i,sheet);
				titleCell.setCellStyle(style);
				//根据行创建表头,并赋值
				buildHeadRow(sheet,workBook);
				
				//根据行创建表头,并赋值
				buildHeadRow(sheet,workBook);
				//表头创建后,在表头后创建获值值对应的行列及赋值
				for (int j = 0; j < eligibilityBrand.size(); j++) {
					Integer id = eligibilityBrand.get(j).getId();
					Long totalCount=productService.findBrandCountByProductId(id);
					buildMainbody(eligibilityBrand,totalCount,request, workBook, sheet, j);
				}
			}
			
		}
		//导出Excel
		SimpleDateFormat sim=new SimpleDateFormat("yyyyMMddhhmmss");
		String strDate = sim.format(new Date());
		//随机数
		RandomStringUtils randomStringUtils=new RandomStringUtils();
		//生成指定长度的字母和数字的随机组合字符串
		String randomStr = randomStringUtils.randomAlphanumeric(5);
		String xlsName=	strDate+randomStr+"产品信息表.xls"	;
		FileUtil.downloadXLSFile(request, response, workBook, xlsName);
		
	}
  • 下载调用的封装方法FileUtil中的downloadXLSFile()
public static void downloadXLSFile(HttpServletRequest request, HttpServletResponse response, HSSFWorkbook workbook, String fileName) {
		OutputStream os = null;
		BufferedOutputStream bos = null;
		try {
	        os = response.getOutputStream(); //重点突出(特别注意),通过response获取的输出流,作为服务端往客户端浏览器输出内容的一个通道
	        bos = new BufferedOutputStream(os);
	        // 处理下载文件名的乱码问题(根据浏览器的不同进行处理)
	        if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > 0) {
	        	fileName = new String(fileName.getBytes("GB2312"),"ISO-8859-1");
	        } else { 
	        	// 对文件名进行编码处理中文问题
	  	        fileName = java.net.URLEncoder.encode(fileName, "UTF-8");// 处理中文文件名的问题
	  	        fileName = new String(fileName.getBytes("UTF-8"), "GBK");// 处理中文文件名的问题
	        }
	        response.reset(); // 重点突出    空白行的出现原因,jsp代码编译后产生。就是有jsp生成html文件的时候,html文件内部会出现很多空白行。下载后的文件内的空白行也是这样产生的。 
	        //因此,需要 response.reset() 来清除首部的空白行
	        response.setCharacterEncoding("UTF-8"); // 重点突出
	        response.setContentType("application/x-msdownload");// 不同类型的文件对应不同的MIME类型 // 重点突出
	        // inline在浏览器中直接显示,不提示用户下载
	        // attachment弹出对话框,提示用户进行下载保存本地
	        // 默认为inline方式
	        response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
	      //  response.setHeader("Content-Disposition", "attachment; filename="+fileName); // 重点突出
	        workbook.write(bos);
		} catch (Exception ex) {
			throw new RuntimeException(ex.getMessage());
		} finally {
			// 特别重要
	        // 1. 进行关闭是为了释放资源
	        // 2. 进行关闭会自动执行flush方法清空缓冲区内容
			try {
				if (null != bos) {
					bos.close();
					bos = null;
				}
				if (null != os) {
					os.close();
					os = null;
				}
			} catch (Exception ex) {
				throw new RuntimeException(ex.getMessage());
			}
		}
	}
  • 对应的是创建excel中的循环获取对应的需求条件
public List<Product> returnStudentList(List<Product> productList, Brand brand) {
			//3.循环品牌集合,产品集合对比,当存在时就定义一个解释集合接收
			List eligibilityList=new ArrayList();
			for (Product product : productList) {
				int id = product.getBrand().getId();
				System.out.println(id);
				int id2 = brand.getId();
				if(id == id2) {
					eligibilityList.add(product);
				}
			}
			return eligibilityList;
		}
  • 对应的是创建excel中的创建表头,根据sheet创建row,根据row创建cell
private void createTitle(HSSFSheet sheet, String brandName) {
			HSSFRow row = sheet.createRow(1);
			HSSFRow row_9 = sheet.createRow(3);
			HSSFCell titalCell = row.createCell(5);
			titalCell.setCellValue(brandName+"列表信息");
			
		}
  • 对应的是创建excel中的标题头的样式设置
private HSSFCellStyle buildStyleTitle(HSSFWorkbook workBook, HSSFSheet sheet) {
			//设置样式
			HSSFCellStyle style = workBook.createCellStyle();
			HSSFFont font  = workBook.createFont(); 
			font.setFontHeightInPoints((short) 28);//字号       
			font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗   
			font.setColor(HSSFColor.BLACK.index);//设置字体颜色
			font.setFontName("黑体"); // 将“黑体”字体应用到当前单元格上
			style.setFont(font);      
			style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//内容左右居中    	
			style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//内容上下居中 
			//背景信息
			style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
			style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
			//合并单元格
			sheet.addMergedRegion(new CellRangeAddress(1, 3, 5, 13));
			//设置列宽(给时间的单元格的宽度给大点,防止时间显示格式错误!)
			sheet.setColumnWidth(5, 20*256);
			sheet.setColumnWidth(6, 20*256);
			sheet.setColumnWidth(7, 20*256);
			sheet.setColumnWidth(8, 20*256);
			sheet.setColumnWidth(9, 20*256);
			sheet.setColumnWidth(10, 20*256);
			sheet.setColumnWidth(11, 20*256);
			return style;
		}
  • 对应的是创建excel中的内容标题头的创建
private void buildHeadRow(HSSFSheet sheet,HSSFWorkbook workBook) {
				
				//根据sheet创建行
				HSSFRow rowHead = sheet.createRow(4);
				//根据row创建cll
				HSSFCell idCell = rowHead.createCell(6);
				idCell.setCellValue("产品编号");
				HSSFCell nameCell = rowHead.createCell(7);
				nameCell.setCellValue("产品名称");
				HSSFCell priceCell = rowHead.createCell(8);
				priceCell.setCellValue("产品价格");
				HSSFCell brandCell = rowHead.createCell(9);
				brandCell.setCellValue("品牌名");
				HSSFCell imgCell = rowHead.createCell(10);
				imgCell.setCellValue("产品主图");
				HSSFCell pictureNumCell = rowHead.createCell(11);
				pictureNumCell.setCellValue("产品子图个数");
				HSSFCellStyle fontStyle = bulidFontStyleHead(workBook);
				idCell.setCellStyle(fontStyle);
				nameCell.setCellStyle(fontStyle);
				brandCell.setCellStyle(fontStyle);
				imgCell.setCellStyle(fontStyle);
				priceCell.setCellStyle(fontStyle);
				pictureNumCell.setCellStyle(fontStyle);
			}
  • 对应的是创建excel中的主体内容
private void buildMainbody(List<Product> productList,Long totalCount,HttpServletRequest request, HSSFWorkbook workBook, HSSFSheet sheet, int i) {
			//创建行,下标注意 
			HSSFRow contentRow = sheet.createRow(i+5);
			Product product = productList.get(i);
			//创建列
			HSSFCell idCell = contentRow.createCell(6);
			idCell.setCellValue(product.getId());
			HSSFCell nameCell = contentRow.createCell(7);
			nameCell.setCellValue(product.getProductName());
			HSSFCell priceCell = contentRow.createCell(8);
			priceCell.setCellValue(product.getProductPrice());
			if(product.getProductPrice()<50) {
				//年龄样式
				buildPriceStyle(workBook, priceCell);
			}else if(product.getProductPrice()>100){
				buildPriceMaxStyle(workBook, priceCell);
				}
			HSSFCell brandNameCell = contentRow.createCell(9);
			brandNameCell.setCellValue(product.getBrand().getBrandName());
			HSSFCell imgCell = contentRow.createCell(10);
			buildImgUrl(workBook,request, sheet, i, product, imgCell);
			HSSFCell imgPrictureCell = contentRow.createCell(11);
			imgPrictureCell.setCellValue(totalCount);
			HSSFCellStyle fontStyle = bulidFontStyleHead(workBook);
			idCell.setCellStyle(fontStyle);
			nameCell.setCellStyle(fontStyle);
			brandNameCell.setCellStyle(fontStyle);
			imgPrictureCell.setCellStyle(fontStyle);
			imgCell.setCellStyle(fontStyle);
			}
  • 对应的是主体内容中的价格的样式
private void buildPriceStyle(HSSFWorkbook workBook, HSSFCell ageCell) {
			//设置样式
			HSSFCellStyle style = workBook.createCellStyle();
			HSSFFont font  = workBook.createFont(); 
			font.setFontHeightInPoints((short) 11);//字号       
			//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗   
			font.setColor(HSSFColor.RED.index);//设置字体颜色
			font.setFontName("宋体"); // 将“黑体”字体应用到当前单元格上
			style.setFont(font);      
			style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//内容左右居中    	
			style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//内容上下居中
			ageCell.setCellStyle(style);
		}
  • 对应的是主体内容中的最大价格的样式
private void buildPriceMaxStyle(HSSFWorkbook workBook, HSSFCell ageCell) {
			//设置样式
			HSSFCellStyle style = workBook.createCellStyle();
			HSSFFont font  = workBook.createFont(); 
			font.setFontHeightInPoints((short) 11);//字号       
			//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗   
			font.setColor(HSSFColor.BLUE.index);//设置字体颜色
			font.setFontName("宋体"); // 将“黑体”字体应用到当前单元格上
			style.setFont(font);      
			style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//内容左右居中    	
			style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//内容上下居中
			ageCell.setCellStyle(style);
		}
  • 对应的是标题的样式
private HSSFCellStyle bulidFontStyleHead(HSSFWorkbook workBook) {
			//设置样式
			HSSFCellStyle style = workBook.createCellStyle();
			HSSFFont font  = workBook.createFont(); 
			font.setFontHeightInPoints((short) 11);//字号       
			//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗   
			//font.setColor(HSSFColor.RED.index);//设置字体颜色
			font.setFontName("宋体"); // 将“黑体”字体应用到当前单元格上
			style.setFont(font);      
			style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//内容左右居中    	
			style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//内容上下居中
			return style;
		}
  • 对应的图片的设置
private void buildImgUrl(HSSFWorkbook workBook,HttpServletRequest request, HSSFSheet sheet, int i, Product product, HSSFCell imgUrlCell) {
			BufferedImage bufferImg = null; 
			File file=new File(request.getSession().getServletContext().getRealPath(product.getProductUrl()));
			if(file!=null && file.length()>0){
				 ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();     
			        try {
						bufferImg = ImageIO.read(file);
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}     
			        try {
						ImageIO.write(bufferImg, "jpg", byteArrayOut);
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}  
			      //画图的顶级管理器,一个sheet只能获取一个(一定要注意这点)  
			        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();     
			        //anchor主要用于设置图片的属性  
			       // HSSFClientAnchor anchor = new HSSFClientAnchor(dx1, dy1, dx2, dy2, col1, row1, col2, row2)
			        HSSFClientAnchor anchor = new HSSFClientAnchor(11, i+11, 255, 255,(short) 10, 5+i, (short) 10, 5+i);     
			        anchor.setAnchorType(3);     
			        //插入图片    
			       // HSSFPicture path = patriarch.createPicture(anchor, workbook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));   
			       /* fileOut = new FileOutputStream("D:/测试Excel.xls");     
			        // 写入excel文件     
			         wb.write(fileOut);     */
			        imgUrlCell.equals( patriarch.createPicture(anchor, workBook.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG)));
			}
		}