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

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";
}
}