Сохранение файла в формате CSV в Java (apache poi) - PullRequest
0 голосов
/ 09 января 2020

Итак, я создал файл .xlsx, используя модель XSSF apache -poi со всеми необходимыми мне данными, но клиент хочет точно такие же данные с одинаковым форматированием (каждое значение в своей собственной ячейке) , только в файле .csv. Итак, мне нужен тот же файл с другим расширением файла ...

Я пытался просто изменить расширение файла с .xlsx на .csv, но при открытии я получаю предупреждение о том, что «формат и расширение файла не совпадают», но после нажатия «ОК» файл открывается без каких-либо ошибок или неправильных данных. Могу ли я каким-то образом сохранить модель XSSF в виде файла .csv без получения упомянутой ошибки?

Я также пытался использовать CSVPrinter из apache -commons, но он записывает все данные из одного строка в одну ячейку (я знаю, что .csv файлы должны выглядеть так, но клиент хочет то, что хочет клиент).

CSVPrinter часть кода:

    FileWriter out = new FileWriter("someFile.csv");
    CSVPrinter csvPrinter = new CSVPrinter(out, CSVFormat.EXCEL);

    if (workbook != null) {
        XSSFSheet sheet1 = workbook.getSheetAt(0);
        Iterator<Row> rowIterator = sheet1.rowIterator();
        while (rowIterator.hasNext()) {
            Row row1 = rowIterator.next();
            Iterator<Cell> cellIterator = row1.cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                csvPrinter.print(cell.getStringCellValue());
            }
            csvPrinter.println();
        }

    }
    csvPrinter.flush();
    csvPrinter.close();

Это вызывается после создания и записи данных в XSSFWorkbook.

Если мне нужно использовать CSVPrinter, чтобы завершить то, что мне нужно, есть ли способ сделать это, не создавая файл .xlsx сначала (просто запишите данные в нужном формате в файл .csv напрямую)?

1 Ответ

0 голосов
/ 10 января 2020

Я нашел решение своей проблемы.

Вместо использования CSVPrinter csvPrinter = new CSVPrinter(out, CSVFormat.EXCEL); Я изменил его на CSVPrinter csvPrinter = new CSVPrinter(out, CSVFormat.DEFAULT.withDelimiter(';'));

По какой-то причине (я был бы признателен, если кто-то может объясните мне), CSV-файл с запятой в качестве разделителя помещает все данные из одной строки в одну ячейку, но когда я ставлю точку с запятой в качестве разделителя, это работает так, как я хочу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...