用groovy简化java反射编写一个基于行数据对象的自动生成excel文件对象的工具

来源:互联网 发布:数据的存储方法 编辑:程序博客网 时间:2024/05/16 12:42

本人对该项目生成excel对象的效率非常不满,大家如果有好的建议可以提出来,项目已经上传至github:https://github.com/dacongxiaocong/groovy_create_excel.git

首先贴上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.Utilimport org.apache.poi.hssf.usermodel.HSSFCellimport org.apache.poi.hssf.usermodel.HSSFRowimport java.lang.reflect.Fieldclass 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.createexcelimport com.xjc.createexcel.Util.FillObjectIntoRowimport org.apache.poi.hssf.usermodel.HSSFCellimport org.apache.poi.hssf.usermodel.HSSFRowimport org.apache.poi.hssf.usermodel.HSSFSheetimport org.apache.poi.hssf.usermodel.HSSFWorkbookclass 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文件:


阅读全文
0 0