您的位置:首页 > 编程语言 > Java开发

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

2017-09-08 14:02 1206 查看
本人对该项目生成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.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文件:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐