首先,自定义一个注解,目的是为了得到导出字段的标题

@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
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇