POI导出EXCEL经典实现

POI导出EXCEL经典实现,第1张

概述1.Apache POI简介Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 POI 的功能。2.POI结构HSSF - 提供  1.Apache POI简介

Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 POI 的功能。

2.POI结构

hssf - 提供读写Microsoft Excel XLS格式档案的功能。
XSSF - 提供读写Microsoft Excel OOXML XLSX格式档案的功能。
HWPF - 提供读写Microsoft Word DOC格式档案的功能。
HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
HDGF - 提供读Microsoft Visio格式档案的功能。
HPBF - 提供读Microsoft Publisher格式档案的功能。
HSMF - 提供读Microsoft Outlook格式档案的功能。

3.Busy Developers' GuIDe to hssf and XSSF Features

官方网站:http://poi.apache.org/spreadsheet/quick-guIDe.HTML

参考博客:http://langhua9527.iteye.com/blog/388005

4.参考实例

援用:http://blog.csdn.net/lenolong/article/details/3957735

        在web开发中,有1个经典的功能,就是数据的导入导出。特别是数据的导出,在生产管理或财务系统中用的非常普遍,由于这些系统常常要做1些报表打印的工作。而数据导出的格式1般是EXCEL或pdf,我这里就用两篇文章分别给大家介绍下。(注意,我们这里说的数据导出可不是数据库中的数据导出!么误解啦^_^)

        呵呵,首先我们来导出EXCEL格式的文件吧。现在主流的 *** 作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI。这里我们用Apache POI!我们先去Apache的大本营下载POI的jar包:http://poi.apache.org/ ,我这里使用的是3.0.2版本。

        将3个jar包导入到classpath下,甚么?忘了怎样导包?不会吧!好,我们来写1个导出Excel的实用类(所谓实用,是指基本不用怎样修改就能够在实际项目中直接使用的!)。我1直强调做类也好,做方法也好,1定要通用性和灵活性强。下面这个类就算基本贯彻了我的这类思想。那末,熟习许老师风格的人应当知道,这时候候该要甩出1长串代码了。没错,大伙请看:

student.java

package org.leno.export.util;import java.util.Date;public class Student { private long ID; private String name; int age; boolean sex; private Date birthday; public Student() { super(); // Todo auto-generated constructor stub } public Student(long ID,String name,int age,255)">boolean sex,Date birthday) { this.ID = ID; this.name = name; this.age = age; this.sex = sex; this.birthday = birthday; } long getID() { return ID; } voID setID(long ID) { this.ID = ID; } public String getname() { return name; } voID setname(String name) { this.name = name; } int getAge() { return age; } voID setAge(int age) { this.age = age; } boolean getSex() { return sex; } voID setSex(boolean sex) { this.sex = sex; } public Date getBirthday() { return birthday; } voID setBirthday(Date birthday) { this.birthday = birthday; }}


Book.java

 

上面这两个类1目了然,就是两个简单的javabean风格的类。再看下面真实的重点类:

 

ExportExcel.java

import java.io.*;import java.lang.reflect.*;import java.util.*;import java.util.regex.Matcher;import java.util.regex.Pattern;import java.text.SimpleDateFormat;import javax.swing.JOptionPane;import org.apache.poi.hssf.@R_419_4518@l.*;import org.apache.poi.hssf.util.hssfcolor;/** * 利用开源组件POI3.0.2动态导出EXCEL文档 转载时请保存以下信息,注明出处! * * @author leno * @version v1.0 * @param <T> * 利用泛型,代表任意1个符合javabean风格的类 * 注意这里为了简单起见,boolean型的属性xxx的get器方式为getXxx(),而不是isXxx() * byte[]表jpg格式的图片数据 */class ExportExcel<T> { voID exportExcel(Collection<T> dataset,OutputStream out) { exportExcel("测试POI导出EXCEL文档",255)">null,dataset,out,"yyyy-MM-dd"); } voID exportExcel(String[] headers,Collection<T> dataset,headers,OutputStream out,String pattern) { exportExcel("测试POI导出EXCEL文档",pattern); } * 这是1个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号1定条件的数据以EXCEL 的情势输出到指定IO装备上 * * Title * 表格标题名 * headers * 表格属性列名数组 * dataset * 需要显示的数据集合,集合中1定要放置符合javabean风格的类的对象。此方法支持的 * javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据) * out * 与输出装备关联的流对象,可以将EXCEL文档导出到本地文件或网络中 * pattern * 如果有时间数据,设定输出格式。默许为"yyy-MM-dd" */ @SuppressWarnings("unchecked") voID exportExcel(String Title,String[] headers,Collection<T> dataset,String pattern) { 声明1个工作薄 hssfWorkbook workbook = new hssfWorkbook(); 生成1个表格 hssfSheet sheet = workbook.createSheet(Title); 设置表格默许列宽度为15个字节 sheet.setDefaultColumnWIDth((short) 15); 生成1个样式 hssfCellStyle style = workbook.createCellStyle(); 设置这些样式 style.setFillForegroundcolor(hssfcolor.SKY_BLUE.index); style.setFillPattern(hssfCellStyle.soLID_FOREGROUND); style.setborderBottom(hssfCellStyle.border_THIN); style.setborderleft(hssfCellStyle.border_THIN); style.setborderRight(hssfCellStyle.border_THIN); style.setbordertop(hssfCellStyle.border_THIN); style.setAlignment(hssfCellStyle.AliGN_CENTER); 生成1个字体 hssfFont Font = workbook.createFont(); Font.setcolor(hssfcolor.VIolET.index); Font.setFontHeightInPoints((short) 12); Font.setBolDWeight(hssfFont.BolDWEIGHT_BolD); 把字体利用到当前的样式 style.setFont(Font); 生成并设置另外一个样式 hssfCellStyle style2 = workbook.createCellStyle(); style2.setFillForegroundcolor(hssfcolor.liGHT_YELLOW.index); style2.setFillPattern(hssfCellStyle.soLID_FOREGROUND); style2.setborderBottom(hssfCellStyle.border_THIN); style2.setborderleft(hssfCellStyle.border_THIN); style2.setborderRight(hssfCellStyle.border_THIN); style2.setbordertop(hssfCellStyle.border_THIN); style2.setAlignment(hssfCellStyle.AliGN_CENTER); style2.setVerticalAlignment(hssfCellStyle.VERTICAL_CENTER); 生成另外一个字体 hssfFont Font2 = workbook.createFont(); Font2.setBolDWeight(hssfFont.BolDWEIGHT_norMAL); 把字体利用到当前的样式 style2.setFont(Font2); 声明1个画图的顶级管理器 hssfPatriarch patriarch = sheet.createDrawingPatriarch(); 定义注释的大小和位置,详见文档 hssfComment comment = patriarch.createComment(new hssfClIEntAnchor(0,0,(short) 4,2,255)">short) 6,5)); 设置注释内容 comment.setString(new hssfRichTextString("可以在POI中添加注释!")); 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容. comment.setAuthor("leno"); 产生表格标题行 hssfRow row = sheet.createRow(0); for (short i = 0; i < headers.length; i++) { hssfCell cell = row.createCell(i); cell.setCellStyle(style); hssfRichTextString text = new hssfRichTextString(headers[i]); cell.setCellValue(text); } 遍历集合数据,产生数据行 Iterator<T> it = dataset.iterator(); int index = 0; while (it.hasNext()) { index++; row = sheet.createRow(index); T t = (T) it.next(); 利用反射,根据javabean属性的前后顺序,动态调用getXxx()方法得到属性值 FIEld[] fIElds = t.getClass().getDeclaredFIElds(); short i = 0; i < fIElds.length; i++) { hssfCell cell = row.createCell(i); cell.setCellStyle(style2); FIEld fIEld = fIElds[i]; String fIEldname = fIEld.getname(); String getmethodname = "get" + fIEldname.substring(0,1).toupperCase() + fIEldname.substring(1); try { Class tCls = t.getClass(); Method getmethod = tCls.getmethod(getmethodname,new Class[] {}); Object value = getmethod.invoke(t,255)">new Object[] {}); 判断值的类型落后行强迫类型转换 String textValue = null; if (value instanceof Integer) { int intValue = (Integer) value; cell.setCellValue(intValue); } else if (value instanceof float) { float fValue = (float) value; textValue = new hssfRichTextString( String.valueOf(fValue)); cell.setCellValue(textValue); } else if (value instanceof Double) { double dValue = (Double) value; String.valueOf(dValue)); } else if (value instanceof Long) { long longValue = (Long) value; cell.setCellValue(longValue); } if (value instanceof Boolean) { boolean bValue = (Boolean) value; textValue = "男"; if (!bValue) { textValue = "女"; } } else instanceof Date) { Date date = (Date) value; SimpleDateFormat sdf = new SimpleDateFormat(pattern); textValue = sdf.format(date); } instanceof byte[]) { 有图片时,设置行高为60px; row.setHeightInPoints(60); 设置图片所在列宽度为80px,注意这里单位的1个换算 sheet.setColumnWIDth(i,255)">short) (35.7 * 80)); sheet.autoSizeColumn(i); byte[] bsValue = (byte[]) value; hssfClIEntAnchor anchor = new hssfClIEntAnchor(0,0,1023,index,255)">short) 6,index); anchor.setAnchorType(2); patriarch.createPicture(anchor,workbook.addPicture( bsValue,hssfWorkbook.PICTURE_TYPE_JPEG)); } else { 其它数据类型都当作字符串简单处理 textValue = value.toString(); } 如果不是图片数据,就利用正则表达式判断textValue是不是全部由数字组成 if (textValue != null) { Pattern p = Pattern.compile("^//d+(//.//d+)?$"); Matcher matcher = p.matcher(textValue); if (matcher.matches()) { 是数字当作double处理 cell.setCellValue(Double.parseDouble(textValue)); } else { hssfRichTextString richString = new hssfRichTextString( textValue); hssfFont Font3 = workbook.createFont(); Font3.setcolor(hssfcolor.BLUE.index); richString.applyFont(Font3); cell.setCellValue(richString); } } } catch (SecurityException e) { Todo auto-generated catch block e.printstacktrace(); } catch (NoSuchMethodException e) { catch (IllegalArgumentException e) { catch (illegalaccessexception e) { catch (InvocationTargetException e) { finally { 清算资源 } } } try { workbook.write(out); } catch (IOException e) { Todo auto-generated catch block e.printstacktrace(); } } static voID main(String[] args) { 测试学生 ExportExcel<Student> ex = new ExportExcel<Student>(); String[] headers = { "学号","姓名","年龄","性别","诞生日期" }; List<Student> dataset = new ArrayList<Student>(); dataset.add(new Student(10000001,"张3",20,255)">true,255)">new Date())); dataset.add(new Student(20000002,"李4",24,255)">false,255)">new Student(30000003,"王5",22,255)">new Date())); 测试图书 ExportExcel<Book> ex2 = new ExportExcel<Book>(); String[] headers2 = { "图书编号","图书名称","图书作者","图书价格","图书ISBN","图书出版社","封面图片" }; List<Book> dataset2 = new ArrayList<Book>(); try { BufferedinputStream bis = new BufferedinputStream( new fileinputStream("book.jpg")); byte[] buf = new byte[bis.available()]; while ((bis.read(buf)) != ⑴) { // } dataset2.add(new Book(1,"Jsp","leno",300.33f,"1234567","清华出版社",buf)); dataset2.add(new Book(2,"java编程思想","brucl","阳光出版社",255)">new Book(3,"DOM艺术","lenotang",255)">new Book(4,"c++经典",400.33f,255)">new Book(5,"c#入门","汤春秀出版社",buf)); OutputStream out = new fileOutputStream("E://a.xls"); OutputStream out2 = new fileOutputStream("E://b.xls"); ex.exportExcel(headers,out); ex2.exportExcel(headers2,dataset2,out2); out.close(); JOptionPane.showMessageDialog(); System.out.println("excel导出成功!"); } catch (fileNotFoundException e) { Todo auto-generated catch block e.printstacktrace(); } Todo auto-generated catch block e.printstacktrace(); } }}

总结

以上是内存溢出为你收集整理的POI导出EXCEL经典实现全部内容,希望文章能够帮你解决POI导出EXCEL经典实现所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1017881.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存