导出报表 ireport 与 poi

</pre>导出报表 ireport 与 poi <p></p><p></p><p>项目需要,制作各种表格,尝试了这两种报表工具,ireport 与poi 都能完成你想要的表格,功能都很强大。</p><p></p><p>1. 配置</p><p>     ireport  必须安装ireport 客户端,具体可以参考网上资源。而poi 没有这个步骤。当然都需要在intellij (或eclipse)上导包,pom.xml 中配置,版本号对应下载的包是同一给版本。</p><p></p><p>2. 写查询语句</p><p>ireport 即在其客户端写查询语句,并按照需求编排字段,这个步骤比较花时间,一点点不对齐都会导致导出的excel 表格行列不一致,工具上可以预览导出表格的样式,也可以直接在工具上导出报表,这也是这个工具最大的用处吧,只要会sql语句,就可以制作各种表格,对其他非java编程工作人员导出报表很实用。具体操作可以参考相关教程。完成表格制作后将编译好的两个文件(.jasper,.jrxml)复制放到 intellij 资源路径下。</p><p></p><p>ireport  需要在mapper 中写查询语句,这个其实在页面端需求时已经写好,直接调用即可。</p><p></p><p>3. 后台程序编写</p><p> ireport 后台程序比较简单,将ireport 导出报表需要的参数 组装好传进去即可,直接上例子:</p><p></p><pre code_snippet_id="1579867" snippet_file_name="blog_20160216_2_5403460" name="code" class="java"> public Object exportDetailExcelByIreport(HttpServletRequest request, HttpServletResponse response, String date, String cid) {
	        String exportFileName = "districtDetailCount"+System.currentTimeMillis()+".xls";
	        String jasperFilePath = this.getClass().getResource("/").getPath()+"/"+"ireport/reportDistrict.jasper";
	        Map<String, Object> params = new HashMap<>();
	        List<!-- <Map> --> selectDistrictData = countDistrictService.searchDistrictDetail(date,cid);
	        List<!-- <Map> --> districtDetail = countDistrictService.searchDistrictNameById(Integer.parseInt(cid));
	
	        double totalNet = 0;
	        for (int i=0;i<selectDistrictData.size();i++){
	            totalNet += Double.parseDouble(selectDistrictData.get(i).get("net").toString());
	        }
	        params.put("date_month","2015-07");
	        params.put("net_total", totalNet);
	        params.put("district_name","桂城街道");
	        Map result = IReportUtils.exportByDataBaseConnection(request,response,params,exportFileName,jasperFilePath);
	        return sendResult(ResultCode.CODE_200.code,ResultCode.CODE_200.msg,result);
	    }

poi 后台程序 逻辑很清晰,从数据库取数据一行行将数据存储到excel表格的行中,代码如下:

 public Object exportDetailExcel(HttpServletRequest request, String date, String cid) {
        Map<String, Object> result = new HashMap<>();
        String path = PathKit.getWebRootPath()+"/upload/file/";
        File pathFile = new File(path);
        String districtNameList = countDistrictService.searchDistrictNameById(Integer.parseInt(cid));
        String title = districtNameList+"收运量统计表"+System.currentTimeMillis();
        List<Map> districtData = countDistrictService.searchDistrictDetail(date,cid);

        File newFile = new File(path+title+".xls");
        try{
            if(!pathFile.exists()){
                pathFile.mkdirs();
            }
            newFile.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try{
            FileOutputStream fos = new FileOutputStream(newFile);
            if (!districtData.isEmpty()&&districtData.size()>0){
                String[] headers = getDistrictHeaders();
                String[] titleHead = getDistrictTitle(date,cid);
                Collection<List<String>> dataSet = getDistrictDetailDataSet(districtData);
                exportExcel(title,titleHead,headers,dataSet,fos,null);
            }else {
                return sendResult(ResultCode.CODE_405.code,ResultCode.CODE_405.msg,null);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return  sendResult(ResultCode.CODE_401.code,ResultCode.CODE_401.msg,null);
        }
        System.out.println(request.getRequestURL().toString());
        String url = request.getRequestURL().toString().replace("/ctrl/districtCount/exportDistrictDetail","")+"/upload/file/"+title+".xls";
        result.put("url",url);
        return sendResult(ResultCode.CODE_200.code,ResultCode.CODE_200.msg,result);
    }

4.输出excel表格比较

   首先需要说明的是,笔者对ireport的使用仅仅只是初步认识和阶段,ireport的强大之处并没有深入研究,笔者使用ireport 导出的excel表格并没有达到预想的结果,主要有以下几点,

  一,整个页面背景为白色,而不是透明显示,使用最笨的方法是通过在ireport中设置页面边距来,来使不存在数据的页面边界透明显示。调试ireport到合适的页面大小很苦逼,如果是动态的数据就更是不可取。不知道还有没有别的方法能达到效果。这也使不得不放弃ireport。

二,导出的excel表格中的斜线无法显示

三,动态数据表格中实现合并单元格功能无法实现;在实际项目需求中,尤其是在动态数据中需要对动态的数据进行合并单元格操作,在ireport中找不到解决的方法。

使用poi完全可以随心所欲的去设计表格,相同格式的excel表格可以公用一个方法,传入不同的参数即可;当遇到格式复杂的表格(例如复杂表头),可以单独重写方法。在ireport中出现的问题,poi都能得到完美解决。

5.综上所述,项目的需求,以及各自的优缺点,笔者最终选择了poi。个人觉得ireport还是比较适合非开发人员去完成表格的导出功能,在ireport中直接导出的表格还是很不错,操作简单,一般的非开发人员使用ireport可以得到需要的各种excel表格,或者pdf格式文档。poi插件可以适合任意excel表格的输出,完全满足开发需求。


一、 POI简介

            Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

二、 HSSF概况

            HSSF 是Horrible SpreadSheet Format的缩写,通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。

三、 POI EXCEL文档结构类

            HSSFWorkbook excel文档对象

            HSSFSheet excel的sheet HSSFRow excel的行

            HSSFCell excel的单元格 HSSFFont excel字体

            HSSFName 名称 HSSFDataFormat 日期格式

            HSSFHeader sheet头

            HSSFFooter sheet尾

            HSSFCellStyle cell样式

            HSSFDateUtil 日期

            HSSFPrintSetup 打印

            HSSFErrorConstants 错误信息表

四、 EXCEL常用操作方法

  1、 得到Excel常用对象           
[c-sharp]  view plain copy print ?
  1. POIFSFileSystem fs=newPOIFSFileSystem(new FileInputStream("d:/test.xls"));   
  2. //得到Excel工作簿对象    
  3. HSSFWorkbook wb = new HSSFWorkbook(fs);  
  4. //得到Excel工作表对象    
  5. HSSFSheet sheet = wb.getSheetAt(0);   
  6. //得到Excel工作表的行    
  7. HSSFRow row = sheet.getRow(i);  
  8. //得到Excel工作表指定行的单元格    
  9. HSSFCell cell = row.getCell((short) j);  
  10. cellStyle = cell.getCellStyle();//得到单元格样式  
 2、建立Excel常用对象
[c-sharp]  view plain copy print ?
  1. HSSFWorkbook wb = new HSSFWorkbook();//创建Excel工作簿对象   
  2. HSSFSheet sheet = wb.createSheet("new sheet");//创建Excel工作表对象     
  3. HSSFRow row = sheet.createRow((short)0); //创建Excel工作表的行   
  4. cellStyle = wb.createCellStyle();//创建单元格样式   
  5. row.createCell((short)0).setCellStyle(cellStyle); //创建Excel工作表指定行的单元格   
  6. row.createCell((short)0).setCellValue(1); //设置Excel工作表的值  
3、设置sheet名称和单元格内容
[c-sharp] 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值