POI动态导出EXCEL

  1. /** 
  2.  * 利用开源组件POI3.0.2动态导出EXCEL文档 
  3.  *  
  4.  * @author 朱鹏飞 
  5.  * @version v1.0 
  6.  * @param <T> 
  7.  *  
  8.  */
  9. publicclass ExportExcel<T> { 
  10.     publicvoid exportExcel(Collection<T> dataset, OutputStream out) { 
  11.         exportExcel("对账单EXCEL文档"null, dataset, out, "yyyy-MM-dd"); 
  12.     } 
  13.     publicvoid exportExcel(String[] headers, Collection<T> dataset, 
  14.             OutputStream out) { 
  15.         exportExcel("对账单EXCEL文档", headers, dataset, out, "yyyy-MM-dd"); 
  16.     } 
  17.     publicvoid exportExcel(String[] headers, Collection<T> dataset, 
  18.             OutputStream out, String pattern) { 
  19.         exportExcel("对账单EXCEL文档", headers, dataset, out, pattern); 
  20.     } 
  21.     /** 
  22.      * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符合一定条件的数据以EXCEL 的形式输出到指定IO设备上 
  23.      *  
  24.      * @param title 
  25.      *            表格标题名 
  26.      * @param headers 
  27.      *            表格属性列名数组 
  28.      * @param dataset 
  29.      *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的 
  30.      *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据) 
  31.      * @param out 
  32.      *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 
  33.      * @param pattern 
  34.      *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd" 
  35.      */
  36.     @SuppressWarnings({ "unchecked""deprecation" }) 
  37.     publicvoid exportExcel(String title, String[] headers, 
  38.             Collection<T> dataset, OutputStream out, String pattern) { 
  39.         // 声明一个工作薄
  40.         HSSFWorkbook workbook = new HSSFWorkbook(); 
  41.         // 生成一个表格
  42.         HSSFSheet sheet = workbook.createSheet(title); 
  43.         // 设置表格默认列宽度为15个字节
  44.         sheet.setDefaultColumnWidth((short15); 
  45.         // 生成一个样式
  46.         HSSFCellStyle style = workbook.createCellStyle(); 
  47.         // 设置这些样式
  48.         style.setFillForegroundColor(HSSFColor.SKY_BLUE.index); 
  49.         style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); 
  50.         style.setBorderBottom(HSSFCellStyle.BORDER_THIN); 
  51.         style.setBorderLeft(HSSFCellStyle.BORDER_THIN); 
  52.         style.setBorderRight(HSSFCellStyle.BORDER_THIN); 
  53.         style.setBorderTop(HSSFCellStyle.BORDER_THIN); 
  54.         style.setAlignment(HSSFCellStyle.ALIGN_CENTER); 
  55.         // 生成一个字体
  56.         HSSFFont font = workbook.createFont(); 
  57.         font.setColor(HSSFColor.VIOLET.index); 
  58.         font.setFontHeightInPoints((short12); 
  59.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 
  60.         // 把字体应用到当前的样式
  61.         style.setFont(font); 
  62.         // 生成并设置另一个样式
  63.       HSSFCellStyle style2 = workbook.createCellStyle();
  64.      style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
  65.      style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
  66.      style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
  67.      style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
  68.      style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
  69.      style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
  70.      style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
  71.      style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
  72.      // 生成另一个字体
  73.      HSSFFont font2 = workbook.createFont();
  74.       font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
  75.       // 把字体应用到当前的样式
  76.       style2.setFont(font2);
  77.         // 产生表格标题行
  78.         HSSFRow row = sheet.createRow(0); 
  79.         for (short i = 0; i < headers.length; i++) { 
  80.             HSSFCell cell = row.createCell(i); 
  81.             cell.setCellStyle(style); 
  82.             HSSFRichTextString text = new HSSFRichTextString(headers[i]); 
  83.             cell.setCellValue(text); 
  84.         } 
  85.         // 遍历集合数据,产生数据行
  86.         Iterator<T> it = dataset.iterator(); 
  87.         int index = 0
  88.         while (it.hasNext()) { 
  89.             index++; 
  90.             row = sheet.createRow(index); 
  91.             T t = (T) it.next(); 
  92.             // 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
  93.             Field[] fields = t.getClass().getDeclaredFields(); 
  94.             for (short i = 0; i < fields.length; i++) { 
  95.                 HSSFCell cell = row.createCell(i); 
  96. //              cell.setCellStyle(style2);
  97.                 Field field = fields[i]; 
  98.                 String fieldName = field.getName(); 
  99.                 String getMethodName = "get"
  100.                         + fieldName.substring(01).toUpperCase() 
  101.                         + fieldName.substring(1); 
  102.                 try { 
  103.                     Class tCls = t.getClass(); 
  104.                     Method getMethod = tCls.getMethod(getMethodName, 
  105.                             new Class[] {}); 
  106.                     Object value = getMethod.invoke(t, new Object[] {}); 
  107.                     // 判断值的类型后进行强制类型转换
  108.                     String textValue = null
  109.                     if (value instanceof Date) { 
  110.                         Date date = (Date) value; 
  111.                         SimpleDateFormat sdf = new SimpleDateFormat(pattern); 
  112.                         textValue = sdf.format(date); 
  113.                     } else { 
  114.                         // 其它数据类型都当作字符串简单处理
  115.                         textValue = value.toString(); 
  116.                     } 
  117.                     // 利用正则表达式判断textValue是否全部由数字组成
  118.                     if (textValue != null) { 
  119.                         Pattern p = Pattern.compile("^//d+(//.//d+)?{1}quot"); 
  120.                         Matcher matcher = p.matcher(textValue); 
  121.                         if (matcher.matches()) { 
  122.                             // 是数字当作double处理
  123.                             cell.setCellValue(Double.parseDouble(textValue)); 
  124.                         } else { 
  125.                             HSSFRichTextString richString = new HSSFRichTextString( 
  126.                                     textValue); 
  127.                             HSSFFont font3 = workbook.createFont(); 
  128.                             font3.setColor(HSSFColor.BLUE.index); 
  129.                             richString.applyFont(font3); 
  130.                             cell.setCellValue(richString); 
  131.                         } 
  132.                     } 
  133.                 } catch (SecurityException e) { 
  134.                     // TODO Auto-generated catch block
  135.                     e.printStackTrace(); 
  136.                 } catch (NoSuchMethodException e) { 
  137.                     // TODO Auto-generated catch block
  138.                     e.printStackTrace(); 
  139.                 } catch (IllegalArgumentException e) { 
  140.                     // TODO Auto-generated catch block
  141.                     e.printStackTrace(); 
  142.                 } catch (IllegalAccessException e) { 
  143.                     // TODO Auto-generated catch block
  144.                     e.printStackTrace(); 
  145.                 } catch (InvocationTargetException e) { 
  146.                     // TODO Auto-generated catch block
  147.                     e.printStackTrace(); 
  148.                 } finally { 
  149.                     // 清理资源
  150.                 } 
  151.             } 
  152.         } 
  153.         try { 
  154.             workbook.write(out); 
  155.         } catch (IOException e) { 
  156.             // TODO Auto-generated catch block
  157.             e.printStackTrace(); 
  158.         } 
  159.     } 
  160.     publicstaticvoid main(String[] args) throws IOException { 
  161.         ExportExcel<ReportBillsModel> ex = new ExportExcel<ReportBillsModel>(); 
  162.         String[] headers = { "估价编号""抵押物地址""主贷人姓名""支行名称""扣款金额"
  163.                 "中介公司名字""扣款时间" }; 
  164.         List<ReportBillsModel> ls = new ArrayList<ReportBillsModel>(); 
  165.         ReportBillsModel rm = new ReportBillsModel(); 
  166.         rm.setAgentName("test"); 
  167.         rm.setBankName("bank"); 
  168.         rm.setCheckTime("1992-21-21"); 
  169.         rm.setCreditorName("aa"); 
  170.         rm.setDeductionAmount(21); 
  171.         rm.setDeductionTime("2012-12-12"); 
  172.         rm.setEstimationCode("aadf"); 
  173.         rm.setResidenceAddr("aaaaaaaaaaaaa"); 
  174.         ls.add(rm); 
  175.         try { 
  176.             OutputStream out = new FileOutputStream("E://a.xls"); 
  177.             ex.exportExcel(headers, ls, out); 
  178.             out.close(); 
  179.             System.out.println("excel导出成功!"); 
  180.         } catch (FileNotFoundException e) { 
  181.             // TODO Auto-generated catch block
  182.             e.printStackTrace(); 
  183.         } 
  184.     } 

 如果是web应用程序,做成下载的功能,代码如下:

  1. HttpServletResponse response = getResponse(); 
  2.         response.setContentType("application/octet-stream"); 
  3.         String fileName = URLEncoder.encode("bills.xls"
  4.                 "UTF-8"); 
  5.         String contentDisposition = "attachment; filename=" + fileName; 
  6.         response.setHeader("Content-Disposition", contentDisposition); 
  7.         ExportExcel<ReportBillsModel> ex = new ExportExcel<ReportBillsModel>(); 
  8.         OutputStream out = response.getOutputStream(); 
  9.         ex.exportExcel(headers, rbmList, out); 
  10.         out.close(); 
更多相关文章
  • JavaWeb动态导出Excel可弹出下载
    由于项目需求,需要将数据导出成Excel表格,并且可选择导出项,可下载.项目使用的Spring+Mybatis+SpringMVC框架,利用Apache POI导出Excel.POI具体使用请自行百度.话不多说,上代码. ExportExcelUtil代码 package com.rixin.com ...
  • 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility续3篇-导出时动态生成多SheetEXCEL
    ExcelUtility 类库经过我(梦在旅途)近期不断的优化与新增功能,现已基本趋向稳定,功能上也基本可以满足绝大部份的EXCEL导出需求,该类库已在我们公司大型ERP系统全面使用,效果不错,今天应用户的特殊需求,我又新增了一个功能,导出时动态生成多Sheet EXCEL. 新增方法一:由GetF ...
  • public void deleteFile(String filepath) throws IOException {File f = new File(filepath);//定义文件路径 if (f.exists() && f.isDirectory()) {//判断是文件还是 ...
  • java当初把核心处理设成Unicode,带来的好处是代码适应了多语言环境.然而由于老外的英语只有26个字母,有些情况下,一些程序员用8 位的byte处理,一不小心就去掉了CJK的高位.或者是由于习惯在程序中采用硬编码,还有多种原因,使得许多java应用在CJK的处理上很烦恼.还好 在POI HSS ...
  • /**  * 导出excel工具类  *  * @author jiyl.  * @date 2016/3/14  */ public class ExportExcel {     private static Logger log = LoggerFactory.getLogger(Export ...
  • /**  * @instructions 如果目录不存在,首先创建  * @author jiyanle 2014-03-26  * @return  */   public String createDirectory(String dirName) {   File dir = new File ...
  • 方法一:前台:<asp:Button ID="btnExcel" runat="server" Text="导出Excel" />后台:protected void Button1_Click(object sender, Ev ...
  • 结合自己做的项目,下面是我做的项目的导出Excel的配置:需要下载导入poi包,自己动手谷歌一下就以导出员工信息为例//在com.demo.utils下建立了ExportEmployeeExcel.java //有需要的同学可以把Employee部分信息修改即可 package com.demo.u ...
一周排行
  • 1.存储过程简介我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的 ...
  • VMwareVirtualCenterServerService服务启动失败
    故障现象:VMware vCenter服务器的VMware VirtualCenter S ...
  • 0.说明        因为最近要开发基于snmp的监控软件,所以先在Linux上玩玩,毕竟我要监控的不是Linux主机(这个就很好办了),而是要监控交换机的一些系统参数.        在网上网罗了一番,整理一下. ...
  • 1.PL/SQL中如何消除乱码?添加以下环境变量即可:NLS_CHARACTERSET=ZHS16GBKNLS_LANG=AMERICAN_AMERICA.ZHS16GBK2.如何在本地Xshell远程安装服务器软件 ...
  • 例如:假设要对8亿个正整数进行排序(0000099999999),该如何操作?分析:首先,确认这些数是不是不重复的,这点很重要,8亿个9整数占用内存很庞大,用计算机直接一次性进行处理显然不现实,800,0 ...
  • 但行好事,莫问前程
  • n1000v的安装过程足足折磨了我两天...后来我才发现只要安装上VMware vSphere CLI敲几下命问题就完全解决...哎..郁闷..不多说了详细的说一下N1000V的安装过程吧. 使用环境:VMware ...
  • Python脚本打包为exe文件
    把Python脚本和所用到的库打包为exe文件,可以更方便的发布程序,避免使用程序的每个电 ...
  • 这是本人2006年11月的一篇日记.抛砖引玉. 一个互联网网站服务的价值随着这个网站用户的总数增加而提高,这就是正反馈效应.正反馈效应的一个经典例子就是电话,如果这个地球上就你一个人用电话,那么电话的价值就不大,用电 ...
  • 树莓派(Raspberry Pi)搭建简单的lamp服务: 1. LAMP 的安装 sudo apt-get install apache2 mysql-server mysql-client php5 php5-g ...