生成空白CSV文件,需要写入存储在List <list <object>

时间:2018-12-10 15:35:33

标签: spring-mvc opencsv

我需要创建并下载CSV文件,为此,我将OpenCSVSpring MVC结合使用,需要写入的数据由我的类名CsvDataDto保存。 / p>

public class CsvDataDto {

    private String fileName;
    List<String> header=new ArrayList<>();;
    private String heading;
    List<List<Object>> data=new ArrayList<>();
//getters and setters

}

主数据包含文件头(例如:userid,fname,lastname,rollno)和实际数据(例如1,101,john,doe,1001)。 文件头由List<String> header保留 并且文件数据由List<List<Object>> data

保存

这是设置所有必需数据的控制器方法

@RequestMapping(value = "/export_data")
    public void downloadDataInCsv(
            @RequestParam("type") String type,
            @RequestParam("tID") String tableId,
            HttpServletRequest request,
            HttpServletResponse response) throws IOException {
        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);

            }
            ExportCsvUtil.downloadCsv(request, response, dataDTO);

        }

现在downloadCsv()实现

      public static void downloadCsv(HttpServletRequest request, HttpServletResponse response, CsvDataDto csvDataDto) throws IOException {
        List<String[]> records = new ArrayList<>();
        String csvFileName = csvDataDto.getFileName();

        String headerKey = "Content-Disposition";
        String headerValue = String.format("attachment; filename=" + csvDataDto.getFileName() + ".csv");
        response.setContentType("text/csv");
        response.setHeader(headerKey, headerValue);

        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();

        System.out.println(writer);
    }
}

我被困在这里,因为我探索了很多示例,其中讲师简单地通过data方法中的writeNext()

 writer.writeNext(csvDataDto);

但是我知道它不会按预期工作。文件已成功下载但为空白,没有任何数据可写。

我想以这种方式实现逻辑,所以我得到下面的CSV

userid, fname,lastname,rollno,gender (List<String> header)

1     , john,   doe   ,1001,   M      (List<List<Object>> data)
2     , Rose,   Mary  ,1002,   F
3     , Jack,   Jill  ,1003,   M

使用writeNext()来达到相同目的的最佳方法是什么。

1 个答案:

答案 0 :(得分:0)

@RequestMapping(value = "/export_data")
public void downloadDataInCsv(
        @RequestParam("type") String type,
        @RequestParam("tID") String tableId,
        HttpServletRequest request,
        HttpServletResponse response) throws IOException {
    if (type.equals("csv")) {
        List<UserInfo> list = userInfoDao.findById(tableId);
        ExportCsvUtil.downloadCsv(request, response, list);
    }
}

private void downloadCsv(HttpServletRequest request, HttpServletResponse response, List<UserInfo> list) throws IOException {
    String headerKey = "Content-Disposition";
    String headerValue = String.format("attachment; filename=Table_Data.csv");
    response.setContentType("text/csv");
    response.setHeader(headerKey, headerValue);

    try (final CSVWriter writer = new CSVWriter(response.getWriter(), ",")) {

        writer.writeNext(new String[]{"User Id", "First Name", "Last Name", "Roll No", "Email ID", "Gender"});

        for (UserInfo entry: list) {
            // cast/convert to String where needed
            writer.writeNext(new String[]{entry.getUserId()+"", entry.getFirstName(), entry.getLastName(),entry.getRollNo(),entry.getEmail(),entry.getGender()});
        }
        writer.close();
    }
}