前两章介绍了POI对Excel的使用,对于java程序员来说,使用对象来操作Excel更符合要求.
下面是一个用于测试的实体对象:
package gd.hz.poi.model; import gd.hz.poi.annotation.ExcelSign; import java.io.Serializable; import java.util.Date; /** * 用户Model * @author lfd * 2013-12-09 */ public class User implements Serializable { private static final long serialVersionUID = 1L; private int id ; private String name ; private int age ; private String sex ; private Date createDate ; private boolean hasVisible ; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } public boolean isHasVisible() { return hasVisible; } public void setHasVisible(boolean hasVisible) { this.hasVisible = hasVisible; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (id != other.id) return false; return true; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", createDate=" + createDate + ", hasVisible=" + hasVisible + "]"; } }
一个对象就是Excel表中的一行,为了确定实体属性与Excel每一列之间的对应关系,写一个注解来标识:ExcelSign
package gd.hz.poi.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface ExcelSign { String title() ; //记录每个字段在Excel中的标题 int order() default 0 ; //记录每个字段在Excel的排序 }
将实体加上注解:
package gd.hz.poi.model; import gd.hz.poi.annotation.ExcelSign; import java.io.Serializable; import java.util.Date; /** * 用户Model * @author lfd * 2013-12-09 */ public class User implements Serializable { private static final long serialVersionUID = 1L; private int id ; private String name ; private int age ; private String sex ; private Date createDate ; private boolean hasVisible ; @ExcelSign(title="用户标记", order=10) public int getId() { return id; } public void setId(int id) { this.id = id; } @ExcelSign(title="用户名称", order=9) public String getName() { return name; } public void setName(String name) { this.name = name; } @ExcelSign(title="年龄", order=7) public int getAge() { return age; } public void setAge(int age) { this.age = age; } @ExcelSign(title="性别", order=8) public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } @ExcelSign(title="日期") public Date getCreateDate() { return createDate; } public void setCreateDate(Date createDate) { this.createDate = createDate; } @ExcelSign(title="是否在职") public boolean isHasVisible() { return hasVisible; } public void setHasVisible(boolean hasVisible) { this.hasVisible = hasVisible; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + id; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (id != other.id) return false; return true; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", createDate=" + createDate + ", hasVisible=" + hasVisible + "]"; } }
以字符串的形式保存每个字段的名称,类型,在Excel中先后顺序和对应的标题.
package gd.hz.poi.util; import java.lang.reflect.Type; /** * Excel用户标题 * @author lfd * 2013-12-10 */ public class ExcelHeader implements Comparable<ExcelHeader> { private String methodName ; //字段的方法名称(字符串形式,保存字段的getXXX方法) private String title ; //字段在Excel中对应的标题 private int order ; //记录每个字段的先后顺序(越大越靠前) private Type type ; //字段的类型 public ExcelHeader() {} public ExcelHeader(String methodName, String title, int order, Type type) { this.methodName = methodName; this.title = title; this.order = order; this.type = type; } public String getMethodName() { return methodName; } public void setMethodName(String methodName) { this.methodName = methodName; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getOrder() { return order; } public void setOrder(int order) { this.order = order; } public Type getType() { return type; } public void setType(Type type) { this.type = type; } /** * 根据order进行排序 */ @Override public int compareTo(ExcelHeader o) { return this.order > o.order ? -1 : (this.order < o.order ? 1 : 0) ; } }
保存实体每个字段的基本信息:
/** * 输出对象标题 * @param clazz Class * @return List<ExcelHeader> */ private List<ExcelHeader> getHeader(Class<?> clazz) { Method[] methods = clazz.getDeclaredMethods() ; //反射获取实体上的所有方法 String name = null ; List<ExcelHeader> headers = new ArrayList<ExcelHeader>() ; for(Method method : methods) { name = method.getName() ; //实体对象的方法名称 //过滤只剩下getXXX和isXXX if(name != null && (name.startsWith("get") || name.startsWith("is"))) { //getXXX和isXXX上是否有ExcelSign这个annotation if(method.isAnnotationPresent(ExcelSign.class)) { ExcelSign sign = method.getAnnotation(ExcelSign.class) ; //获取方法上的ExcelSign注解 //method.getGenericReturnType():获取getxxx获取isxxx上的返回类型 ExcelHeader header = new ExcelHeader(name, sign.title(), sign.order(), method.getGenericReturnType()) ; headers.add(header) ; //保存到List中 } } } Collections.sort(headers) ; //对List进行排序 return headers ; }
将实体对象导出到Excel中:
/** * 根据路径将数据填充到Excel表中. * @param path 路径 * @param clazz Class * @param entitys 实体集合 * @param hasXLS true:为Excel 2003版本 false:为Excel 2007以上版本 * @return ExcelUtil */ public void export2Obj(String path, Class<?> clazz, List<?> entitys, boolean hasXLS) { Workbook workbook = export(clazz, entitys, hasXLS) ; OutputStream stream = null ; try { stream = new FileOutputStream(path) ; workbook.write(stream) ; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { if(stream != null) { stream.close() ; stream = null ; } } catch (IOException e) { e.printStackTrace(); } } } private Workbook export(Class<?> clazz, List<?> entitys, boolean hasXLS) { Workbook workbook = null ; if(hasXLS) { workbook = new HSSFWorkbook() ; } else { workbook = new XSSFWorkbook() ; } try { Sheet sheet = workbook.createSheet() ; //输出标题 List<ExcelHeader> headers = getHeader(clazz) ; Row row = sheet.createRow(0) ; int count = headers.size() ; for(int i=0; i<count; i++) { Cell cell = row.createCell(i) ; cell.setCellValue(headers.get(i).getTitle()) ; } //输出数据 int number = entitys.size() ; Method method = null ; for(int i=0; i<number; i++) { row = sheet.createRow(i+1) ; Object obj = entitys.get(i) ; for(int j=0; j<count; j++) { method = clazz.getDeclaredMethod(headers.get(j).getMethodName()) ; //反射获取实体上的指定方法(根据方法的字符串名称) Cell cell = row.createCell(j) ; String type = headers.get(j).getType().toString() ; //字符串的形式输出实体每个字段的类型. //method.invoke(obj):获取调用方法(根据方法的getxxx) if(type.equals("class java.util.Date")) { cell.setCellValue((Date)method.invoke(obj)) ; } else if(type.equals("class java.lang.Boolean") || type.equals("boolean")) { cell.setCellValue((Boolean)method.invoke(obj)) ; } else if(type.equals("class java.lang.Integer") || type.equals("int")) { cell.setCellValue((Integer)method.invoke(obj)) ; } else if(type.equals("class java.lang.Double") || type.equals("double")) { cell.setCellValue((Double)method.invoke(obj)) ; } else if(type.equals("class java.util.Calendar")) { cell.setCellValue((Calendar)method.invoke(obj)) ; } else { cell.setCellValue((String)method.invoke(obj)) ; } } } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return workbook ; }
测试:
@Test public void testExport2Obj() { List<User> users = new ArrayList<User>() ; User user = null ; for(int i=0; i<20; i++) { user = new User() ; user.setId(i) ; user.setAge(i) ; user.setCreateDate(new Date()) ; user.setHasVisible(true) ; user.setName("lfdlfdlfkdlfklfkdlfdsk" + i) ; user.setSex("男") ; users.add(user) ; } //数据输出到D:/Download目录下. export2Obj("D:/Download/lfd.xls", User.class, users, false) ; }
相关推荐
java使用poi操作excel需要的所有jar包(poi3.8版本),里面有poi-3.8-20120326.jar、poi-ooxml-3.8-20120326.jar、poi-ooxml-schemas-3.8-20120326.jar、dom4j-1.6.1.jar、xmlbeans-2.3.0.jar
java使用POI导出 Excel+图片工具类 ,里面含有poi jar包,只调用接口即可直接保存Excel。使用的时候需先把数据封装,具体包装需根据实际导出数据进行处理。文件demo中只提供包装格式。
java Excel文件 poi-bin-3.1-FINAL-20080629
这个是使用java语言 poi导入excel到数据库中,同时使用了xml对excel的每个单元格数据进行了非空验证。经测试,导入数据库成功。
1.java使用poi生成excel插入图表曲线 2.demo包含完成jar包 3.主要用途是过滤数据自动生成曲线图
java_poi实现excel导入导出功能,有详细的注解
java利用poi操作excel所需要的jar包:poi-3.14;poi-ooxml-3.14;poi-ooxml-schemas-3.17
附件是java poi 3.17的lib库及其依赖库,全部下载引用后,可以进行excel的读写操作,无需引用其他lib库。poi-3.17适用于jdk1.7。 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft ...
java操作excel(支持excel2007), java操作excel(支持excel2007)
java基于poi使用excel模板导出
java-poi-excel-导出20万条记录
java+poi+excel读取写入等操作所有jar(最新支持excel2013)+poi-bin-3.10-beta2-20130904源代码学习
ava解析Excel(兼容2003及2007):解析2003及以下使用HSSFWorkbook类, 解析2007及以上使用XSSFWorkbook, 如果解析类与excel版本不对应,抛出相应的异常,例如HSSFWorkbook解析2007: org.apache.poi.poifs....
java操 作 excel2007 所使用poi.jar包,版本是poi_3.17.jar poi_3.15.jar,里面还有一个jxl.jar内容全面,实用性强.
用Java导出页面内容为excel表格的jar包,包含使用方法
java通过poi操作excel的基本例子. 单元格基本操作 poi画线 矩形 圆形 excel表的操作 行列操作
为更方便的使用POI的API来操作Excel(2003)文件,对POI中针对Excel文件的读写进行了简单封装。此类中包含以下功能: 1.根据模板创建Excel文件 ...压缩包中包含POI的jar文件、POIExcel的jar文件及POIExcel的源码
java的POI操作Excel文件,java的POI操作Excel文件,java的POI操作Excel文件
java操作Excel的poi-4.0.1 jar包 包括 poi-4.0.1、poi-examples-4.0.1、poi-excelant-4.0.1等jar包。
ExcelImport.zip java-poi-excel 导入导出excel表格 由java读取流进行操作