使用Java反射机制和POI将对象集合导出到Excel

首先:搭载一个maven项目,添加POI的引用。

		
			org.apache.poi
			poi-ooxml
			3.9
		

建立一个用于测试的实体类

public class Person {

	private String name;
	private int age;
	private String job;

	public Person(String name, int age, String job) {
		super();
		this.name = name;
		this.age = age;
		this.job = job;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getJob() {
		return job;
	}

	public void setJob(String job) {
		this.job = job;
	}
}

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.hd.entity.Person;

public class ExcelUtils {
	/*
	 * @author HangDie
	 * */

	public static  XSSFWorkbook getWorkbook(Collection dataSet, String[] params, String[] titles) {
		// 校验变量和预期输出excel列数是否相同
		if (params.length != titles.length) {
			System.out.println("变量参数有误");
			return null;
		}
		// 存储每一行的数据
		List list = new ArrayList<>();
		for (Object obj : dataSet) {
			// 获取到每一行的属性值数组
			list.add(getValues(obj, params));
		}
		return getWorkbook(titles, list);
	}

	public static XSSFWorkbook getWorkbook(String[] titles, List list) {
		// 定义表头
		String[] title = titles;
		// 创建excel工作簿
		XSSFWorkbook workbook = new XSSFWorkbook();
		// 创建工作表sheet
		XSSFSheet sheet = workbook.createSheet();
		// 创建第一行
		XSSFRow row = sheet.createRow(0);
		XSSFCell cell = null;
		// 插入第一行数据的表头
		for (int i = 0; i < title.length; i++) {
			cell = row.createCell(i);
			cell.setCellValue(title[i]);
		}
		int idx = 1;
		for (String[] strings : list) {
			XSSFRow nrow = sheet.createRow(idx++);
			XSSFCell ncell = null;
			for (int i = 0; i < strings.length; i++) {
				ncell = nrow.createCell(i);
				ncell.setCellValue(strings[i]);
			}
		}
		// 设置自动列宽
		for (int i = 0; i < title.length; i++) {
			sheet.autoSizeColumn(i);
			sheet.setColumnWidth(i, sheet.getColumnWidth(i) * 16 / 10);
		}
		return workbook;
	}

	// 根据需要输出的变量名数组获取属性值
	public static String[] getValues(Object object, String[] params) {
		String[] values = new String[params.length];
		try {
			for (int i = 0; i < params.length; i++) {
				Field field = object.getClass().getDeclaredField(params[i]);
				// 设置访问权限为true
				field.setAccessible(true);
				// 获取属性
				// 如果属性有涉及基本变量的做一个转换
				if(field.getType()==org.apache.bcel.generic.Type.INT.getClass())
					values[i] = String.valueOf((int)field.get(object)); 
				values[i] = field.get(object).toString();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return values;
	}

	public static void main(String[] args) {
		List list = new ArrayList<>();
		list.add(new Person("张三", 15, "学生"));
		list.add(new Person("李四", 20, "实习生"));
		list.add(new Person("王五", 26, "Java工程师"));
		list.add(new Person("小明", 30, "主管"));

		XSSFWorkbook workbook = getWorkbook(list, new String[] { "name", "age", "job" }, new String[] { "姓名", "年龄", "职业" });
		if(workbook!=null) {
			try {
				OutputStream out = new FileOutputStream("D://TestOutputExcel.xlsx");
				workbook.write(out);
				System.out.println("导出完成");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

输出结果:

使用Java反射机制和POI将对象集合导出到Excel_第1张图片

在这里读入选用了传两组同位对应数组,来作为需要导出的属性变量及导出后表头名字的依据。可以配合在数据库建立一个配置表来以json的形式来存储,实际中只需要将若干需要导出的实体类做好配置,就可以直接根据某个key值导出想要的数据。


数据表及表内容:

使用Java反射机制和POI将对象集合导出到Excel_第2张图片

为了区分结果,删除了年龄的配置。


public static void main(String[] args) {
		JSONArray ja = JSONArray.fromObject(ConfigUtils.getConfigMap().get("person_config"));
		String[] params = new String[ja.size()];
		String[] titles = new String[ja.size()];
		for (int i = 0; i < ja.size(); i++) {
			JSONObject jsonObject = ja.getJSONObject(i);
			params[i] = jsonObject.getString("params");
			titles[i] = jsonObject.getString("title");
		}
		
		List list = new ArrayList<>();
		list.add(new Person("张三", 15, "学生"));
		list.add(new Person("李四", 20, "实习生"));
		list.add(new Person("王五", 26, "Java工程师"));
		list.add(new Person("小明", 30, "主管"));

		XSSFWorkbook workbook = ExcelUtils.getWorkbook(list, params, titles);
		if(workbook!=null) {
			try {
				OutputStream out = new FileOutputStream("D://TestOutputExcel.xlsx");
				workbook.write(out);
				System.out.println("导出完成");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

输出结果:

使用Java反射机制和POI将对象集合导出到Excel_第3张图片

这样之后无论输出什么对象集合,只需要在数据库配置好规定的格式,就可以通过这个实用类来输出出来了。

你可能感兴趣的:(使用Java反射机制和POI将对象集合导出到Excel)