Java 实现导出excel表

分为两部分:1.传递数据内容(加了分页功能),2.拿到数据,使用自定义xml中的查询方法获取数据,再用辅助工具类处理,调用下载方法进行下载。

下面用jsp页面为例来获取列表数据。

filter是自定义的传值方式,用它将品牌名称的查询条件带到后台,实现维度筛选进行分页。




品牌名称:

然后说说控制层是接到数据后怎样处理的:

queryList方法中的selectList为xml中的查询方法,params里就是刚刚说的filter传过来的查询内容了。

/**
 * excel导出
 */
public void exportExcel(){
	try {
		if(getDefaultOrderBy()==null)
			throw new Exception("getDefaultOrderBy() not impl");
		Map params = ParamUtils.build(getDefaultOrderBy());
		LoginUser loginUser = SessionAuth.getLocalLoginUser();
		boolean superAdmin = SystemUtil.isSuperAdmin(Integer.valueOf(loginUser.getIsManager()));
		if(!superAdmin){ // 非超级管理员,只能查看当前单位或者当前单位下的数据(数据过滤),根据所属角色是否包含下级来决定
			params.put("deptCodeFilter",loginUser.getDeptCodeFilter());
			params.put("isIncluded", loginUser.getIncludeLowerLvl());//是否包含本级和下级
		}

		List productSupervisions = productSupervisionService.queryList("ProductSupervision.selectList", params);
		String fileName = "***.xls";
		ExcelUtil.ExcelModel excelModel = new ExcelUtil.ExcelModel();
		String[] fieldNames = {"","","","","","","","",""};		//数据库映射字段
		String[] headNames = {"","","","","","","","",""};		//中文标题字段

		excelModel.setFieldNames(fieldNames);
		excelModel.setHeadNames(headNames);
		excelModel.setDatas(productSupervisions);
		ExcelUtil.export2Excel(excelModel, response, fileName);
	} catch (Exception e){
		logger.error("【***数据excel导出失败】", e);
	}
}

上面方法中调用到的工具类。

import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;

import javax.servlet.http.HttpServletResponse;

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;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;

import com.xmmy.common.util.file.excel.DataFormatter;
import com.xmmy.common.util.file.excel.ReflectionUtils;

/**
 * 数据导出到Excel
 */
@SuppressWarnings("deprecation")
public class ExcelUtil {
	private static HSSFWorkbook wb;

	private static CellStyle titleStyle; // 标题行样式
	private static Font titleFont; // 标题行字体
	private static CellStyle dateStyle; // 日期行样式
	private static Font dateFont; // 日期行字体
	private static CellStyle headStyle; // 表头行样式
	private static Font headFont; // 表头行字体
	private static CellStyle contentStyle; // 内容行样式
	private static Font contentFont; // 内容行字体

	public static void export2Excel(ExcelModel excelModel, HttpServletResponse response, String fileName)
			throws IOException, IllegalAccessException {
		export2Excel(excelModel.getFieldNames(), excelModel.getHeadNames(), excelModel.getDataFormatters(),
				excelModel.getDatas(), response, fileName);
	}

	/**
	 * 导出Excel
	 * 
	 * @param fieldNames
	 * @param headNames
	 * @param datas
	 * @return
	 * @throws IOException
	 * @throws IllegalAccessException
	 */
	public static void export2Excel(String[] fieldNames, String[] headNames, DataFormatter[] formatters, List datas,
			HttpServletResponse response, String fileName) throws IOException, IllegalAccessException {
		// 标题名
		List head = new ArrayList();
		head.add(headNames);

		// 对应的列名
		List field = new ArrayList();
		field.add(fieldNames);

		// 对应的格式化
		List dataFormatters = new ArrayList<>();
		dataFormatters.add(formatters);

		ExcelUtil.ExportSetInfo setInfo = new ExcelUtil.ExportSetInfo();

		LinkedHashMap map = new LinkedHashMap();
		map.put("sheet1", datas);
		setInfo.setObjsMap(map);

		setInfo.setFieldNames(field);
		setInfo.setTitles(new String[] { "sheet1" });
		setInfo.setHeadNames(head);
		setInfo.setDataFormatters(dataFormatters);

		// 将需要导出的数据输出到baos
		ExcelUtil.export2Excel(setInfo, response, fileName);
	}

	/**
	 * @throws IllegalAccessException
	 * @throws IllegalArgumentException
	 * @Description: 将Map里的集合对象数据输出Excel数据流
	 */
	@SuppressWarnings({ "unchecked" })
	public static void export2Excel(ExportSetInfo setInfo, HttpServletResponse response, String fileName)
			throws IOException, IllegalArgumentException, IllegalAccessException {
		init();
		Set> set = setInfo.getObjsMap().entrySet();
		String[] sheetNames = new String[setInfo.getObjsMap().size()];
		int sheetNameNum = 0;
		for (Entry entry : set) {
			sheetNames[sheetNameNum] = entry.getKey();
			sheetNameNum++;
		}
		HSSFSheet[] sheets = getSheets(setInfo.getObjsMap().size(), sheetNames);
		int sheetNum = 0;
		for (Entry entry : set) {
			// Sheet
			List objs = entry.getValue();
			// 标题行
			// createTableTitleRow(setInfo, sheets, sheetNum);
			// 日期行
			// createTableDateRow(setInfo, sheets, sheetNum);
			// 表头
			creatTableHeadRow(setInfo, sheets, sheetNum);
			// 表体
			String[] fieldNames = setInfo.getFieldNames().get(sheetNum);
			DataFormatter[] formatters = setInfo.getDataFormatters().get(sheetNum);

			int rowNum = 1;
			for (Object obj : objs) {
				HSSFRow contentRow = sheets[sheetNum].createRow(rowNum);
				contentRow.setHeight((short) 300);
				HSSFCell[] cells = getCells(contentRow, setInfo.getFieldNames().get(sheetNum).length);
				int cellNum = 1; // 去掉一列序号,因此从1开始
				if (fieldNames != null) {
					for (int num = 0; num < fieldNames.length; num++) {
						Object value = ReflectionUtils.invokeGetterMethod(obj, fieldNames[num]);

						if (formatters == null || formatters[num] == null)
							cells[cellNum].setCellValue(value == null ? "" : value.toString());
						else
							cells[cellNum].setCellValue(value == null ? "" : formatters[num].formatter(value));

						cellNum++;
					}
				}
				rowNum++;
			}
			// adjustColumnSize(sheets, sheetNum, fieldNames); // 自动调整列宽
			sheetNum++;
		}
		setResponseHeader(response, fileName);
		OutputStream os = response.getOutputStream();
		wb.write(os);
		os.flush();
		os.close();
	}

	public static void setResponseHeader(HttpServletResponse response, String fileName) {
		try {
			try {
				fileName = new String(fileName.getBytes(), "ISO8859-1");
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			response.setContentType("application/octet-stream;charset=ISO8859-1");
			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
			response.addHeader("Pargam", "no-cache");
			response.addHeader("Cache-Control", "no-cache");
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	/**
	 * @Description: 初始化
	 */
	private static void init() {
		wb = new HSSFWorkbook();

		titleFont = wb.createFont();
		titleStyle = wb.createCellStyle();
		dateStyle = wb.createCellStyle();
		dateFont = wb.createFont();
		headStyle = wb.createCellStyle();
		headFont = wb.createFont();
		contentStyle = wb.createCellStyle();
		contentFont = wb.createFont();

		initTitleCellStyle();
		initTitleFont();
		initDateCellStyle();
		initDateFont();
		initHeadCellStyle();
		initHeadFont();
		initContentCellStyle();
		initContentFont();
	}

	/**
	 * @Description: 自动调整列宽
	 */
	@SuppressWarnings("unused")
	private static void adjustColumnSize(HSSFSheet[] sheets, int sheetNum, String[] fieldNames) {
		for (int i = 0; i < fieldNames.length + 1; i++) {
			sheets[sheetNum].autoSizeColumn(i, true);
		}
	}

	/**
	 * @Description: 创建标题行(需合并单元格)
	 */
	private static void createTableTitleRow(ExportSetInfo setInfo, HSSFSheet[] sheets, int sheetNum) {
		CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, setInfo.getFieldNames().get(sheetNum).length);
		sheets[sheetNum].addMergedRegion(titleRange);
		HSSFRow titleRow = sheets[sheetNum].createRow(0);
		titleRow.setHeight((short) 800);
		HSSFCell titleCell = titleRow.createCell(0);
		titleCell.setCellStyle(titleStyle);
		titleCell.setCellValue(setInfo.getTitles()[sheetNum]);
	}

	/**
	 * @Description: 创建日期行(需合并单元格)
	 */
	private static void createTableDateRow(ExportSetInfo setInfo, HSSFSheet[] sheets, int sheetNum) {
		CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0, setInfo.getFieldNames().get(sheetNum).length);
		sheets[sheetNum].addMergedRegion(dateRange);
		HSSFRow dateRow = sheets[sheetNum].createRow(1);
		dateRow.setHeight((short) 350);
		HSSFCell dateCell = dateRow.createCell(0);
		dateCell.setCellStyle(dateStyle);
		dateCell.setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
	}

	/**
	 * @Description: 创建表头行(需合并单元格)
	 */
	private static void creatTableHeadRow(ExportSetInfo setInfo, HSSFSheet[] sheets, int sheetNum) {
		// 表头
		HSSFSheet sheet = sheets[sheetNum];
		HSSFRow headRow = sheet.createRow(0);
		headRow.setHeight((short) 350);
		// 序号列
		HSSFCell snCell = headRow.createCell(0);
		snCell.setCellStyle(headStyle);
		snCell.setCellValue("序号");
		// sheet.setColumnWidth(0, 1000);

		// 列头名称
		for (int num = 1, len = setInfo.getHeadNames().get(sheetNum).length; num <= len; num++) {
			HSSFCell headCell = headRow.createCell(num);
			headCell.setCellStyle(headStyle);
			headCell.setCellValue(setInfo.getHeadNames().get(sheetNum)[num - 1]);
			sheet.setColumnWidth(num, 6000);
		}
	}

	/**
	 * @Description: 创建所有的Sheet
	 */
	private static HSSFSheet[] getSheets(int num, String[] names) {
		HSSFSheet[] sheets = new HSSFSheet[num];
		for (int i = 0; i < num; i++) {
			sheets[i] = wb.createSheet(names[i]);
		}
		return sheets;
	}

	/**
	 * @Description: 创建内容行的每一列(附加一列序号)
	 */
	private static HSSFCell[] getCells(HSSFRow contentRow, int num) {
		HSSFCell[] cells = new HSSFCell[num + 1];

		for (int i = 0, len = cells.length; i < len; i++) {
			cells[i] = contentRow.createCell(i);
			cells[i].setCellStyle(contentStyle);
		}
		// 设置序号列值,因为出去标题行和日期行,所有-2
		// cells[0].setCellValue(contentRow.getRowNum() - 2);
		cells[0].setCellValue(contentRow.getRowNum());

		return cells;
	}

	/**
	 * @Description: 初始化标题行样式
	 */
	private static void initTitleCellStyle() {
		titleStyle.setAlignment(CellStyle.ALIGN_CENTER);
		titleStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		titleStyle.setFont(titleFont);
		// titleStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.index);
	}

	/**
	 * @Description: 初始化日期行样式
	 */
	private static void initDateCellStyle() {
		dateStyle.setAlignment(CellStyle.ALIGN_CENTER_SELECTION);
		dateStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		dateStyle.setFont(dateFont);
		// dateStyle.setFillBackgroundColor(IndexedColors.SKY_BLUE.index);
	}

	/**
	 * @Description: 初始化表头行样式
	 */
	private static void initHeadCellStyle() {
		headStyle.setAlignment(CellStyle.ALIGN_CENTER);
		headStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		headStyle.setFont(headFont);
		headStyle.setFillBackgroundColor(IndexedColors.YELLOW.index);
		headStyle.setBorderTop(CellStyle.BORDER_MEDIUM);
		headStyle.setBorderBottom(CellStyle.BORDER_THIN);
		headStyle.setBorderLeft(CellStyle.BORDER_THIN);
		headStyle.setBorderRight(CellStyle.BORDER_THIN);
		// headStyle.setTopBorderColor(IndexedColors.BLUE.index);
		// headStyle.setBottomBorderColor(IndexedColors.BLUE.index);
		// headStyle.setLeftBorderColor(IndexedColors.BLUE.index);
		// headStyle.setRightBorderColor(IndexedColors.BLUE.index);
	}

	/**
	 * @Description: 初始化内容行样式
	 */
	private static void initContentCellStyle() {
		contentStyle.setAlignment(CellStyle.ALIGN_CENTER);
		contentStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
		contentStyle.setFont(contentFont);
		contentStyle.setBorderTop(CellStyle.BORDER_THIN);
		contentStyle.setBorderBottom(CellStyle.BORDER_THIN);
		contentStyle.setBorderLeft(CellStyle.BORDER_THIN);
		contentStyle.setBorderRight(CellStyle.BORDER_THIN);
		// contentStyle.setTopBorderColor(IndexedColors.BLUE.index);
		// contentStyle.setBottomBorderColor(IndexedColors.BLUE.index);
		// contentStyle.setLeftBorderColor(IndexedColors.BLUE.index);
		// contentStyle.setRightBorderColor(IndexedColors.BLUE.index);
		// contentStyle.setWrapText(true); // 字段换行
	}

	/**
	 * @Description: 初始化标题行字体
	 */
	private static void initTitleFont() {
		titleFont.setFontName("华文楷体");
		titleFont.setFontHeightInPoints((short) 20);
		titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		titleFont.setCharSet(Font.DEFAULT_CHARSET);
		// titleFont.setColor(IndexedColors.BLUE_GREY.index);
	}

	/**
	 * @Description: 初始化日期行字体
	 */
	private static void initDateFont() {
		dateFont.setFontName("隶书");
		dateFont.setFontHeightInPoints((short) 10);
		dateFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		dateFont.setCharSet(Font.DEFAULT_CHARSET);
		// dateFont.setColor(IndexedColors.BLUE_GREY.index);
	}

	/**
	 * @Description: 初始化表头行字体
	 */
	private static void initHeadFont() {
		headFont.setFontName("宋体");
		headFont.setFontHeightInPoints((short) 10);
		headFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
		headFont.setCharSet(Font.DEFAULT_CHARSET);
		// headFont.setColor(IndexedColors.BLUE_GREY.index);
	}

	/**
	 * @Description: 初始化内容行字体
	 */
	private static void initContentFont() {
		contentFont.setFontName("宋体");
		contentFont.setFontHeightInPoints((short) 10);
		contentFont.setBoldweight(Font.BOLDWEIGHT_NORMAL);
		contentFont.setCharSet(Font.DEFAULT_CHARSET);
		// contentFont.setColor(IndexedColors.BLUE_GREY.index);
	}

	/**
	 * @Description: 封装Excel导出的设置信息
	 */
	public static class ExportSetInfo {
		@SuppressWarnings("unchecked")
		private LinkedHashMap objsMap;

		private String[] titles;

		private List headNames;

		private List fieldNames;

		private List dataFormatters;

		private OutputStream out;

		@SuppressWarnings("unchecked")
		public LinkedHashMap getObjsMap() {
			return objsMap;
		}

		/**
		 * @param objsMap
		 *            导出数据
		 * 
		 *            泛型 String : 代表sheet名称 List : 代表单个sheet里的所有行数据
		 */
		@SuppressWarnings("unchecked")
		public void setObjsMap(LinkedHashMap objsMap) {
			this.objsMap = objsMap;
		}

		public List getFieldNames() {
			return fieldNames;
		}

		public void setFieldNames(List fieldNames) {
			this.fieldNames = fieldNames;
		}

		public String[] getTitles() {
			return titles;
		}

		/**
		 * @param titles
		 *            对应每个sheet里的标题,即顶部大字
		 */
		public void setTitles(String[] titles) {
			this.titles = titles;
		}

		public List getHeadNames() {
			return headNames;
		}

		/**
		 * @param headNames
		 *            对应每个页签的表头的每一列的名称
		 */
		public void setHeadNames(List headNames) {
			this.headNames = headNames;
		}

		public OutputStream getOut() {
			return out;
		}

		/**
		 * @param out
		 *            Excel数据将输出到该输出流
		 */
		public void setOut(OutputStream out) {
			this.out = out;
		}

		public List getDataFormatters() {
			return dataFormatters;
		}

		public void setDataFormatters(List dataFormatters) {
			this.dataFormatters = dataFormatters;
		}
	}

	public static class ExcelModel {
		private String[] fieldNames;
		private String[] headNames;
		private DataFormatter[] dataFormatters;
		private List datas;

		public DataFormatter[] getDataFormatters() {
			return dataFormatters;
		}

		public void setDataFormatters(DataFormatter[] dataFormatters) {
			this.dataFormatters = dataFormatters;
		}

		public String[] getFieldNames() {
			return fieldNames;
		}

		public void setFieldNames(String[] fieldNames) {
			this.fieldNames = fieldNames;
		}

		public String[] getHeadNames() {
			return headNames;
		}

		public void setHeadNames(String[] headNames) {
			this.headNames = headNames;
		}

		public List getDatas() {
			return datas;
		}

		public void setDatas(List datas) {
			this.datas = datas;
		}
	}

}
/**
 * 反射工具类.
 * 

* 提供访问私有变量,获取泛型类型Class, 提取集合中元素的属性, 转换字符串到对象等Util函数. */ public class ReflectionUtils { private static Log logger = LogFactory.getLog(ReflectionUtils.class); static { DateLocaleConverter dc = new DateLocaleConverter(); // dc.setPatterns(new String[] { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss" }); ConvertUtils.register(dc, Date.class); } /** * 调用Getter方法. */ public static Object invokeGetterMethod(Object target, String propertyName) { String getterMethodName = "get" + StringUtils.capitalize(propertyName); return invokeMethod(target, getterMethodName, new Class[]{}, new Object[]{}); } /** * 调用Setter方法.使用value的Class来查找Setter方法. */ public static void invokeSetterMethod(Object target, String propertyName, Object value) { invokeSetterMethod(target, propertyName, value, null); } /** * 调用Setter方法. * * @param propertyType 用于查找Setter方法,为空时使用value的Class替代. */ public static void invokeSetterMethod(Object target, String propertyName, Object value, Class propertyType) { Class type = propertyType != null ? propertyType : value.getClass(); String setterMethodName = "set" + StringUtils.capitalize(propertyName); invokeMethod(target, setterMethodName, new Class[]{type}, new Object[]{value}); } /** * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. */ public static Object getFieldValue(final Object object, final String fieldName) { Field field = getDeclaredField(object, fieldName); if (field == null) { throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]"); } makeAccessible(field); Object result = null; try { result = field.get(object); } catch (IllegalAccessException e) { logger.error("不可能抛出的异常{}" + e.getMessage()); } return result; } /** * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. */ public static void setFieldValue(final Object object, final String fieldName, final Object value) { Field field = getDeclaredField(object, fieldName); if (field == null) { throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + object + "]"); } makeAccessible(field); try { field.set(object, value); } catch (IllegalAccessException e) { logger.error("不可能抛出的异常:{}" + e.getMessage()); } } /** * 直接调用对象方法, 无视private/protected修饰符. */ public static Object invokeMethod(final Object object, final String methodName, final Class[] parameterTypes, final Object[] parameters) { Method method = getDeclaredMethod(object, methodName, parameterTypes); if (method == null) { throw new IllegalArgumentException("Could not find method [" + methodName + "] parameterType " + parameterTypes + " on target [" + object + "]"); } method.setAccessible(true); try { return method.invoke(object, parameters); } catch (Exception e) { throw convertReflectionExceptionToUnchecked(e); } } /** * 循环向上转型, 获取对象的DeclaredField. *

* 如向上转型到Object仍无法找到, 返回null. */ protected static Field getDeclaredField(final Object object, final String fieldName) { Assert.notNull(object, "object不能为空"); Assert.hasText(fieldName, "fieldName"); for (Class superClass = object.getClass(); superClass != Object.class; superClass = superClass .getSuperclass()) { try { return superClass.getDeclaredField(fieldName); } catch (NoSuchFieldException e) {// NOSONAR // Field不在当前类定义,继续向上转型 } } return null; } /** * 强行设置Field可访问. */ protected static void makeAccessible(final Field field) { if (!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers())) { field.setAccessible(true); } } /** * 循环向上转型, 获取对象的DeclaredMethod. *

* 如向上转型到Object仍无法找到, 返回null. */ protected static Method getDeclaredMethod(Object object, String methodName, Class[] parameterTypes) { Assert.notNull(object, "object不能为空"); for (Class superClass = object.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) { try { return superClass.getDeclaredMethod(methodName, parameterTypes); } catch (NoSuchMethodException e) {// NOSONAR // Method不在当前类定义,继续向上转型 } } return null; } /** * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. eg. public UserDao * extends HibernateDao * * @param clazz The class to introspect * @return the first generic declaration, or Object.class if cannot be * determined */ @SuppressWarnings("unchecked") public static Class getSuperClassGenricType(final Class clazz) { return getSuperClassGenricType(clazz, 0); } /** * 通过反射, 获得定义Class时声明的父类的泛型参数的类型. 如无法找到, 返回Object.class. *

* 如public UserDao extends HibernateDao * * @param clazz clazz The class to introspect * @param index the Index of the generic ddeclaration,start from 0. * @return the index generic declaration, or Object.class if cannot be * determined */ @SuppressWarnings("unchecked") public static Class getSuperClassGenricType(final Class clazz, final int index) { Type genType = clazz.getGenericSuperclass(); if (!(genType instanceof ParameterizedType)) { logger.warn(clazz.getSimpleName() + "'s superclass not ParameterizedType"); return Object.class; } Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); if (index >= params.length || index < 0) { logger.warn("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + params.length); return Object.class; } if (!(params[index] instanceof Class)) { logger.warn(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); return Object.class; } return (Class) params[index]; } /** * 提取集合中的对象的属性(通过getter函数), 组合成List. * * @param collection 来源集合. * @param propertyName 要提取的属性名. */ @SuppressWarnings("unchecked") public static List convertElementPropertyToList(final Collection collection, final String propertyName) { List list = new ArrayList(); try { for (Object obj : collection) { list.add(PropertyUtils.getProperty(obj, propertyName)); } } catch (Exception e) { throw convertReflectionExceptionToUnchecked(e); } return list; } /** * 提取集合中的对象的属性(通过getter函数), 组合成由分割符分隔的字符串. * * @param collection 来源集合. * @param propertyName 要提取的属性名. * @param separator 分隔符. */ @SuppressWarnings("unchecked") public static String convertElementPropertyToString(final Collection collection, final String propertyName, final String separator) { List list = convertElementPropertyToList(collection, propertyName); return StringUtils.join(list, separator); } /** * 转换字符串到相应类型. * * @param value 待转换的字符串 * @param toType 转换目标类型 */ @SuppressWarnings("unchecked") public static T convertStringToObject(String value, Class toType) { try { return (T) ConvertUtils.convert(value, toType); } catch (Exception e) { throw convertReflectionExceptionToUnchecked(e); } } /** * 将反射时的checked exception转换为unchecked exception. */ public static RuntimeException convertReflectionExceptionToUnchecked(Exception e) { return convertReflectionExceptionToUnchecked(null, e); } public static RuntimeException convertReflectionExceptionToUnchecked(String desc, Exception e) { desc = (desc == null) ? "Unexpected Checked Exception." : desc; if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException || e instanceof NoSuchMethodException) { return new IllegalArgumentException(desc, e); } else if (e instanceof InvocationTargetException) { return new RuntimeException(desc, ((InvocationTargetException) e).getTargetException()); } else if (e instanceof RuntimeException) { return (RuntimeException) e; } return new RuntimeException(desc, e); } public static final T getNewInstance(Class cls) { try { return cls.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return null; } /** * 拷贝 source 指定的porperties 属性 到 dest中 * * @return void * @throws java.lang.reflect.InvocationTargetException * @throws IllegalAccessException */ public static void copyPorperties(Object dest, Object source, String[] porperties) throws InvocationTargetException, IllegalAccessException { for (String por : porperties) { Object srcObj = invokeGetterMethod(source, por); logger.debug("属性名:" + por + "------------- 属性值:" + srcObj); if (srcObj != null) { try { BeanUtils.setProperty(dest, por, srcObj); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { throw e; } catch (InvocationTargetException e) { throw e; } } } } /** * 两者属性名一致时,拷贝source里的属性到dest里 * * @return void * @throws IllegalAccessException * @throws java.lang.reflect.InvocationTargetException */ @SuppressWarnings("unchecked") public static void copyPorperties(Object dest, Object source) throws IllegalAccessException, InvocationTargetException { Class srcCla = source.getClass(); Field[] fsF = srcCla.getDeclaredFields(); for (Field s : fsF) { String name = s.getName(); Object srcObj = invokeGetterMethod(source, name); try { BeanUtils.setProperty(dest, name, srcObj); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { throw e; } catch (InvocationTargetException e) { throw e; } } // BeanUtils.copyProperties(dest, orig); } }

 

你可能感兴趣的:(java实现文件类功能)