当ADto中有sId字段,写一个共通方法,参数为List<ADto>、ADto.class、filePath,将List<ADto>出力到csv文件中,且sId只出力一次
时间: 2023-12-14 21:36:01 浏览: 70
可以使用Java中的CSVWriter类来实现将List<ADto>输出到CSV文件中,同时只输出sId字段一次的需求。
以下是可能的实现方法:
```java
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.opencsv.CSVWriter;
public class CsvUtils {
public static <T> void writeCsvFile(List<T> dataList, Class<T> clazz, String filePath) throws IOException {
File file = new File(filePath);
FileWriter outputfile = new FileWriter(file);
CSVWriter writer = new CSVWriter(outputfile);
// 获取 sId 字段名
Field sIdField = null;
try {
sIdField = clazz.getDeclaredField("sId");
} catch (NoSuchFieldException | SecurityException e) {
e.printStackTrace();
}
// 使用 Set 存储已经输出过的 sId 值
Set<Object> sIdSet = new HashSet<>();
// 输出表头
String[] header = clazz.getDeclaredFields().stream().map(Field::getName).toArray(String[]::new);
writer.writeNext(header);
// 输出每一行数据
for (T data : dataList) {
String[] row = new String[header.length];
for (int i = 0; i < header.length; i++) {
Field field = null;
try {
field = clazz.getDeclaredField(header[i]);
field.setAccessible(true);
Object value = field.get(data);
// 如果当前字段是 sId,且该值已经输出过,就将其设为 null
if (field.equals(sIdField) && !sIdSet.add(value)) {
value = null;
}
row[i] = value == null ? "" : value.toString();
} catch (NoSuchFieldException | SecurityException | IllegalAccessException e) {
e.printStackTrace();
}
}
writer.writeNext(row);
}
writer.close();
}
}
```
这个方法接收三个参数:
- dataList:要输出的数据列表
- clazz:数据类型的 Class 对象
- filePath:输出文件的路径
方法中首先使用反射获取 sId 字段名和所有表头,然后使用 Set 存储已经输出过的 sId 值。在输出每一行数据时,如果当前字段是 sId 且该值已经输出过,则将其设为 null。最后使用 CSVWriter 将数据输出到文件中。
为了使用上述方法,需要在 ADto 类中增加 sId 的 getter 方法,例如:
```java
public class ADto {
private int sId;
// 其他字段
public int getsId() {
return sId;
}
// 其他 getter 和 setter 方法
}
```
使用示例:
```java
List<ADto> dataList = new ArrayList<>();
// 添加数据到 dataList
String filePath = "path/to/output.csv";
CsvUtils.writeCsvFile(dataList, ADto.class, filePath);
```
这将会将 dataList 中的数据输出到 filePath 对应的文件中。
阅读全文