导入导出封装工具类(二) jXLS Excel报表生成工具类

来源:互联网 发布:知乎 韩信 刘邦男宠 编辑:程序博客网 时间:2024/06/18 01:55

        这个工具类简单易学,相比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();StringxlsTemplateFileName=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等类型数据,可见它的扩展性还可以,支持常用数据类型导入导出操作,在选择实现方式时需要根据具体要求选择合适的工具才是最合适的。


0 0
原创粉丝点击