自定义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);
}
}