java实现数据的Excel导出, 自定义导出字段, 转换字典值
第一版代码:
基础功能跳转此文章java自定义Excel导出工具:
简介
新增功能:
- 添加自定义字段导出功能, 用户可以选择字段进行导出
- 将字典类型数据进行转换(如:0=女,1=男, 将0转换为女, 1转换为男)
- 添加表头格式
- 随机文件名称, 防止多次导出时文件覆盖问题
实现代码
Excel注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel {
/**
* 导出到Excel中的名字
*/
String name() default "";
/**
* 日期格式, 如: yyyy-MM-dd
*/
String dateFormat() default "";
/**
* 字典的key值
*/
String dictKey() default "";
/**
* 读取内容转表达式 (如: 0=男,1=女,2=未知)
*/
String dictExp() default "";
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
Excel的导出工具类
/**
* Excel的工具类
*/
public class ExcelUtil<T> {
/**
* 工作薄
*/
private Workbook wb;
/**
* 工作表
*/
private Sheet sheet;
/**
* 需要导出的数据
*/
private List<T> exportList;
/**
* 对象的class对象
*/
private Class<T> clazz;
/**
* 被选中需要导出的字段名称
*/
private Map<String, Object> checkedFieldsName;
/**
* 被选中需要导出的字段对象
*/
private List<Field> checkedFields;
/**
* 包含需要字典转换的字段对象
*/
private List<Field> fieldsContainDict;
/**
* 对象中的字典值
*/
private Map<String, Map<String, String>> dicts;
private ExcelUtil(){
}
public ExcelUtil(Class<T> clazz){
this.clazz = clazz;
}
/**
*
* @param list
* @param sheetName
* @param fieldsName
*/
public void exportExcel(List<T> list, Map<String, Object> fieldsName, String sheetName){
// 初始化数据
init(list, sheetName, fieldsName);
// 转换字典值
try {
convertDict();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// sheet第一行加入名称数据
createTopRow();
// sheet其他行,添加目标数据
try {
createOtherRow();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
// 导出wb
try(OutputStream outFile = new FileOutputStream(generateFileName())){
wb.write(outFile);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
wb.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 添加导出数据
*/
private void createOtherRow() throws IllegalAccessException {
for (int rowNum = 1; rowNum <= exportList.size(); rowNum++) {
Row row = sheet.createRow(rowNum);
T t = exportList.get(rowNum - 1);
for (int colNum = 0; colNum < checkedFields.size(); colNum++)