用groovy简化java反射编写一个基于行数据对象的自动生成excel文件对象的工具
2017-09-08 14:02
1206 查看
本人对该项目生成excel对象的效率非常不满,大家如果有好的建议可以提出来,项目已经上传至github:https://github.com/dacongxiaocong/groovy_create_excel.git
首先贴上maven依赖
用到了groovy和poi
接下来添上项目目录:
下面就是源码啦~
插入行数据的工具类:
生成excel文件对象的类:
接下来是演示如何使用
行数据对象类:
演示使用(应为是用linux系统所以路径有点怪):
生成的excel文件:
首先贴上maven依赖
<dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy</artifactId> <version>2.4.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.16</version> </dependency>
用到了groovy和poi
接下来添上项目目录:
下面就是源码啦~
插入行数据的工具类:
package com.xjc.createexcel.Util import org.apache.poi.hssf.usermodel.HSSFCell import org.apache.poi.hssf.usermodel.HSSFRow import java.lang.reflect.Field class FillObjectIntoRow<T> { //向行中填入数据,数据顺序由list决定 void fill(T t,HSSFRow row,List<String> class_titles){ //获取行数据类对象的class对象 Class<T> tClass = t.class //通过反射获取所有全局属性 Field[] fields = tClass.declaredFields int cellNum = 0 //遍历list,通过list的顺序决定行数据的顺序 for (class_title in class_titles){ //遍历类中的属性 fields.each {field -> if (field.name.equals(class_title)){ //groovy对抽象的简化,可以获得对象同名属性的值 String value = t."$field.name" //获取单元格对象 HSSFCell cell = row.createCell(cellNum) //将值填入单元格中 cell.setCellValue(value) } } cellNum++ } } }
生成excel文件对象的类:
package com.xjc.createexcel import com.xjc.createexcel.Util.FillObjectIntoRow import org.apache.poi.hssf.usermodel.HSSFCell import org.apache.poi.hssf.usermodel.HSSFRow import org.apache.poi.hssf.usermodel.HSSFSheet import org.apache.poi.hssf.usermodel.HSSFWorkbook class CreateWithHeadMapAndList<T> { //groovy支持在方法定义时设置默认属性值,LinkedHashMap可以保证放入数据的顺序,通过map设置标题与类中全局变量的对应关系和数据列顺序,List为需要插入的行对象,T为行对象类 HSSFWorkbook create(LinkedHashMap<String,String> heads,List<T> objects,String sheetName = "default"){ //获取workbook对象 HSSFWorkbook workbook = new HSSFWorkbook() //获取sheet对象 HSSFSheet sheet = workbook.createSheet(sheetName) //获取标题行对象 HSSFRow headRow = sheet.createRow(0) //获取行对象插入工具类 FillObjectIntoRow<T> fillObject = new FillObjectIntoRow<>() int headCellNum = 0 int bodyRowNum = 1 //通过map获取这个list,这个list的作用是保证列数据顺序是用户在map中设置的顺序 List<String> class_titles= new ArrayList<>() //插入标题 for (head in heads){ String title = head.key String class_title = head.value HSSFCell cell = headRow.createCell(headCellNum) cell.setCellValue(title) class_titles<<class_title headCellNum++ } //填入行数据 for (object in objects){ HSSFRow bodyRow = sheet.createRow(bodyRowNum) fillObject.fill(object,bodyRow,class_titles) bodyRowNum++ } return workbook } }
接下来是演示如何使用
行数据对象类:
package com.xjc; public class Car { private int id; private String name; private String factory; public String getFactory() { return factory; } public void setFactory(String factory) { this.factory = factory; } 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; } }
演示使用(应为是用linux系统所以路径有点怪):
package com.xjc; import com.xjc.createexcel.CreateWithHeadMapAndList; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import java.io.FileOutputStream; import java.io.IOException; import java.util.*; public class Test { public static void main(String[] args) throws IOException { CreateWithHeadMapAndList<Car>createMod = new CreateWithHeadMapAndList<>(); List<Car>list = new ArrayList<>(); for (int i=0;i<5;i++){ Car car = new Car(); car.setId(i); car.setName("car-"+i); car.setFactory("factory-"+i); list.add(car); } LinkedHashMap<String,String>map = new LinkedHashMap<>(); map.put("编号","id"); map.put("车名","name"); map.put("厂名","factory"); HSSFWorkbook workbook = createMod.create(map,list); FileOutputStream fops = new FileOutputStream("/opt/test.xls"); workbook.write(fops); } }
生成的excel文件:
相关文章推荐
- 一个来将返回的 JSON 数据自动生成 Java 对象的工具
- 使用Java泛型和反射机制编写Excel文件生成和解析的通用工具类
- Excel Report 一个小巧实用基于java实现的Excel报表生成工具
- 发布一个自动生成实体类,接口类,数据底层和业务类的小工具
- eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法
- 使用hibernate扩展工具Hbm2JavaTask根据配置文件生成持久化对象类(2.1.2)
- 编写一个自动编译class文件的工具
- 用 java 读取excel 文件里的时间格式数据时,24时制会自动转化为12时制,解决办法
- eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法
- 一个自己编写的xml和JAVA对象之间的转换工具,xml和对象轻松转换(simple-xml2object)
- 用 java 读取excel 文件里的时间格式数据时,24时制会自动转化为12时制,解决办法 .
- 将后台数据读取到前台的EXCEL文件中去,用javascript实现,asp.net,javacript(发一个原创)
- 用分析函数实现自动生成sqlloader定长数据装载控制文件的一个语句
- 自己写的一个代码自动生成工具_java版_源码下载
- JAVA生成一个excel文件
- 一个自己写的用来搜索各种文件格式生成txt清单的java工具
- 从 Java 应用程序动态生成 PDF 文件一个简化了 PDF 创建过程的开源库 iText 的分步指南
- 一个自动生成Hibernate ORM映射文件的工具函数
- 使用java调用C语言的方法,让java获取串口数据并生成一个String对象的代码。
- 一个简单生成Excel文件格式的java包。