访问嵌套的List元素并转换为List <string []>

时间:2018-12-11 09:46:47

标签: list csv spring-mvc export-to-csv opencsv

我使用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}}方法采用CsvWriterString[]作为参数。

将数据写入文件的最终代码段。

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[]

1 个答案:

答案 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>中,而不会出现任何问题。 因此,稍后您可以按照我在示例中上面提到的方式进行检索