excel导入导出工具类
maven配置
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.13</version>
</dependency>
调用方式:
导出:
OutputStream out = xxxx;
List<String[]> headNames = new ArrayList<String[]>();
headNames.add(new String[] { "交易ID", "用户ID", "提现金额", "创建时间"});
List<String[]> fieldNames = new ArrayList<String[]>();
fieldNames.add(new String[] { "payid", "payAccountUid", "totalMoney", "createdAt"});
ExportSetInfo setInfo = new ExportSetInfo();
LinkedHashMap<String, List> objsMap = new LinkedHashMap<String, List>();
List<XwTrades> xwTradesList = xxxx;
objsMap.put("提现数据", xwTradesList);
setInfo.setObjsMap(objsMap);
setInfo.setFieldNames(fieldNames);
setInfo.setTitles(new String[] { "提现数据" });
setInfo.setHeadNames(headNames);
setInfo.setOut(out);
导入:
InputStream in = xxxx;
ExcelUtil excelUtil = new ExcelUtil();
List<String[]> dataList = excelUtil.importExcel(in, 0);
ExcelUtil:
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
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.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
public class ExcelUtil2
{
private HSSFWorkbook wb;
private BufferedInputStream in;
private CellStyle titleStyle; // 标题行样式
private Font titleFont; // 标题行字体
private CellStyle dateStyle; // 日期行样式
private Font dateFont; // 日期行字体
private CellStyle headStyle; // 表头行样式
private Font headFont; // 表头行字体
private CellStyle contentStyle ; // 内容行样式
private Font contentFont; // 内容行字体
private SimpleDateFormat sdf;
/**
* 导出数据
* @param setInfo
* @throws IOException
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
@SuppressWarnings("unchecked")
public void export2Excel(ExportSetInfo setInfo) throws IOException, IllegalArgumentException, IllegalAccessException
{
initWrite();
initStyle(setInfo);
sdf = new SimpleDateFormat(setInfo.getDateFormat());
Set<Entry<String, List>> set = setInfo.getObjsMap().entrySet();
String[] sheetNames = new String[setInfo.getObjsMap().size()];
int sheetNameNum = 0;
for (Entry<String, List> entry : set)
{
sheetNames[sheetNameNum] = entry.getKey();
sheetNameNum++;
}
HSSFSheet[] sheets = getSheets(setInfo.getObjsMap().size(), sheetNames);
int sheetNum = 0;
for (Entry<String, List> entry : set)
{
int rowNum = 0;
// Sheet
List objs = entry.getValue();
if(setInfo.isShowTableTitle()){
// 标题行
createTableTitleRow(setInfo, sheets, sheetNum, rowNum);
rowNum++;
}
if(setInfo.isShowTableDate()){
// 日期行
createTableDateRow(setInfo, sheets, sheetNum, rowNum);
rowNum++;
}
// 表头
creatTableHeadRow(setInfo, sheets, sheetNum, rowNum);
rowNum++;
// 表体
String[] fieldNames = setInfo.getFieldNames().get(sheetNum);
int index = 0;
for (Object obj : objs)
{
HSSFRow contentRow = sheets[sheetNum].createRow(rowNum);
contentRow.setHeight((short) 300);
HSSFCell[] cells = getCells(contentRow, setInfo.getFieldNames().get(sheetNum).length, index);
int cellNum = 1; // 去掉一列序号,因此从1开始
if(fieldNames != null)
{
for (int num = 0; num < fieldNames.length; num++)
{
Object value = ReflectionUtils.invokeGetterMethod(obj, fieldNames[num]);
if(value instanceof Date){
value = sdf.format(value);
}
cells[cellNum].setCellValue(value == null ? "" : value.toString());
cellNum++;
}
}
index++;
rowNum++;
}
if(setInfo.isAutoAdjustColumnSize()){
adjustColumnSize(sheets, sheetNum, fieldNames); // 自动调整列宽
}
sheetNum++;
}
wb.write(setInfo.getOut());
closeWb();
}
/**
* 导入数据
* @param filePath
* @return
* @throws IOException
*/
public Map<String, List<String[]>> importExcel(String filePath) throws IOException {
return importExcel(new FileInputStream(filePath));
}
/**
* 导入数据
* @param inputStream
* @return
* @throws IOException
*/
public Map<String, List<String[]>> importExcel(InputStream inputStream) throws IOException {
initReadWb(inputStream);
Map<String, List<String[]>> map = getAllSheetValues(-1, -1);
closeWb();
return map;
}
/**
* 导入数据
* @param filePath
* @param sheetIndex
* @param rowNum
* @return
* @throws IOException
*/
public List<String[]> importExcel(String filePath, int sheetIndex, int rowNum) throws IOException {
return importExcel(new FileInputStream(filePath), sheetIndex, rowNum);
}
/**
* 导入数据
* @param inputStream
* @param sheetIndex
* @param rowNum
* @return
* @throws IOException
*/
public List<String[]> importExcel(InputStream inputStream, int sheetIndex, int rowNum) throws IOException {
initReadWb(inputStream);
List<String[]> list = getOneSheetValues(sheetIndex, rowNum);
closeWb();
return list;
}
/**
* 导入数据
* @param filePath
* @param sheetIndex
* @return
* @throws IOException
*/
public List<String[]> importExcel(String filePath, int sheetIndex) throws IOException {
return importExcel(new FileInputStream(filePath), sheetIndex);
}
/**
* 导入数据
* @param inputStream
* @param sheetIndex
* @return
* @throws IOException
*/
public List<String[]> importExcel(InputStream inputStream, int sheetIndex) throws IOException {
initReadWb(inputStream);
List<String[]> list = getOneSheetValues(sheetIndex, -1);
closeWb();
return list;
}
/**
* 初始化导出
*/
private void initWrite()
{
wb = new HSSFWorkbook();
}
/**
* 初始化导入
* @param inputStream
* @throws IOException
*/
private void initReadWb(InputStream inputStream) throws IOException {
in = new BufferedInputStream(inputStream);
POIFSFileSystem fs = new POIFSFileSystem(in);
wb = new HSSFWorkbook(fs);
}
/**
* 关闭IO
* @throws IOException
*/
private void closeWb() throws IOException {
if(in != null){
in.close();
}
if(wb != null){
wb.close();
}
}
/**
* 初始化样式
* @param setInfo
*/
private void initStyle(ExportSetInfo setInfo){
titleFont = wb.createFont();
dateFont = wb.createFont();
headFont = wb.createFont();
contentFont = wb.createFont();
titleFont.setFontName("宋体");
titleFont.setFontHeightInPoints((short) 20);
titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
titleFont.setCharSet(Font.DEFAULT_CHARSET);
titleFont.setColor(IndexedColors.BLACK.index);
dateFont.setFontName("宋体");
dateFont.setFontHeightInPoints((short) 10);
dateFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
dateFont.setCharSet(Font.DEFAULT_CHARSET);
dateFont.setColor(IndexedColors.BLACK.index);
headFont.setFontName("宋体");
headFont.setFontHeightInPoints((short) 10);
headFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
headFont.setCharSet(Font.DEFAULT_CHARSET);
headFont.setColor(IndexedColors.BLACK.index);
contentFont.setFontName("宋体");
contentFont.setFontHeightInPoints((short) 10);
contentFont.setBoldweight(Font.BOLDWEIGHT_NORMAL);
contentFont.setCharSet(Font.DEFAULT_CHARSET);
contentFont.setColor(IndexedColors.BLACK.index);
if(setInfo.getTitleStyle() != null){
titleStyle = setInfo.getTitleStyle();
}else{
titleStyle = wb.createCellStyle();
titleStyle.setAlignment(CellStyle.ALIGN_CENTER);
titleStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
titleStyle.setFont(titleFont);
titleStyle.setFillBackgroundColor(IndexedColors.BLACK.index);
}
if(setInfo.getDateStyle() != null){
dateStyle = setInfo.getDateStyle();
}else{
dateStyle = wb.createCellStyle();
dateStyle.setAlignment(CellStyle.ALIGN_CENTER_SELECTION);
dateStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
dateStyle.setFont(dateFont);
dateStyle.setFillBackgroundColor(IndexedColors.BLACK.index);
}
if(setInfo.getHeadStyle() != null){
headStyle = setInfo.getHeadStyle();
}else{
headStyle = wb.createCellStyle();
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.BLACK.index);
headStyle.setBottomBorderColor(IndexedColors.BLACK.index);
headStyle.setLeftBorderColor(IndexedColors.BLACK.index);
headStyle.setRightBorderColor(IndexedColors.BLACK.index);
}
if(setInfo.getDateStyle() != null){
contentStyle = setInfo.getDateStyle();
}else{
contentStyle = wb.createCellStyle();
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.BLACK.index);
contentStyle.setBottomBorderColor(IndexedColors.BLACK.index);
contentStyle.setLeftBorderColor(IndexedColors.BLACK.index);
contentStyle.setRightBorderColor(IndexedColors.BLACK.index);
contentStyle.setWrapText(true); // 字段换行
}
}
/**
* 自动调整列宽
*/
@SuppressWarnings("unused")
private void adjustColumnSize(HSSFSheet[] sheets, int sheetNum, String[] fieldNames)
{
for(int i = 0; i < fieldNames.length + 1; i++)
{
sheets[sheetNum].autoSizeColumn(i, true);
}
}
/**
* 创建标题行(需合并单元格)
*/
private void createTableTitleRow(ExportSetInfo setInfo,
HSSFSheet[] sheets, int sheetNum, int row)
{
CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0,
setInfo.getFieldNames().get(sheetNum).length);
sheets[sheetNum].addMergedRegion(titleRange);
HSSFRow titleRow = sheets[sheetNum].createRow(row);
titleRow.setHeight((short) 800);
HSSFCell titleCell = titleRow.createCell(0);
titleCell.setCellStyle(titleStyle);
titleCell.setCellValue(setInfo.getTitles()[sheetNum]);
}
/**
* 创建日期行(需合并单元格)
*/
private void createTableDateRow(ExportSetInfo setInfo,
HSSFSheet[] sheets, int sheetNum, int row)
{
CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0,
setInfo.getFieldNames().get(sheetNum).length);
sheets[sheetNum].addMergedRegion(dateRange);
HSSFRow dateRow = sheets[sheetNum].createRow(row);
dateRow.setHeight((short) 350);
HSSFCell dateCell = dateRow.createCell(0);
dateCell.setCellStyle(dateStyle);
dateCell.setCellValue(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
}
/**
* 创建表头行(需合并单元格)
*/
private void creatTableHeadRow(ExportSetInfo setInfo,
HSSFSheet[] sheets, int sheetNum, int row)
{
// 表头
HSSFRow headRow = sheets[sheetNum].createRow(row);
headRow.setHeight((short) 350);
// 序号列
HSSFCell snCell = headRow.createCell(0);
snCell.setCellStyle(headStyle);
snCell.setCellValue("序号");
// 列头名称
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
*/
private 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;
}
/**
* 创建内容行的每一列(附加一列序号)
*/
private HSSFCell[] getCells(HSSFRow contentRow, int num, int index)
{
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);
}
// 设置序号列值
cells[0].setCellValue(index+1);
return cells;
}
/**
* 封装Excel导出的设置信息
*/
public static class ExportSetInfo
{
@SuppressWarnings("unchecked")
private LinkedHashMap<String, List> objsMap;
private String[] titles;
private List<String[]> headNames;
private List<String[]> fieldNames;
private OutputStream out;
private String dateFormat = "yyyy-MM-dd HH:mm:ss";
private CellStyle titleStyle; // 标题行样式
private CellStyle dateStyle; // 日期行样式
private CellStyle headStyle; // 表头行样式
private CellStyle contentStyle ; // 内容行样式
private boolean showTableTitle = false;
private boolean showTableDate = false;
private boolean autoAdjustColumnSize = true;
@SuppressWarnings("unchecked")
public LinkedHashMap<String, List> getObjsMap()
{
return objsMap;
}
/**
* @param objMap 导出数据
*
* 泛型
* String : 代表sheet名称
* List : 代表单个sheet里的所有行数据
*/
@SuppressWarnings("unchecked")
public void setObjsMap(LinkedHashMap<String, List> objsMap)
{
this.objsMap = objsMap;
}
public List<String[]> getFieldNames()
{
return fieldNames;
}
/**
* @param clazz 对应每个sheet里的每行数据的对象的属性名称
*/
public void setFieldNames(List<String[]> fieldNames)
{
this.fieldNames = fieldNames;
}
public String[] getTitles()
{
return titles;
}
/**
* @param titles 对应每个sheet里的标题,即顶部大字
*/
public void setTitles(String[] titles)
{
this.titles = titles;
}
public List<String[]> getHeadNames()
{
return headNames;
}
/**
* @param headNames 对应每个页签的表头的每一列的名称
*/
public void setHeadNames(List<String[]> headNames)
{
this.headNames = headNames;
}
public OutputStream getOut()
{
return out;
}
/**
* @param out Excel数据将输出到该输出流
*/
public void setOut(OutputStream out)
{
this.out = out;
}
public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}
public String getDateFormat() {
return dateFormat;
}
public CellStyle getTitleStyle() {
return titleStyle;
}
public void setTitleStyle(CellStyle titleStyle) {
this.titleStyle = titleStyle;
}
public CellStyle getDateStyle() {
return dateStyle;
}
public void setDateStyle(CellStyle dateStyle) {
this.dateStyle = dateStyle;
}
public CellStyle getHeadStyle() {
return headStyle;
}
public void setHeadStyle(CellStyle headStyle) {
this.headStyle = headStyle;
}
public CellStyle getContentStyle() {
return contentStyle;
}
public void setContentStyle(CellStyle contentStyle) {
this.contentStyle = contentStyle;
}
public boolean isShowTableTitle() {
return showTableTitle;
}
public void setShowTableTitle(boolean showTableTitle) {
this.showTableTitle = showTableTitle;
}
public boolean isShowTableDate() {
return showTableDate;
}
public void setShowTableDate(boolean showTableDate) {
this.showTableDate = showTableDate;
}
public boolean isAutoAdjustColumnSize() {
return autoAdjustColumnSize;
}
public void setAutoAdjustColumnSize(boolean autoAdjustColumnSize) {
this.autoAdjustColumnSize = autoAdjustColumnSize;
}
}
/**
* 获取单元格中的值
*
* @param cell 单元格
* @return
*/
private static Object getCellValue(Cell cell) {
int type = cell.getCellType();
switch (type) {
case Cell.CELL_TYPE_STRING:
return (Object) cell.getStringCellValue();
case Cell.CELL_TYPE_NUMERIC:
Double value = cell.getNumericCellValue();
return (Object) (value.intValue());
case Cell.CELL_TYPE_BOOLEAN:
return (Object) cell.getBooleanCellValue();
case Cell.CELL_TYPE_FORMULA:
return (Object) cell.getArrayFormulaRange().formatAsString();
case Cell.CELL_TYPE_BLANK:
return (Object) "";
default:
return null;
}
}
/**
* 读取一个sheet的数据
* @param sheetIndex 从0开始
* @param rowNum 从0开始
* @return
* @throws IOException
*/
private List<String[]> getOneSheetValues(int sheetIndex, int rowNum) throws IOException{
List<String[]> list = new ArrayList<String[]>();
HSSFSheet sheet = wb.getSheetAt(sheetIndex);
if(sheet == null){
return list;
}
int maxColumnIndex = 0;
int maxRow = sheet.getLastRowNum();
List<HSSFRow> rowList = new ArrayList<HSSFRow>();
if(rowNum >= 0){
if(rowNum > maxRow){
return list;
}
HSSFRow row = sheet.getRow(rowNum);
maxColumnIndex = row.getLastCellNum();
rowList.add(row);
}else{
for(int rowIndex=0; rowIndex<=maxRow; rowIndex++){
HSSFRow row = sheet.getRow(rowIndex);
if(maxColumnIndex == 0 || row.getLastCellNum() > maxColumnIndex){
maxColumnIndex = row.getLastCellNum();
}
rowList.add(row);
}
}
for(HSSFRow row : rowList){
String[] arr = new String[maxColumnIndex];
for(int columnIndex=0; columnIndex<maxColumnIndex; columnIndex++){
HSSFCell cell = row.getCell(columnIndex);
if(cell == null){
arr[columnIndex] = "";
}else{
arr[columnIndex] = String.valueOf(getCellValue(cell));
}
}
list.add(arr);
}
return list;
}
/**
* 读取所有sheet的数据
* @param file
* @param sheetIndex
* @param rowNum
* @return
* @throws IOException
*/
private Map<String, List<String[]>> getAllSheetValues(int sheetIndex, int rowNum) throws IOException{
Map<String, List<String[]>> map = new LinkedHashMap<String, List<String[]>>();
List<HSSFSheet> sheetList = new ArrayList<HSSFSheet>();
if(sheetIndex >= 0){
sheetList.add(wb.getSheetAt(sheetIndex));
}else{
for (int i = 0; i < wb.getNumberOfSheets(); i++) {
sheetList.add(wb.getSheetAt(i));
}
}
for(HSSFSheet st : sheetList){
map.put(st.getSheetName(), getOneSheetValues(sheetIndex, rowNum));
}
return map;
}
/**
* 调整数据表头顺序
* @param baseObjsList
* @param destHearder
* @return
* @throws Exception
*/
public List<String[]> changeOrderByHeader(List<String[]> baseObjsList, String[] destHearder) throws Exception {
String[] baseHearder = baseObjsList.get(0);
if(destHearder.length != baseHearder.length){
throw new Exception("表头匹配错误");
}
Map<String, Integer> baseHearderMap = new HashMap<String, Integer>();
for(int i=0; i<baseHearder.length; i++){
String h = baseHearder[i];
baseHearderMap.put((String)h, i);
}
Map<Integer, Integer> orderMap = new HashMap<Integer, Integer>(); //key: destObjsList下标 -- baseObjsList下标
for(int i=0; i<destHearder.length; i++){
String h = destHearder[i];
if(!baseHearderMap.containsKey(h)){
throw new Exception("表头匹配错误,缺少["+h+"]列");
}
orderMap.put(i, baseHearderMap.get(h));
}
List<String[]> destObjsList = new ArrayList<String[]>();
for(int i=0; i<baseObjsList.size(); i++){
if(i == 0){
continue;
}
String[] baseObjs = baseObjsList.get(i);
String[] destObjs = new String[baseObjs.length];
for(int j=0; j<baseObjs.length; j++){
destObjs[j] = baseObjs[orderMap.get(j)];
}
destObjsList.add(destObjs);
}
return destObjsList;
}
}
ReflectionUtils:
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.beanutils.locale.converters.DateLocaleConverter;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* 反射工具类.
*
* 提供访问私有变量,获取泛型类型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)
{
if (object == null) {
throw new IllegalArgumentException("object不能为空");
}
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)
{
if (object == null) {
throw new IllegalArgumentException("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<User>
*
* @param clazz The class to introspect
* @return the first generic declaration, or Object.class if cannot be
* determined
*/
@SuppressWarnings("unchecked")
public static <T> Class<T> getSuperClassGenricType(final Class clazz)
{
return getSuperClassGenricType(clazz, 0);
}
/**
* 通过反射, 获得定义Class时声明的父类的泛型参数的类型. 如无法找到, 返回Object.class.
*
* 如public UserDao extends HibernateDao<User,Long>
*
* @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> T convertStringToObject(String value, Class<T> 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> T getNewInstance(Class<T> cls)
{
try
{
return cls.newInstance();
}
catch (InstantiationException e)
{
e.printStackTrace();
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
return null;
}
/**
* 拷贝 source 指定的porperties 属性 到 dest中
*
* @return void
* @throws 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 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);
}
}

浙公网安备 33010602011771号