POI 汇总、总结帖

最近工作需求使用POI,使用场景如下:

1、查询数据库获取数据

2、按照客户要求格式导出成excel

 

碰到的几个问题:

1、POI的基本操作

2、客户的有格式要求,还比较复杂

 

问题一参见:

POI操作Excel文档-基础篇 http://llyzq.iteye.com/admin/blogs/1354542

POI操作Excel文档-中级篇 http://llyzq.iteye.com/admin/blogs/1354545

Apache POI  http://llyzq.iteye.com/admin/blogs/729521

 

问题二的解决思路:

1、将客户提供的excel作为样式模板

2、读取该excel创建HSSFWorkbook对象

3、填充数据

4、对于需要纵向扩充的表格数据,使用sheet.shiftRows方法实现,同时复杂样式和合并单元格

 

/**
   * 复制一行的单元格样式
   */
  private void copyCellStyleOfRow(HSSFSheet sheet,HSSFRow fromRow,HSSFRow toRow,int count){
  	for (int i = 0; i < count; i++) {
  		if(toRow.getCell((short)i) != null)
  			toRow.getCell((short)i).setCellStyle(fromRow.getCell((short)i).getCellStyle());
  		else{
  			toRow.createCell((short)i).setCellStyle(fromRow.getCell((short)i).getCellStyle());
  		}
  		
  		
      for (int j = 0; j < sheet.getNumMergedRegions(); j++) {
        Region r = sheet.getMergedRegionAt(j);
        //判断是否包含在合并表格中
        if (r.contains(fromRow.getRowNum(), (short)i)) {
        	sheet.addMergedRegion(new Region(toRow.getRowNum(), r.getColumnFrom(), toRow.getRowNum(), r.getColumnTo()));
        }
	    }
		}
  }

 

其他主要代码:

 

protected ActionForward doPrev(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
      
	  ITenpayQuetyService tenpayQueryServiceImpl=(ITenpayQuetyService)ApplicationContextUtil.getInstance().getBean("tenpayQueryServiceImpl");
	  
      try {
	        
	        String begDate = request.getParameter("begDate").replaceAll("-", "");
	    	  String endDate = request.getParameter("endDate").replaceAll("-", "");
	    	  Map params = new HashMap();
	    	  params.put("begDate", begDate);
	    	  params.put("endDate", endDate);
	    	  params.put("broke", "TENPAY");
	    	  
	    	  //读取excel模板
	    	  String urlpath = request.getRealPath("");
	    	  HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(urlpath + "\\template\\" + HsDictionary.getInstance().getSysParameter("SALE", "SYSTEMPLATE")+"\\custom\\tenpaydemo.xls"));
	    	  HSSFSheet s = wb.getSheetAt(0);
	    	  
	    	  DecimalFormat format = new DecimalFormat("###,##0.00");
	        //--------------汇总报表
	    	  //统计周期
	    	  String tjzq = request.getParameter("begDate").replaceAll("-", ".")+" -- "
	    	  		+request.getParameter("endDate").replaceAll("-", ".");
	    	  int hs = 0;//户数
	    	  int cggmkhs = 0;//成功购买客户数
	    	  double zb = 100;//占比
	    	  int csgmkhs = 0;//尝试购买客户数
	    	  int cssgbs = 0;//尝试申购笔数
	    	  int cgsgbs = 0;//成功申购笔数
	    	  double cgsgje = 0;//成功申购金额
	    	  int csrgbs = 0;//尝试认购笔数
	    	  int cgrgbs = 0;//成功认购笔数
	    	  double cgrgje = 0;//成功认购金额
	    	  int dtcskkbs = 0;//定投尝试扣款笔数
	    	  int dtcgkkbs = 0;//定投成功扣款笔数
	    	  double dtcgkkje = 0;//定投成功扣款金额
	    	  
	    	  HsRowSet rowSet = tenpayQueryServiceImpl.getTenpayNewOpenSuccessTradeStatic(this.getPkgId(request), params);
	    	  if(rowSet.getReturnRecords() > 0)
	    	  	cggmkhs = Integer.valueOf(((String)rowSet.getInterfaceProperty(0,"count"))).intValue();
	    	  
	    	  rowSet = tenpayQueryServiceImpl.getTenpaySuccessOpenStatic(this.getPkgId(request), params);
	    	  if(rowSet.getReturnRecords() > 0)
	    	  	hs = Integer.valueOf(((String)rowSet.getInterfaceProperty(0,"count"))).intValue();
	    	  
	    	  rowSet = tenpayQueryServiceImpl.getTenpayNewOpenTryTradeStatic(this.getPkgId(request), params);
	    	  if(rowSet.getReturnRecords() > 0)
	    	  	csgmkhs = Integer.valueOf(((String)rowSet.getInterfaceProperty(0,"count"))).intValue();
	    	  
	    	  if(hs != 0)
	    	  	zb = cggmkhs/hs;

	    	  //申购
	    	  params.put("businflag", "022");
	    	  rowSet = tenpayQueryServiceImpl.getTenpayTryTradeStatic(this.getPkgId(request), params);
	    	  if(rowSet.getReturnRecords() > 0)
	    	  	cssgbs = Integer.valueOf(((String)rowSet.getInterfaceProperty(0,"count"))).intValue();
	    	  
	    	  rowSet = tenpayQueryServiceImpl.getTenpaySuccessTradeStatic(this.getPkgId(request), params);
	    	  if(rowSet.getReturnRecords() > 0){
	    	  	cgsgbs = Integer.valueOf(((String)rowSet.getInterfaceProperty(0,"count"))).intValue();
	    	  	cgsgje = Double.valueOf(((String)rowSet.getInterfaceProperty(0,"confirmbala"))).doubleValue();
	    	  }
	    	  
	    	  //认购
	    	  params.put("businflag", "020");
	    	  rowSet = tenpayQueryServiceImpl.getTenpayTryTradeStatic(this.getPkgId(request), params);
	    	  if(rowSet.getReturnRecords() > 0)
	    	  	csrgbs = Integer.valueOf(((String)rowSet.getInterfaceProperty(0,"count"))).intValue();
	    	  
	    	  rowSet = tenpayQueryServiceImpl.getTenpaySuccessTradeStatic(this.getPkgId(request), params);
	    	  if(rowSet.getReturnRecords() > 0){
	    	  	cgrgbs = Integer.valueOf(((String)rowSet.getInterfaceProperty(0,"count"))).intValue();
	    	  	cgrgje = Double.valueOf(((String)rowSet.getInterfaceProperty(0,"confirmbala"))).doubleValue();
	    	  }
	    	  
	    	  //定投
	    	  params.put("businflag", "039");
	    	  rowSet = tenpayQueryServiceImpl.getTenpayTryTradeStatic(this.getPkgId(request), params);
	    	  if(rowSet.getReturnRecords() > 0)
	    	  	dtcskkbs = Integer.valueOf(((String)rowSet.getInterfaceProperty(0,"count"))).intValue();
	    	  
	    	  rowSet = tenpayQueryServiceImpl.getTenpaySuccessTradeStatic(this.getPkgId(request), params);
	    	  if(rowSet.getReturnRecords() > 0){
	    	  	dtcgkkbs = Integer.valueOf(((String)rowSet.getInterfaceProperty(0,"count"))).intValue();
	    	  	dtcgkkje = Double.valueOf(((String)rowSet.getInterfaceProperty(0,"confirmbala"))).doubleValue();
	    	  }
	    	  
	    	  //填充excel
	    	  HSSFRow row = s.getRow(6);
	    	  
	    	  row.getCell((short)0).setCellValue(new HSSFRichTextString(tjzq));
	    	  row.getCell((short)1).setCellValue(new HSSFRichTextString(String.valueOf(hs)));
	    	  row.getCell((short)2).setCellValue(new HSSFRichTextString(String.valueOf(cggmkhs)));
	    	  row.getCell((short)3).setCellValue(new HSSFRichTextString(String.valueOf(zb)+"%"));
	    	  row.getCell((short)4).setCellValue(new HSSFRichTextString(String.valueOf(csgmkhs)));
	    	  row.getCell((short)5).setCellValue(new HSSFRichTextString(String.valueOf(cssgbs)));
	    	  row.getCell((short)6).setCellValue(new HSSFRichTextString(String.valueOf(cgsgbs)));
	    	  row.getCell((short)7).setCellValue(new HSSFRichTextString(format.format(cgsgje)));
	    	  row.getCell((short)8).setCellValue(new HSSFRichTextString(String.valueOf(csrgbs)));
	    	  row.getCell((short)9).setCellValue(new HSSFRichTextString(String.valueOf(cgrgbs)));
	    	  row.getCell((short)10).setCellValue(new HSSFRichTextString(format.format(cgrgje)));
	    	  row.getCell((short)11).setCellValue(new HSSFRichTextString(String.valueOf(dtcskkbs)));
	    	  row.getCell((short)12).setCellValue(new HSSFRichTextString(String.valueOf(dtcgkkbs)));
	    	  row.getCell((short)13).setCellValue(new HSSFRichTextString(format.format(dtcgkkje)));
	    	  
	    	  
	        //------------新开户报表---------------
	        
	    	  HsRowSet newOpenList = tenpayQueryServiceImpl.getTenpayNewOpenList(this.getPkgId(request),params);
	    	  request.setAttribute("begDate",begDate);
          request.setAttribute("endDate",endDate);
          request.setAttribute("newOpenList",newOpenList);
          
          //填充excel
          row = s.getRow(10);
          for (int i = 0; i < newOpenList.getReturnRecords(); i++) {
          		row.getCell((short)0).setCellValue(new HSSFRichTextString(newOpenList.getInterfaceProperty(i,"date")));
          		row.getCell((short)1).setCellValue(new HSSFRichTextString(newOpenList.getInterfaceProperty(i,"partneraccoid")));
          		row.getCell((short)5).setCellValue(new HSSFRichTextString(newOpenList.getInterfaceProperty(i,"time")));
          		row.getCell((short)6).setCellValue(new HSSFRichTextString(newOpenList.getInterfaceProperty(i,"type")));
		          if(i != newOpenList.getReturnRecords()-1){
		          	s.shiftRows(row.getRowNum()+1, row.getRowNum()+8, 1);
			          this.copyCellStyleOfRow(s,row, s.getRow(row.getRowNum()+1), 7);
			          row=s.getRow(row.getRowNum()+1);
		          }
          }
          row=s.getRow(row.getRowNum()+1);
          row.getCell((short)0).setCellValue(new HSSFRichTextString("共"+newOpenList.getReturnRecords()+"条记录"));
	        
          
	        //---------------交易详细报表------------------------
	        HsRowSet dealDetailList = tenpayQueryServiceImpl.getTenpayDealDetailList(this.getPkgId(request),params);
	        
	        //填充excel
	        row=s.getRow(row.getRowNum()+4);
	        for (int i = 0; i < dealDetailList.getReturnRecords(); i++) {

        		row.getCell((short)0).setCellValue(new HSSFRichTextString(dealDetailList.getInterfaceProperty(i,"partneraccoid")));
        		row.getCell((short)1).setCellValue(new HSSFRichTextString(dealDetailList.getInterfaceProperty(i,"date")));
        		row.getCell((short)3).setCellValue(new HSSFRichTextString(dealDetailList.getInterfaceProperty(i,"time")));
        		row.getCell((short)5).setCellValue(new HSSFRichTextString(dealDetailList.getInterfaceProperty(i,"fundcode")));
        		row.getCell((short)7).setCellValue(new HSSFRichTextString(dealDetailList.getInterfaceProperty(i,"fundtype")));
        		row.getCell((short)8).setCellValue(new HSSFRichTextString(HsDictionary.getInstance().getCaption("业务名称", dealDetailList.getInterfaceProperty(i,"businflag"))));
        		row.getCell((short)9).setCellValue(new HSSFRichTextString(format.format(Double.valueOf(dealDetailList.getInterfaceProperty(i,"confirmbala")))));
        		row.getCell((short)10).setCellValue(new HSSFRichTextString(dealDetailList.getInterfaceProperty(i,"status")));
	          if(i != dealDetailList.getReturnRecords() -1){
	          	s.shiftRows(row.getRowNum()+1, row.getRowNum()+2, 1);
		          this.copyCellStyleOfRow(s,row, s.getRow(row.getRowNum()+1), 11);
		          row=s.getRow(row.getRowNum()+1);
	          }
		      }
	        row=s.getRow(row.getRowNum()+1);
          row.getCell((short)0).setCellValue(new HSSFRichTextString("共"+dealDetailList.getReturnRecords()+"条记录"));
	        
	        //-----------生成报表excel文件-------------
	        ByteArrayOutputStream  fos = new ByteArrayOutputStream();
	        wb.write(fos);
	        response.setContentType("application/vnd.ms-excel");
	        response.setHeader("Content-Disposition", "inline; filename=income_\"" +  begDate + "-" + endDate +".xls \"");
	        //确保IE识别本次为下载文件,解决https IE下载无法保存的问题  
	        response.setHeader("Content-Transfer-Encoding","binary");
	        response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0"); 
	        response.setHeader("Pragma", "public");
	        ByteArrayInputStream inputStream = new ByteArrayInputStream(fos.toByteArray());
	        PrintWriter out = response.getWriter();
	        int i;
	        while ( (i = inputStream.read()) != -1) {
	          out.write(i);
	        }
	        out.flush();
	        inputStream.close();
	        out.close();
	        fos.close();
      } catch (Exception ex) {
	        SysLogUtils.error("下载对账数据发生错误:", ex);
	        throw new BusinessException("ETS-1BT27","下载对账数据发生错误!");
       }
	 
	  return null;
   }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值