You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.9 KiB
60 lines
1.9 KiB
package com.example.export;
|
|
|
|
import java.io.FileWriter;
|
|
import java.io.PrintWriter;
|
|
import java.lang.reflect.Field;
|
|
import java.util.List;
|
|
|
|
public class CsvExporter<T> implements Exporter<T> {
|
|
private static final String CSV_SEPARATOR = ",";
|
|
|
|
@Override
|
|
public void export(List<T> data, String filePath) {
|
|
if (data == null || data.isEmpty()) {
|
|
throw new IllegalArgumentException("数据不能为空");
|
|
}
|
|
|
|
try (PrintWriter writer = new PrintWriter(new FileWriter(filePath))) {
|
|
T firstItem = data.get(0);
|
|
writer.println(getHeader(firstItem.getClass()));
|
|
|
|
for (T item : data) {
|
|
writer.println(toCsvRow(item));
|
|
}
|
|
System.out.println("数据已导出到CSV文件: " + filePath);
|
|
} catch (Exception e) {
|
|
throw new RuntimeException("CSV导出失败: " + e.getMessage(), e);
|
|
}
|
|
}
|
|
|
|
private String getHeader(Class<?> clazz) {
|
|
StringBuilder header = new StringBuilder();
|
|
Field[] fields = clazz.getDeclaredFields();
|
|
for (int i = 0; i < fields.length; i++) {
|
|
if (i > 0) header.append(CSV_SEPARATOR);
|
|
header.append(fields[i].getName());
|
|
}
|
|
return header.toString();
|
|
}
|
|
|
|
private String toCsvRow(T item) {
|
|
StringBuilder row = new StringBuilder();
|
|
Field[] fields = item.getClass().getDeclaredFields();
|
|
try {
|
|
for (int i = 0; i < fields.length; i++) {
|
|
if (i > 0) row.append(CSV_SEPARATOR);
|
|
fields[i].setAccessible(true);
|
|
Object value = fields[i].get(item);
|
|
row.append(value != null ? value.toString() : "");
|
|
}
|
|
} catch (Exception e) {
|
|
throw new RuntimeException("CSV行转换失败: " + e.getMessage(), e);
|
|
}
|
|
return row.toString();
|
|
}
|
|
|
|
@Override
|
|
public String getFormat() {
|
|
return "CSV";
|
|
}
|
|
}
|