这个工具类简单易学,相比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里面,该类封装了查询提供一个方法exec(string sql)执行语句,可以再表格中写类似于EL表达式的标签写法。
如下面是我写的模板文件
下面是执行效果,
记的在基础系统里面有课表设计,觉得如果课表用这个来设计会会简单很多,相比java专业报表会好实用,可以自己先用excel设计好课表的模板文件,剩下的就是往模板里面添加数据,添加数据也是通过变量来添加,相对于复杂的jasper等报表设计器这个工具使用简单、容易使用,每个工具都有自己的优势与略施,充分利用工具的优势才会真正的得其所用、物有所值。
同样也需要看到别人的优势,让自己的优势保持,弥补不足,互相学习成长。
项目只需要做导出功能,并没有做导入看了看导入原理也一样,上面只是jXLS一小部分功能,使SQL语句如何查询,当然可以接受我们常常使用的数据如list、collection、map等类型数据,可见它的扩展性还可以,支持常用数据类型导入导出操作,在选择实现方式时需要根据具体要求选择合适的工具才是最合适的。