作者姓名 修改时间 版本号 描述
*/
public class PoiExportAutoMergeRowAndColumn {
private static final Logger logger = LoggerFactory.getLogger(PoiExportAutoMergeRowAndColumn.class);
public static void exportTest(String excelName, Listlist, LinkedHashMap fieldMap) {
// 设置默认文件名为当前时间:年月日时分秒
if (excelName == null || excelName == "") {
excelName = new SimpleDateFormat("yyyyMMddhhmmss").format(
new Date()).toString();
}
try {
//创建一个WorkBook,对应一个Excel文件
HSSFWorkbook wb = new HSSFWorkbook();
//在Workbook中,创建一个sheet,对应Excel中的工作薄(sheet)
HSSFSheet sheet = wb.createSheet(excelName);
//创建单元格,并设置值表头 设置表头居中
HSSFCellStyle style = wb.createCellStyle();
//创建一个居中格式
//style.setAlignment(ALIGN_CENTER);
style.setAlignment(HorizontalAlignment.CENTER);
// 填充工作表
fillSheet(sheet, list, fieldMap, style);
FileOutputStream dd = new FileOutputStream("c://test.xls");
//将文件输出
OutputStream ouputStream = dd;
wb.write(ouputStream);
ouputStream.flush();
ouputStream.close();
} catch (Exception e) {
logger.info("导出Excel失败!");
logger.error(e.getMessage());
}
}
/**
根据字段名获取字段对象
@param fieldName 字段名
@param clazz 包含该字段的类
@return 字段
*/
public static Field getFieldByName(String fieldName, Class> clazz) {
// logger.info("根据字段名获取字段对象:getFieldByName()");
// 拿到本类的所有字段
Field[] selfFields = clazz.getDeclaredFields();
// 如果本类中存在该字段,则返回
for (Field field : selfFields) {
//如果本类中存在该字段,则返回
if (field.getName().equals(fieldName)) {
return field;
}
}
// 否则,查看父类中是否存在此字段,如果有则返回
Class> superClazz = clazz.getSuperclass();
if (superClazz != null && superClazz != Object.class) {
//递归
return getFieldByName(fieldName, superClazz);
}
// 如果本类和父类都没有,则返回空
return null;
}
/**
根据字段名获取字段值
@param fieldName 字段名
@param o 对象
@return 字段值
@throws Exception 异常
*/
public static Object getFieldValueByName(String fieldName, Object o)
throws Exception {
if (o instanceof HashMap) {
return ((HashMap) o).get(fieldName);
}
// logger.info("根据字段名获取字段值:getFieldValueByName()");
Object value = null;
//根据字段名得到字段对象
Field field = getFieldByName(fieldName, o.getClass());
//如果该字段存在,则取出该字段的值
if (field != null) {
field.setAccessible(true);//类中的成员变量为private,在类外边使用属性值,故必须进行此操作
value = field.get(o);//获取当前对象中当前Field的value
} else {
throw new Exception(o.getClass().getSimpleName() + "类不存在字段名 "
+ fieldName);
}
return value;
}
/**
根据带路径或不带路径的属性名获取属性值,即接受简单属性名,
如userName等,又接受带路径的属性名,如student.department.name等
@param fieldNameSequence 带路径的属性名或简单属性名
@param o 对象
@return 属性值
@throws Exception 异常
*/
public static Object getFieldValueByNameSequence(String fieldNameSequence,
Object o) throws Exception {
// logger.info("根据带路径或不带路径的属性名获取属性值,即接受简单属性名:getFieldValueByNameSequence()");
Object value = null;
// 将fieldNameSequence进行拆分
String[] attributes = fieldNameSequence.split("\.");
if (attributes.length == 1) {
value = getFieldValueByName(fieldNameSequence, o);
} else {
// 根据数组中第一个连接属性名获取连接属性对象,如student.department.name
Object fieldObj = getFieldValueByName(attributes[0], o);
//截取除第一个属性名之后的路径
String subFieldNameSequence = fieldNameSequence
.substring(fieldNameSequence.indexOf(".") +