我使用OpenCSV库在Spring MVC中开发了csv下载功能,所需写入文件的数据由以下DTO类保存
public class CsvDataDto {
private String fileName;
List<String> header=new ArrayList<>();;
private String heading;
List<List<Object>> data=new ArrayList<>();
//getters and setters
}
我想要灵活和动态的功能,因此,我在控制器方法CsvDataDto
中初始化了downloadFile()
的数据
// Download Method snippet
if (type.equals("csv")) {
CsvDataDto dataDTO = new CsvDataDto();
dataDTO.setFileName("Table_Data");
dataDTO.getHeader().add("User Id");
dataDTO.getHeader().add("First Name");
dataDTO.getHeader().add("Last Name");
dataDTO.getHeader().add("Roll No");
dataDTO.getHeader().add("Email ID");
dataDTO.getHeader().add("Gender");
List<UserInfo> list = userInfoDao.findById(tableId);
for (UserInfo infoList : list) {
List<Object> newList = new ArrayList<>();
newList.add(infoList.getUserId());
newList.add(infoList.getFirstName());
newList.add(infoList.getLastName());
newList.add(infoList.getRollNo());
newList.add(infoList.getEmail());
newList.add(infoList.getGender());
dataDTO.getData().add(newList);
}
直到这里一切都很好,我卡住的那一刻是访问List<List<Object>>
中的元素,该元素将被添加到上面的代码段中,然后将其转换为List<String[]>
,因为{ write()
的{1}}方法采用CsvWriter
或String[]
作为参数。
将数据写入文件的最终代码段。
List<String[]>
上述逻辑需要改进,因为我下载的文件为空白。
当我调试List<String[]> records = new ArrayList<>();
String csvFileName = csvDataDto.getFileName();
CSVWriter writer = new CSVWriter(new FileWriter(csvFileName));
String[] headerArr = new String[csvDataDto.getHeader().size()];
headerArr = csvDataDto.getHeader().toArray(headerArr);
records.add(headerArr);
for (List<Object> objList : csvDataDto.getData()) {
System.out.println("object list:" + objList);
String[] fileData = new String[objList.size()];
fileData = objList.toArray(fileData);
records.add(fileData);
}
writer.writeAll(records);
writer.close();
时。我可以看到7个不同的List,但是当我想遍历该内部列表以访问数据时,由于类型List<List<Object>>
,JVM不允许我这样做。
Object
的情况
我知道List<List<Object>>
内有list<Object>
的集合,每个内部列表中存储的主要数据,我想获取我尝试过的每个列表,我在下面提到,但仍然不是成功
List
如果我这样做,那么我将无法获取for(List<Object> objList : csvDataDto.getData())
{
for(UserInfo info:(UserInfo)objList ){ // NOT ALLOWED CHANGE TYPE TO Object
}
}
,getId()
,getName()
之类的记录
getRollNo()
与 for(List<Object> objList : csvDataDto.getData())
{
for(Object obj:objList ){ // I didn't found any of my getter, just found all mthod of Object class itself
}
}
相似的情况
我需要在List<String> header
中添加String[]
,所以我有必要从List<String[]> records
获取所有元素,然后将其转换为String []并在{{ 1}}。我尝试过但是没有运气
List<String> header
预期的输出:
1.我的Csv文件具有标头,因此,我需要迭代records
标头,将数据添加到String[] headerArr = new String[csvDataDto.getHeader().size()];
headerArr = csvDataDto.getHeader().toArray(headerArr);
records.add(headerArr);
中,然后将其传递到List<String[]>
。
2。records.add()
内部的实际数据,我需要迭代其中的元素并将其转换为write()
并将数据添加到List<List<Object>>
中,然后将其传递给{ {1}}。
String[]
答案 0 :(得分:0)
我相信您可以通过对CsvDataDto进行一些更改来简化您的任务
您可以做这样的事情
public class CsvDataDto<T> {
private String fileName;
List<String> header=new ArrayList<>();
private String heading;
List<List<T>> data=new ArrayList<>();
//getters and setters
}
这种方法的好处是您不必处理可能导致错误的对象和转换。
例如,提到任何地方时,您都将不得不循环:
for(List<Object> objList : csvDataDto.getData())
{
for(Object obj:objList ){ // I didn't found any of my getter, just found all mthod of Object class itself
}
}
您将拥有
for(List<FooClass> objList : csvDataDto<FooClass>.getData())
{
for(FooClass obj:objList ){
... //here you can access the methods of FooClass,
}
}
更改DTO设计可简化您的任务。
FooClass代表您选择的类,因此可以是任何类,在您的情况下,可能是UserInfo
。
因此,当您第一步时:
// Download Method snippet
if (type.equals("csv")) {
CsvDataDto dataDTO = new CsvDataDto();
dataDTO.setFileName("Table_Data");
dataDTO.getHeader().add("User Id");
dataDTO.getHeader().add("First Name");
dataDTO.getHeader().add("Last Name");
dataDTO.getHeader().add("Roll No");
dataDTO.getHeader().add("Email ID");
dataDTO.getHeader().add("Gender");
List<UserInfo> list = userInfoDao.findById(tableId);
for (UserInfo infoList : list) {
List<Object> newList = new ArrayList<>();
newList.add(infoList.getUserId());
newList.add(infoList.getFirstName());
newList.add(infoList.getLastName());
newList.add(infoList.getRollNo());
newList.add(infoList.getEmail());
newList.add(infoList.getGender());
dataDTO.getData().add(newList);
}
您可以将List<Object>
替换为List<UserInfo>
,并将列表添加到CsvDataDTO<UserInfo>
中,而不会出现任何问题。
因此,稍后您可以按照我在示例中上面提到的方式进行检索