zoukankan      html  css  js  c++  java
  • 导入导出封装工具类(二) jXLS Excel报表生成工具类

            这个工具类简单易学,相比JXL、POI实现导入导出容易实现而且效果也很好,无论是使用JXL还是POI封装导出都需要些很多的代码、代码量很大,如果想要添加复杂样式和效果会更复杂一些。

           这是它的官网地址;http://sourceforge.net/projects/jxls/ 可以去官网下载

    当然各有各的好处这个类虽然可以很好的实现导出到excel,它的使用侧重于导出数据、类似于报表的数据、美观实用的excel表格,看下面这样的导出效果用它实现会很方便,而用POI会稍微费费事。


                 上面的效果如果用POI封装实现会比较麻烦,我们以上面的图为例说一下,怎么使用这个工具类生成类似于上面的excel表格。

    SQL语句EXCEL模板

                将SQL语句写在EXCEL模板里面生成新的excel会从模板生成,以下是我用写好的一个模板,根据这个模板导出一个excel,说一下这个过程:

    1.      写一个SQL模板

    2.      获取模板的绝对路径

    3.      根据绝对路径得到输入流

              a)        一般有了输入流,输出到哪里都可以,这也是为什么新需要获取到输入流因为要把文件输出到界面,也就是点击导出EXCEL时可以弹出一个下载框。

    4.将类注入到map中,

    5.将根据map、输入流生成导出EXCEL文件

    /**
         * @deprecated  导出方法,传入参数为模板名称,该参数从界面传入,支持SQL语句参数查询
         * @author      lls 
         */
        public void exportJXLS(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
    	{
    
    		Map submap = this.filterRequestParameterMap(request);
    		//获取传入的模板名称
    		String xlsTemplateName=(String)submap.get("TemplateName");
    		
    		//获取到导出模板的绝对全路径
    		String xlsTemplateFileNameURI=this.getClass().getClassLoader().getResource("excelTemplate/"+xlsTemplateName+".xls").toString();
    		String	xlsTemplateFileName=xlsTemplateFileNameURI.substring(6,xlsTemplateFileNameURI.length());
    
    		try {
    			//获取连接对象
    			Connection conn=null;
    			conn=jdbcUtil.getConnection();
    			//将报表实现类注入到submap中
                ReportManager rm = new ReportManagerImpl( conn, submap );
                submap.put("rm", rm);
    			//获取模板的输入流
    			InputStream is =new BufferedInputStream(new FileInputStream(xlsTemplateFileName));
    			//通过模板输入流以及报表实现类生成一个excel工作簿
    			XLSTransformer transformer = new XLSTransformer();
    			HSSFWorkbook workbook=(HSSFWorkbook)transformer.transformXLS(is, submap);
    			//弹出框保存工作簿
    			saveExcelFile(workbook,xlsTemplateName,response);
    			
    			jdbcUtil.close(conn);
    		}catch (Exception e) {
    			
    			e.printStackTrace();
    		}
    	}
        /**
         * @deprecated                   弹出框保存工作簿
         * @param hssWorkbook            工作簿
         * @param xlsTemplateName        下载的工作簿名称
         * @param response
         */
        private void saveExcelFile(HSSFWorkbook hssWorkbook ,String xlsTemplateName,HttpServletResponse response)
        {
    		
    		//设置导出弹出框,以及下载文件名称
    		response.setHeader("Content-Disposition","attachment;filename="+xlsTemplateName+".xls");
    		
    		OutputStream os;
    		try {
    			os = response.getOutputStream();
    			hssWorkbook.write(os);
    			os.flush();  
    			os.close();  
    			
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    }
    

             PS:两点需要注意一是获取输入流需要一个文件的地址,比如写好的模板你要知道放到哪里了,这里我是用this.getClass().getClassLoader().getResource这个方法得到它的绝对路径,再根据绝对路径根据new FileInputStream(xlsTemplateFileName)得到输入流。

    而是执行SQL语句原理是将ReportManagerImpl类放到了map里面,该类封装了查询提供一个方法execstring sql)执行语句,可以再表格中写类似于EL表达式的标签写法。

              如下面是我写的模板文件



              下面是执行效果,


               记的在基础系统里面有课表设计,觉得如果课表用这个来设计会会简单很多,相比java专业报表会好实用,可以自己先用excel设计好课表的模板文件,剩下的就是往模板里面添加数据,添加数据也是通过变量来添加,相对于复杂的jasper等报表设计器这个工具使用简单、容易使用,每个工具都有自己的优势与略施,充分利用工具的优势才会真正的得其所用、物有所值。

               同样也需要看到别人的优势,让自己的优势保持,弥补不足,互相学习成长。

               项目只需要做导出功能,并没有做导入看了看导入原理也一样,上面只是jXLS一小部分功能,使SQL语句如何查询,当然可以接受我们常常使用的数据如list、collection、map等类型数据,可见它的扩展性还可以,支持常用数据类型导入导出操作,在选择实现方式时需要根据具体要求选择合适的工具才是最合适的。


  • 相关阅读:
    Visual Studio2019安装步骤
    写在第一页的话
    数状数组
    hdu 3501 数学题
    静态邻接表
    最长子序列
    hdu 1094 所想到的
    bellman_ford
    郁闷的一晚
    SPFA + 静态邻接表 模板
  • 原文地址:https://www.cnblogs.com/lilongsheng1125/p/4978522.html
Copyright © 2011-2022 走看看