如下:最近使用POI导出97(.xls)excel文件,做个记录。
使用反射通过拼接实体类的get方法获取到指定字段里面的值
java代码:
/**
*
* 导出方法
* <p>
*
* @param dataList
* 数据集合
* @param fieldArray
* 属性字段与列名的数组,如:[{"name":"sex",label:"性别"}]
* @param response
* @throws Exception
*/
@SuppressWarnings("resource")
public static <T> void exportExcelData(List<T> dataList, String[] fieldArray, HttpServletResponse response) throws Exception {
if (null == dataList || null == fieldArray) {
throw new Exception("导出数据与字段不能为空");
}
// 创建工作簿
HSSFWorkbook workBook = new HSSFWorkbook();
Sheet sheet = workBook.createSheet();
int rowIndex = 0;
for (T t : dataList) {
// 超出最大限定行数则新建工作表
if (rowIndex % 65535 == 0 || rowIndex == 0) {
if (rowIndex != 0) {
sheet = workBook.createSheet();
}
// 设定标题行
Row titleRow = sheet.createRow(0);
setRowContent(titleRow, fieldArray, true, t);
// index下标从第一开始写入
rowIndex = 1;
}
// 设定行内容
Row row = sheet.createRow(rowIndex);
setRowContent(row, fieldArray, false, t);
rowIndex++;
}
// 设置默认文件名为当前时间:年月日时分秒
String fileName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date()).toString();
// 设置response头信息
response.reset();
response.setContentType("application/ms-excel;charset=UTF-8"); // 改成输出excel文件
response.setHeader("Content-disposition", "attachment; filename=" + fileName + ".xls");
// 响应输出流
OutputStream out = response.getOutputStream();
workBook.write(out);
out.flush();
out.close();
}
/**
*
* 根据isTitle标记设置行的内容
* <p>
*
* @param row
* 行对象
* @param fieldArray
* 字段数组
* @param isTitle
* 是否设置标题行内容
* @param t
* 实体对象
* @throws Exception
*/
private static <T> void setRowContent(Row row, String[] fieldArray, boolean isTitle, T t) throws Exception {
for (int j = 0; j < fieldArray.length; j++) {
JSONObject jsonObject = JSONObject.fromObject(fieldArray[j]);
String name = jsonObject.optString("name");
String label = jsonObject.optString("label");
if (StringUtils.isBlank(name)) {
continue;
}
if (isTitle) {
row.createCell(j).setCellValue(label);
} else {
row.createCell(j).setCellValue(getFieldValue(t, name));
}
}
}
/**
*
* 根据字段名获取到字段值,拼接实体的get方法
* <p>
*
* @param <T>
*
* @param clazz
* @param name
* @return
* @throws SecurityException
* @throws NoSuchMethodException
*/
private static <T> String getFieldValue(T t, String name) throws Exception {
// 拼接get方法名
String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
Object object = t.getClass().getMethod(methodName, new Class[] {}).invoke(t, new Object[] {});
String resultStr = "";
if (null == object) {
return resultStr;
}
// 根据类型转换成对应值。如有其它再自行添加
if (object instanceof Date) {
resultStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(object);
} else if (object.getClass().isEnum()) {
resultStr = getEnumValueByKey(object.toString());
} else {
resultStr = object.toString();
}
return resultStr;
}
/**
*
* 获取到类型的值,如DATABASE:数据库
* <p>
*
* @param key
* @return
*/
public static String getEnumValueByKey(String key) {
Map<String, String> map = new HashMap<String, String>();
map.put("DATABASE", "数据库");
map.put("FILE", "文件");
map.put("WEBSERVICE", "WS");
map.put("RESTFUL", "REST");
return map.get(key);
}