Создан пустой CSV-файл, необходимо записать данные, хранящиеся в списке - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужно создать и загрузить файл CSV, и для этого я использую OpenCSV с Spring MVC, данные, которые нужно записать, содержат имя моего класса CsvDataDto.

public class CsvDataDto {

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

}

Основные данные содержат заголовок файла (например, идентификатор пользователя, имя, фамилия, имя пользователя) и фактические данные (например, 1,101, Джон, Доу, 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 in 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 голосов
/ 10 декабря 2018
@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();
    }
}
...