Записать файл с SuperCsv, сохраняя ведущие нули при открытии в Excel

Мне было интересно, есть ли способ сохранить начальный 0 при использовании SuperCsv.

Моя проблема в том, что у меня есть несколько столбцов с числами с начальным 0. Я хочу сохранить 0, но excel продолжает его удалять, я также пытался добавить несколько символов в начало числа, например «=», но нет хорошего результата.

Excel отображает первый символ, который я добавил в начале числа, поэтому значение столбца выглядит как =0222333111 , и это потому, что, вероятно, supercsv заключает вывод в кавычки.

Я ничего не нашел на веб-сайте superCsv, и я думаю, что я не единственный, у кого есть эта проблема. Должен ли я перенести на библиотеку Excel Java или есть обходной путь?


person StefanAlexandru    schedule 11.07.2013    source источник


Ответы (2)


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

Даже если есть некоторые обходные пути, такие как добавление всевозможных невидимых символов Unicode, это всего лишь хак, который не гарантирует работу с другими версиями Excel.

Таким образом, CSV не подходит для ваших требований. Либо переключитесь на другой формат файла, либо настройте Excel для обработки всех ячеек как строк, а не чисел (я не знаю, как и возможно ли последнее).

person Oswald    schedule 11.07.2013

В supercsv вы можете использовать пользовательский процессор ячеек ниже, он добавит = в значение вашей ячейки

public class PreserveLeadingZeroes extends CellProcessorAdaptor {

    private static final Logger LOG = LoggerFactory.getLogger(PreserveLeadingZeroes.class);

    public PreserveLeadingZeroes() {
        super();
    }

    public PreserveLeadingZeroes(CellProcessor next) {
        super(next);
    }

    public Object execute(Object value, CsvContext context) {

        if (value == null) {
            // LOG.debug("null customer code");
            final String result = "";
            return next.execute(result, context);
        }
        // LOG.debug("parse customer code : " + value.toString());
        final String result = "=\"" + value.toString() + "\"";
        return next.execute(result, context);
    }
} 
person fearaus    schedule 06.08.2019