【自定义csv导出注解】

自定义csv导出注解

1.添加依赖

	<dependency>
	    <groupId>net.sourceforge.javacsv</groupId>
	    <artifactId>javacsv</artifactId>
	    <version>2.0</version>
	</dependency> 

2.编写工具类

public class CSVExcelUtils {
    // 获取标题头
    public static List<CSVExcelHeader> getCsvExcelHeaders(Class clazz) {
        // 获取设置了CSV注解的字段
        Field[] fields = clazz.getDeclaredFields();
        List<Field> fieldsNew = new ArrayList<>(fields.length);
        List<CSVExcelHeader> header = new ArrayList<>(fields.length);
        for (int i = 0; i < fields.length ; i++) {
            fields[i].setAccessible(true);
            CSVExcel annotation = fields[i].getAnnotation(CSVExcel.class);//获取指定类型注解
            if(annotation != null){
                fieldsNew.add(fields[i]);
                CSVExcelHeader csvExcelHeader = new CSVExcelHeader();
                csvExcelHeader.setName(annotation.name());
                csvExcelHeader.setIndex(annotation.index());
                csvExcelHeader.setFieldName(fields[i].getName());
                csvExcelHeader.setFormat(annotation.dateFormat());
                csvExcelHeader.setFieldType(fields[i].getType());
                header.add(csvExcelHeader);
            }
        }

        if (CollectionUtils.isNotEmpty(header)) {
            header = header.stream().sorted(Comparator.comparing(CSVExcelHeader::getIndex)).collect(Collectors.toList());
        }
        return header;
    }

	// 填写标题头内容
    public static void writeHeader(Class clazz, CsvWriter csvWriter) throws IOException {
        List<CSVExcelHeader> header = getCsvExcelHeaders(clazz);
        if (CollectionUtils.isNotEmpty(header)) {
            List<String> headers =  header.stream().map(e -> e.getName()).collect(Collectors.toList());
            csvWriter.writeRecord(headers.toArray(new String[headers.size()]));
        }
    }

    // 填写标题头内容
    public static void writeHeader(List<CSVExcelHeader> header, CsvWriter csvWriter) throws IOException {
        if (CollectionUtils.isNotEmpty(header)) {
            List<String> headers =  header.stream().map(e -> e.getName()).collect(Collectors.toList());
            csvWriter.writeRecord(headers.toArray(new String[headers.size()]));
        }
    }

    // 填写标题头内容
    public static void writeContent(List<CSVExcelHeader> header, CsvWriter csvWriter,List list) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        for(Object t : list) {
            FastDateFormat fastDateFormat = null;
            for (CSVExcelHeader csvExcelHeader :header) {
                String name = csvExcelHeader.getFieldName();
                String value = "";
                String getField = "get" + name.substring(0, 1).toUpperCase() + name.substring(1);
                if (StringUtils.isNotBlank(csvExcelHeader.getFormat()) && csvExcelHeader.getFieldType() == Date.class) {
                    Date date = (Date)t.getClass().getMethod(getField).invoke(t);
                    if(date != null) {
                        fastDateFormat = FastDateFormat.getInstance(csvExcelHeader.getFormat());
                        value = fastDateFormat.format(date);
                    }
                }else{
                    Object invoke = t.getClass().getMethod(getField).invoke(t);
                    if(invoke!=null){
                        value = invoke.toString();
                    }
                }
                csvWriter.write(value);
            }
            csvWriter.endRecord();
        }
    }

    public static File getFile(String fileName) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        File tempFile = File.createTempFile(fileName, ".csv");
        return tempFile;
    }

    public static CsvWriter getCsvWriter( File tempFile) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        CsvWriter csvWriter = new CsvWriter(tempFile.getCanonicalPath(), ',', Charset.forName("GBK"));
        return csvWriter;
    }

        // 填写标题头内容
    public static void download(File tempFile, CsvWriter csvWriter, HttpServletResponse response) throws IOException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        FileInputStream in = null;
        OutputStream out = null;
        try {
            csvWriter.close();
            response.reset();
            out = response.getOutputStream();
            byte[] b = new byte[1024];
            File fileLoad = new File(tempFile.getCanonicalPath());
            response.setContentType("application/csv");
            response.setHeader("content-disposition", "attachment; filename=" + java.net.URLEncoder.encode(tempFile.getName()));
            long fileLength = fileLoad.length();
            String length1 = String.valueOf(fileLength);
            response.setHeader("Content_Length", length1);
            in = new java.io.FileInputStream(fileLoad);
            int n;
            while ((n = in.read(b)) != -1) {
                out.write(b, 0, n); //每次写入out1024字节
            }
        }catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in!=null) {
                in.close();
            }
            if (out!=null) {
                out.close();
            }
        }
    }
}

3.导出注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CSVExcel {
    String name() default "";

    int index() default 0;

    String dateFormat() default "";

}


4.导出标题头

public class CSVExcelHeader {
    // 列名称
    private String name;
    // 列下标
    private Integer index;

    // 格式
    private String format;

    // 字段名称
    private String fieldName;

    // 字段名称
    private Class<?> fieldType;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getIndex() {
        return index;
    }

    public void setIndex(Integer index) {
        this.index = index;
    }

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }

    public String getFieldName() {
        return fieldName;
    }

    public void setFieldName(String fieldName) {
        this.fieldName = fieldName;
    }

    public Class<?> getFieldType() {
        return fieldType;
    }

    public void setFieldType(Class<?> fieldType) {
        this.fieldType = fieldType;
    }
}

5.导出实体类

public class UserKolApply {
    private Integer id;
    // 反馈内容
    @CSVExcel(name="申请理由",index = 4)
    private String content;
    // 反馈照片
    private String feedbackPic;
    // 用户id
    private Integer userId;
    // 用户名称
    @CSVExcel(name="昵称",index = 0)
    private String userName;
    // 用户手机号码
    private String userPhone;
    // 用户邮箱
    @CSVExcel(name="用户账户",index = 1)
    private String userEmail;
    // 代理商
    @CSVExcel(name="代理商",index = 1)
    private String agencyName;
    // 联系方式
    @CSVExcel(name="联系方式",index = 2)
    private String contactInfo;
    // 1发起审核2审核通过3失败
    private Integer status;
    // 1发起审核2审核通过3失败
    @CSVExcel(name="状态",index = 6)
    private String statusString;
    // 拒绝理由
    @CSVExcel(name="拒绝理由",index = 7)
    private String failMsg;
    // 审核人
    private Integer actorId;
    // 创建时间
    @CSVExcel(name="申请时间",index = 5,dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    // 更新时间
    @CSVExcel(name="审核时间",index = 14,dateFormat = "yyyy-MM-dd HH:mm:ss")

    private Date updateTime;
    // 当前页
    private Integer page;
    // 页码大小
    private Integer pageSize;
    //活跃数
    @CSVExcel(name="一级活跃",index = 10)
    private Long activeNumber;
    //首次充值数
    private Integer firstChargeNumber;

    //上周首次充值
    @CSVExcel(name = "一级首充",index = 11)
    private Integer beforeAddDepositNum;

    //本周首次充值
    private Integer weekAddDepositNum;



    //下级交易额
    private Double beforeOffline1Money;


    private String amountString;

    //下下级交易额
    //@CSVExcel(name="二级交易额",index = 11)
    private Double beforeOffline2Money;

    //累计结算佣金
    @CSVExcel(name="累计结算佣金",index = 12)
    private Double beforeCom;
    //备注
    private String remark;
    //审核人
    @CSVExcel(name="审核人",index = 15)
    private String actorName;
    //链接
    private String link;
    private String createTimeStart;
    private String createTimeEnd;
    private Integer agencyId;
    // 用户ids
    private String ids;
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content == null ? null : content.trim();
    }

    public String getFeedbackPic() {
        return feedbackPic;
    }

    public void setFeedbackPic(String feedbackPic) {
        this.feedbackPic = feedbackPic == null ? null : feedbackPic.trim();
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName == null ? null : userName.trim();
    }

    public String getUserPhone() {
        return userPhone;
    }

    public void setUserPhone(String userPhone) {
        this.userPhone = userPhone == null ? null : userPhone.trim();
    }

    public String getUserEmail() {
        return userEmail;
    }

    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail == null ? null : userEmail.trim();
    }

    public String getContactInfo() {
        return contactInfo;
    }

    public void setContactInfo(String contactInfo) {
        this.contactInfo = contactInfo == null ? null : contactInfo.trim();
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getFailMsg() {
        return failMsg;
    }

    public void setFailMsg(String failMsg) {
        this.failMsg = failMsg == null ? null : failMsg.trim();
    }

    public Integer getActorId() {
        return actorId;
    }

    public void setActorId(Integer actorId) {
        this.actorId = actorId;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }

    public Integer getPage() {
        return page;
    }

    public void setPage(Integer page) {
        this.page = page;
    }

    public Integer getPageSize() {
        return pageSize;
    }

    public void setPageSize(Integer pageSize) {
        this.pageSize = pageSize;
    }

    public Long getActiveNumber() {
        return activeNumber;
    }

    public void setActiveNumber(Long activeNumber) {
        this.activeNumber = activeNumber;
    }

    public Integer getFirstChargeNumber() {
        return firstChargeNumber;
    }

    public void setFirstChargeNumber(Integer firstChargeNumber) {
        this.firstChargeNumber = firstChargeNumber;
    }

    public Double getBeforeOffline1Money() {
        return beforeOffline1Money;
    }

    public void setBeforeOffline1Money(Double beforeOffline1Money) {
        this.beforeOffline1Money = beforeOffline1Money;
    }

    public Double getBeforeOffline2Money() {
        return beforeOffline2Money;
    }

    public void setBeforeOffline2Money(Double beforeOffline2Money) {
        this.beforeOffline2Money = beforeOffline2Money;
    }

    public Double getBeforeCom() {
        return beforeCom;
    }

    public void setBeforeCom(Double beforeCom) {
        this.beforeCom = beforeCom;
    }

    public String getCreateTimeStart() {
        return createTimeStart;
    }

    public void setCreateTimeStart(String createTimeStart) {
        this.createTimeStart = createTimeStart;
    }

    public String getCreateTimeEnd() {
        return createTimeEnd;
    }

    public void setCreateTimeEnd(String createTimeEnd) {
        this.createTimeEnd = createTimeEnd;
    }

    public String getLink() {
        return link;
    }

    public void setLink(String link) {
        this.link = link;
    }

    public String getStatusString() {
        return statusString;
    }

    public void setStatusString(String statusString) {
        this.statusString = statusString;
    }

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public String getActorName() {
        return actorName;
    }

    public void setActorName(String actorName) {
        this.actorName = actorName;
    }

    public String getAmountString() {
        return amountString;
    }

    public void setAmountString(String amountString) {
        this.amountString = amountString;
    }

    public Integer getBeforeAddDepositNum() {
        return beforeAddDepositNum;
    }

    public void setBeforeAddDepositNum(Integer beforeAddDepositNum) {
        this.beforeAddDepositNum = beforeAddDepositNum;
    }

    public Integer getWeekAddDepositNum() {
        return weekAddDepositNum;
    }

    public void setWeekAddDepositNum(Integer weekAddDepositNum) {
        this.weekAddDepositNum = weekAddDepositNum;
    }

    public String getAgencyName() {
        return agencyName;
    }

    public void setAgencyName(String agencyName) {
        this.agencyName = agencyName;
    }

    public Integer getAgencyId() {
        return agencyId;
    }

    public void setAgencyId(Integer agencyId) {
        this.agencyId = agencyId;
    }

    public String getIds() {
        return ids;
    }

    public void setIds(String ids) {
        this.ids = ids;
    }
}

6.导出测试类

  	public void export(UserGtexKolApplyQuery userKolApply, HttpServletResponse response) throws Exception {
        File tempFile;
        CsvWriter csvWriter;
        try {
            String fileName = "KOL审核";
            tempFile = CSVExcelUtils.getFile(fileName);
            csvWriter = CSVExcelUtils.getCsvWriter(tempFile);
            CSVExcelUtils.writeHeader(UserKolApply.class, csvWriter);
            extracted(userKolApply, CSVExcelUtils.getCsvExcelHeaders(UserKolApply.class), csvWriter);
            CSVExcelUtils.download(tempFile, csvWriter, response);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

	private void extracted(UserGtexKolApplyQuery model, List<CSVExcelHeader> csvExcelHeaders, CsvWriter csvWriter) throws IOException, InvocationTargetException, NoSuchMethodException, IllegalAccessException {
        model.setPage(model.getPage() == null ? 0 : model.getPage());
        ;
        model.setPageSize(model.getPageSize() == null ? 2000 : model.getPageSize());
        ;
        Integer limit = model.getPage() * model.getPageSize();
        model.setLimit(limit);
        int rows = userKolApplyDao.getRows(model);
        List<UserGtexKolApply> list = new ArrayList<>(10);
        int pages = 0;
        if (rows > 0) {
            list = userKolApplyDao.findAll(model);
            pages = rows / model.getPageSize();
            if (rows % model.getPageSize() > 0) {
                pages++;
            }
        }
        completeData(list);
        CSVExcelUtils.writeContent(csvExcelHeaders, csvWriter, list);
        while (pages > model.getPage()) {
            model.setPage(model.getPage() + 1);
            limit = model.getPage() * model.getPageSize();
            model.setLimit(limit);
            list = userKolApplyDao.findAll(model);
            completeData(list);
            CSVExcelUtils.writeContent(csvExcelHeaders, csvWriter, list);
        }
    }
  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyExcel 是一个基于注解Java Excel 操作库,可以方便地读写 Excel 文件。如果你想使用 EasyExcel 导出 CSV 文件,需要注意以下几点: 1. 需要使用 `@ExcelProperty` 注解来标记实体类中各个属性对应的列。例如: ```java public class User { @ExcelProperty("用户名") private String username; @ExcelProperty("年龄") private int age; @ExcelProperty("城市") private String city; // 省略 getter 和 setter 方法 } ``` 2. 需要使用 `@ExcelIgnore` 注解来忽略实体类中不需要导出的属性。例如: ```java public class User { @ExcelProperty("用户名") private String username; @ExcelProperty("年龄") private int age; @ExcelProperty("城市") private String city; @ExcelIgnore private String password; // 省略 getter 和 setter 方法 } ``` 3. 导出 CSV 文件时,需要使用 `ExcelWriterBuilder` 构建一个 `ExcelWriter` 对象,并调用 `write()` 方法写入数据。例如: ```java public class Main { public static void main(String[] args) { try (ExcelWriter writer = EasyExcel.write("output.csv").build()) { List<User> userList = new ArrayList<>(); // 添加数据到 userList Sheet sheet = new Sheet(1, 0, User.class); sheet.setSheetName("用户信息"); writer.write(userList, sheet); } } } ``` 注意,这里的 `User.class` 参数表示将 `User` 类作为 Excel 的一张表。如果你有多个表需要导出,可以创建多个 `Sheet` 对象并分别写入数据。 如果你遇到导出 CSV 文件时注解失效的问题,可以检查以下几点: 1. 实体类中的属性是否正确标记了 `@ExcelProperty` 注解。 2. 实体类中的属性是否定义为了基本类型(如 `int`、`double` 等),而不是包装类型(如 `Integer`、`Double` 等)。由于基本类型无法为 null,导出时会忽略包含 null 值的行。 3. 是否正确使用了 `@ExcelIgnore` 注解忽略不需要导出的属性。 4. 是否正确使用 `ExcelWriterBuilder` 构建了 `ExcelWriter` 对象,并调用 `write()` 方法写入数据。 希望以上信息能够帮助到你。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值