`
llyzq
  • 浏览: 585390 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

POI 汇总、总结帖

    博客分类:
  • J2SE
 
阅读更多

最近工作需求使用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;
   }
分享到:
评论

相关推荐

    poi读写excel+poi总结

    在本文中,我们将深入探讨如何使用POI进行Excel的读写操作,并进行总结。 1. POI基本概念 Apache POI 提供了HSSF(Horrible Spreadsheet Format)用于读写旧版的.xls格式的Excel文件,而XSSF则用于处理.xlsx格式的...

    POI导出 POI导出 POI导出

    POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI...

    poi全家桶ooxml-schemas/poi/poi-examples/poi-ooxml/poi-ooxml-schemas/poi-scratchpad

    标题中的"poi全家桶ooxml-schemas/poi/poi-examples/poi-ooxml/poi-ooxml-schemas/poi-scratchpad"提及的是Apache POI项目中的多个关键组件和目录结构。Apache POI是一个开源的Java库,专门用于读写Microsoft Office...

    POI3.8架构总结.docx

    ### Apache POI 3.8 架构与应用详解 #### 一、Apache POI 概述 Apache POI 是一个由 Apache 软件基金会维护的开源项目,旨在为 Java 开发者提供一系列 API 以支持 Microsoft Office 文件格式的读写功能。POI 提供...

    poi使用总结

    个人整理的POI解析EXCEL常用API详解 里面包括我在使用过程中的一些心得

    POI poi相关所有jar包 poi jar包 poi最全jar包

    Apache POI 是一个开源项目,专门用于处理Microsoft Office格式的文件,如Excel(.xlsx、.xls)、Word(.doc、.docx)和PowerPoint(.ppt、.pptx)。这个压缩包包含了POI项目中所有必要的jar包,总计十二个,确保了...

    poi4.1.1所有相关jar包汇总

    标题提到的"poi4.1.1所有相关jar包汇总"意味着这是一个包含Apache POI 4.1.1版本所有必需的库文件的集合,用于在Java项目中处理Excel文件。 Apache POI 4.1.1版的主要亮点包括: 1. **增强的性能**:新版本通常会...

    POI操作Excel常用方法总结

    这篇博客文章“POI操作Excel常用方法总结”可能详细介绍了如何利用Apache POI库在Java环境中读写Excel文件。以下是对该主题的一些关键知识点的详细说明: 1. **Apache POI介绍**: Apache POI是开源项目,提供了...

    poi excel poi excel poi excel

    ### POI Excel知识点详解 #### 一、Jakarta POI简介与Apache POI的作用 Jakarta POI 是 Apache POI 的早期项目名称,它提供了一组 API 来处理 Microsoft Office 文件格式,特别是针对 Excel(`.xls` 和 `.xlsx`)...

    poi-3.17 poi-3.16

    Apache POI 是一个开源项目,专门用于处理微软的Office文档格式,如Excel、Word和PowerPoint。POI 提供了一套 Java API,使得开发者可以在Java应用程序中读写Microsoft Office格式的文件。标题中的"poi-3.17 poi-...

    poi的所有jar包,poi, poi-ooxml,poi-ooxml-schemas的各个版本jar

    这个压缩包包含了POI项目的几个核心组件的jar文件,包括基础的`poi`库,以及支持Open XML格式(OOXML)的`poi-ooxml`和`poi-ooxml-schemas`。这些jar包在Java开发中非常有用,尤其是当你需要在应用程序中读取、写入...

    POI中文帮助文档_POI_

    Apache POI是一个开源项目,主要用于读取和写入Microsoft Office格式的文件,如Word(.doc/.docx)、Excel(.xls/.xlsx)和PowerPoint(.ppt/.pptx)。这个“POI中文帮助文档”提供了全面的指南,帮助开发者理解和...

    poi-3.10.1上传组件jar包 po poi-ooxml poi-ooxml-schemas

    总结来说,Apache POI 3.10.1版本的上传组件为Java开发者提供了一套强大的工具,用于处理和操作Microsoft Office的文件格式,涵盖了Excel、Word和PowerPoint的多种功能,大大提升了开发效率并扩展了应用的可能性。

    poi-3.9、poi-ooxml-3.9、poi-ooxml-schemas-3.9

    总结来说,Apache POI 是Java开发中处理Excel文件的强大工具,它提供了全面的API来操作Excel的各种特性。结合 poi-3.9.jar、poi-ooxml-3.9.jar 和 poi-ooxml-schemas-3.9.jar 这三个库,开发者可以构建出功能丰富的...

    poi jar包 官网下载 最新poi官网资源

    关于poi ,Apache在今年,也就是在2017年9月15日 正式发布了POI 3.17版本, Apache POI团队对于3.17版本进行了一些功能的修复。主要是几个新的功能区域和许多错误修复。 POI 3.17是支持Java 6的最后一个版本。下一个...

    高德2017poi 高德历史poi 2017科研poi

    poi|信息点|高德poiPOI是“Point of Interest”的缩写,中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、 一个商铺、一个邮筒、一个公交站等。 高德POI又名高德兴趣点,来源于高德地图,...

    百度poi,高德poi数据数据免费下载

    在IT行业中,POI(Point of Interest)是一个重要的概念,主要指地图上的兴趣点,例如商业场所、公共服务设施、交通站点等。百度POI和高德POI是两大知名的中国地图服务提供商,它们提供了丰富的地理信息数据,为...

    POI操作Excel常用方法总结.docx

    本文主要总结了使用POI操作Excel的一些核心概念和常见方法。 首先,了解POI的基本概念: 1. **POI简介**:Apache POI是一个开源项目,其提供的API使得Java程序能够处理MS Office格式的文档,包括Excel(XLS和XLSX...

    2019版本poi 2019高德poi 2019百度poi

    标题中的“2019版本poi 2019高德poi 2019百度poi”提及的是关于2019年不同来源的POI(Point of Interest)数据,这些数据可能包括了高德地图和百度地图提供的兴趣点信息。POI数据是地理位置信息系统(GIS)中的一个...

Global site tag (gtag.js) - Google Analytics