当ADto中有次位为大写字母的字段,写一个共通方法,参数为List<ADto>、ADto.class、filePath,将List<ADto>出力到csv文件中,且次位为大写字母的字段只出力一次
时间: 2023-12-14 14:37:54 浏览: 174
可以使用反射来实现这个共通方法。具体实现如下:
```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;
public class CsvUtils {
public static <T> void writeToCsv(List<T> dataList, Class<T> clazz, String filePath) throws IOException {
File file = new File(filePath);
FileWriter writer = new FileWriter(file);
// 获取所有字段
Field[] fields = clazz.getDeclaredFields();
// 存储次位为大写字母的字段名称
Set<String> uniqueFields = new HashSet<>();
// 写入表头
for (Field field : fields) {
String fieldName = field.getName();
if (Character.isUpperCase(fieldName.charAt(1))) {
// 如果次位为大写字母,则只写入一次
if (!uniqueFields.contains(fieldName)) {
uniqueFields.add(fieldName);
writer.append(fieldName).append(",");
}
} else {
writer.append(fieldName).append(",");
}
}
writer.append("\n");
// 写入数据
for (T data : dataList) {
for (Field field : fields) {
field.setAccessible(true);
Object fieldValue = null;
try {
fieldValue = field.get(data);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
writer.append(String.valueOf(fieldValue)).append(",");
}
writer.append("\n");
}
writer.flush();
writer.close();
}
}
```
使用示例:
```java
List<ADto> dataList = ...;
CsvUtils.writeToCsv(dataList, ADto.class, "output.csv");
```
注意:上述代码并没有考虑字段中可能存在逗号和换行符的情况,如果需要处理这些情况,可以使用第三方CSV库,比如OpenCSV。
阅读全文