导入导出封装工具类(二) 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等类型数据,可见它的扩展性还可以,支持常用数据类型导入导出操作,在选择实现方式时需要根据具体要求选择合适的工具才是最合适的。


原文地址:https://www.cnblogs.com/lilongsheng1125/p/4978522.html