poi导出Excel与项目的结合-案例(包含图片的设置)

不管是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)));
    			}
    		}
时间: 2024-08-11 22:38:26

poi导出Excel与项目的结合-案例(包含图片的设置)的相关文章

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

POI导出EXCEL经典实现

在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI.这里我们用Apache POI!我们先去Apach

POI导出EXCEL经典实现(转)

http://www.cnblogs.com/xwdreamer/archive/2011/07/20/2296975.html 1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 POI 的功能. 2.POI结构 HSSF - 提供读写Microsoft Excel XLS格式档案的功能.XS

poi导出excel

Java使用poi组件导出excel报表,能导出excel报表的还可以使用jxl组件,但jxl想对于poi功能有限,jxl应该不能载excel插入浮动层图片,poi能很好的实现输出excel各种功能,介绍poi导出excel功能实现案例,算比较常用的功能实现以及导出excel需要注意的地方,采用的是poi-3.8-20120326.jar,poi-ooxml-3.8-20120326.jar,poi-scratchpad-3.8-20120326.jar 输出表格 poi输出excel最基本是输

Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框

在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI.这里我们用Apache POI!我们先去Apach

java中使用poi导出excel表格数据并且可以手动修改导出路径

在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下 jar包下载路径:http://download.csdn.net/download/pumpkin09/7077011 第二步:添加poi导出工具类 1 package com.yjd.admin.util; 2 3 import java.io.IOException; 4 import ja

Java POI 导出EXCEL经典实现 Java导出Excel

转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有

基于POI导出Excel数据

基于POI导出Excel数据 在项目中会有许多报表业务,需要导出数据.在这里我们采用基于POI的方式解析.POI有俩种解析方式HSSF(xls格式)和XSSF(xlsx). 以BOS物流的运单管理界面为例: 前端代码 导出运单信息,生成报表: 1.添加导出按钮 2.添加导出事件 后台代码实现 POI生成Excel步骤写Excel过程一样,新建Excel文档----新建Sheet---新建Row---新建Cell单元格---写单元格数据. Maven导入jar包信息请参加一键上传里面的配置 Act

重构:以Java POI 导出EXCEL为例

重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的了解重构的意义. 什么是重构? <重构:改善既有代码的设计>这本书中将重构以名词和动词形式进行解释,如下 重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本. 重构(动词):使用一系列重构的手法,在不改变软件可观察行为的前提下,调整其结构.