背景
和第三方对接,需要我们做一个定时任务,每周捞取一次数据库特定表并生成CSV上传至特定路径,因此有了这篇文章。
本文主要利用commons-csv工具包来生成的。
依赖(当前时间最新版本)
maven
org.apache.commons
commons-csv
1.8
gradle
compile group: 'org.apache.commons', name: 'commons-csv', version: '1.8'
pojo
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CsvMetadata {
private String id;
private String name;
private String phone;
}
自定义工具类
@Log4j2
public class CsvHelper {
/**
* note : when invoke this method, the metadatas list field's value should have the right order in order to matching
* the header's fields
*/
public void writeCsvFile(String[] header, List> metadatas, String filePath) {
try (CSVPrinter printer = CSVFormat.DEFAULT.withHeader(header)
.print(new PrintWriter(
filePath))) {
for (List metadata : metadatas) {
printer.printRecord(metadata);
}
printer.flush();
} catch (IOException e) {
log.error("generate csv file failed", e);
throw new RuntimeException("generate csv file failed");
}
}
}
测试
public class TestGenerateCsv {
private static final String[] headers = new String[]{"id", "name", "phone"};
public static void main(String[] args) {
List metaDatas = Lists.newLinkedList();
List> datas = Lists.newArrayList();
// 1. 模拟数据
for (int i = 0; i < 10; i++) {
CsvMetadata data = new CsvMetadata(UUID.randomUUID().toString(), "name" + i,
String.valueOf(Math.random()).substring(2, 13));
metaDatas.add(data);
}
// 2. 构造业务数据
metaDatas.forEach(it -> {
List linkedList = Lists.newLinkedList();
linkedList.add(it.getId() + "");
linkedList.add(it.getName());
linkedList.add(it.getPhone());
datas.add(linkedList);
});
CsvHelper helper = new CsvHelper();
helper.writeCsvFile(headers, datas, "test.csv");
}
}
结果
image.png
说明:工具类比较简单,传入的参数需要用户先构造好的,当然可以通过反射利用注解丰富CsvHelper类,只传入List对调用者更友好,这个笔者没有实现,读者可自行实现。