利用Apache POI和Java反射开发一个excel导出工具类

以前导出excel总是按照需求重新编写一个导出方法,最近发现重复代码过多,所以花了一点时间写了一个通用的excel工具类POIExcelUtil。现分享一下代码。

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class POIExcelUtil {
	
	public static final String FILE_EXTENSION_XLS = "xls";
	public static final String FILE_EXTENSION_XLSX = "xlsx";

	/**
	 * 
	 * @param Map
	 *            <String,String> maps 属性表,成员属性age为KEY,中文名称为VALUE
	 * @param List
	 *            <T> list 需要导出的数据列表对象
	 * @param File
	 *            file 指定输出文件位置,只能导出excel2003以上版本
	 *            
	 * @return true 导出成功 false 导出失败
	 */
	public static <T> boolean excelExport(Map<String, String> maps, List<T> list, File file) {

		try {
			Workbook wb = null;
			String filename = file.getName();
			String type = filename.substring(filename.lastIndexOf(".")+1).toLowerCase();
			if (type.equals(FILE_EXTENSION_XLS)) {
				wb = new HSSFWorkbook();
			}
			if (type.equals(FILE_EXTENSION_XLSX)) {
				wb = new XSSFWorkbook();
			}
			CreationHelper createHelper = wb.getCreationHelper();
			Sheet sheet = wb.createSheet("sheet1");
			Set<String> sets = maps.keySet();
			Row row = sheet.createRow(0);
			int i = 0;
			// 定义表头
			for (Iterator<String> it = sets.iterator(); it.hasNext();) {
				String key = it.next();
				Cell cell = row.createCell(i++);
			    cell.setCellValue(createHelper.createRichTextString(maps.get(key)));
			}
			// 填充表单内容
			System.out.println("--------------------100%");
			float avg = list.size() / 20f;
			int count = 1;
			for (int j = 0; j < list.size(); j++) {
				T p = list.get(j);
				Class classType = p.getClass();
				int index = 0;
				Row row1 = sheet.createRow(j+1);
				for (Iterator<String> it = sets.iterator(); it.hasNext();) {
					String key = it.next();
					String firstLetter = key.substring(0, 1).toUpperCase();
					// 获得和属性对应的getXXX()方法的名字
					String getMethodName = "get" + firstLetter+ key.substring(1);
					// 获得和属性对应的getXXX()方法
					Method getMethod = classType.getMethod(getMethodName,new Class[] {});
					// 调用原对象的getXXX()方法
					Object value = getMethod.invoke(p, new Object[] {});
					Cell cell = row1.createCell(index++);
				    cell.setCellValue(value.toString());
				}
				if (j > avg * count) {
					count++;
					System.out.print("I");
				}
				if (count == 20) {
					System.out.print("I100%");
					count++;
				}
			}
			FileOutputStream fileOut = new FileOutputStream(file);
			wb.write(fileOut);
			fileOut.close();

		} catch (IOException e) {
			e.printStackTrace();
			return false;
		} catch (SecurityException e) {
			e.printStackTrace();
			return false;
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
			return false;
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
			return false;
		} catch (IllegalAccessException e) {
			e.printStackTrace();
			return false;
		} catch (InvocationTargetException e) {
			e.printStackTrace();
			return false;
		}
		return true;
	}
}


调用方法截取代码:
                Map<String,String> maps = new LinkedHashMap<String,String>();
		maps.put("uid", "帐号");
		maps.put("cn", "姓名");
		maps.put("dept", "部门");
		maps.put("mail", "邮箱");
		
		Properties props = System.getProperties();
		String USER_HOME = props.getProperty("user.home");
		File file = new File(USER_HOME + "/Desktop/excelExport.xlsx");
		POIExcelUtil.excelExport(maps, demo,file);


你可能感兴趣的:(利用Apache POI和Java反射开发一个excel导出工具类)