首先,自定义一个注解,目的是为了得到导出字段的标题
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(value= ElementType.FIELD)
public @interface FieldComment {
int sort() default 0 ;
String value() ;
}
然后,在要导出的实体类的属性上添加此注解
public class User implements Serializable {
private String id;
/**
* 姓名
*/
@FieldComment("姓名")
private String name;
/**
* 年龄
*/
@FieldComment("年龄")
private String age;
接下来的导出的具体操作的方法,目前只做了时间的格式化,如有需要可加其他类型的格式化
public class CustomExportExcel<E> {
/**
* 自定义导出
* 在要导出的实体类的字段上要添加@FieldComment("XXXX")注解
* 其中XXXX为该字段的标题
*
* @param list 要导出的数据列表
* @param fields 要导出的字段
* @param response response
* @param fileName 文件名
* @param sdf date转成字符串的格式
*/
@SuppressWarnings("all")
public final void customExportExcel(List<E> list, String[] fields, HttpServletResponse response, String fileName, SimpleDateFormat sdf){
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("1");
HSSFRow row0 = sheet.createRow(0);
try {
for(int i=0;i<list.size();i++){
E e = list.get(i);
HSSFRow row = sheet.createRow(i+1);
for(int j=0;j<fields.length;j++){
Field f = e.getClass().getDeclaredField(fields[j]);
//标题
if(i==0){
FieldComment fm = f.getAnnotation(FieldComment.class);
HSSFCell cell = row0.createCell(j);
cell.setCellValue(fm.value());
}
//数据
f.setAccessible(true);
Object data = f.get(e);
if(data==null){
row.createCell(j).setCellValue("");
}else{
switch (f.getType().getName()){
case "java.util.Date":
row.createCell(j).setCellValue(sdf.format(data));
break;
default:
row.createCell(j).setCellValue(data.toString());
break;
}
}
}
}
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("GB2312"), "ISO8859-1"));
OutputStream ouputStream = response.getOutputStream();
wb.write(ouputStream);
ouputStream.flush();
ouputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
然后调用此方法就可以了
最后修改于 2019-09-20 10:53:29