Запись в csv / excel на основе заголовка в Java - PullRequest
0 голосов
/ 16 января 2020

У меня есть JSON, в котором есть записи, которые выглядят как

[{"key": {"keyLabel": "Label1"}, "specs": [{"specKey": "spec1", "specValue": ["s11"]}, {"specKey": "spec2", "specValue": ["s12"]}]},

{"key": {" keyLabel ":" Label2 "}," specs ": [{" specKey ":" spec1 "," specValue ": [" s21 "]}, {" specKey ":" spec3 "," specValue ": [" s22 " ]}]}]

Spe c Ключи представляют изменения на основе значения KeyLabel. Как вы можете видеть выше, если KeyLabel = Label1, spec1 и spec2 присутствуют. Если KeyLabel = Label2, spec1 и spec3 присутствуют

Я хочу создать CSV / Excel, используя это так, чтобы заголовок / верхняя строка как следующие столбцы

KeyLabel, spec1, spec2, spec3 (в основном объединение всех specKeys)

Label1, s11, s12

Label2, s21,, s22

Итак, сложная часть заключается в том, что в то время о записи в файл, мне нужно написать в соответствующей колонке.

Любые мысли о том, есть ли какие-либо библиотеки CSV / Excel, которые облегчают это. Наивный способ действительно выглядит очень элегантно - хранить упорядоченный список заголовков и основ c на запятой и значениях записи ключа, чтобы значения находились в столбце записи

1 Ответ

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

Я думаю, вам не нужна указанная c библиотека для этого. Вам нужна только некоторая общая библиотека jackson poi-ooxml

  1. Сначала вы должны прочитать json строку в объект POJO (ref: http://www.jsonschema2pojo.org/)

    Список примеров = new ObjectMapper (). ReadValue (json, new TypeReference> () {});

  2. Секунды, собирать заголовок

    Заголовок списка = примеры .stream () .map (Example :: getSpecs) .flatMap (Collection :: stream) .map (Spe c :: getSpecKey) .distinct () .collect (Collectors.toList ()); header.add (0, «Ключ»);

  3. Далее используйте библиотеку POI для записи в файл Excel

окончательная рабочая книга XSSFWorkbook = новая XSSFWorkbook ( ); окончательный лист XSSFSheet = workbook.createSheet (WorkbookUtil.createSafeSheetName ("имя листа"));

    // Headers
    Row row = sheet.createRow(0);
    for (int index = 0; index < headers.size(); index++) {
        row.createCell(index).setCellValue(headers.get(index));
    }

    // Content
    int startRow = 1;
    for (Example object : objects) {
        row = sheet.createRow(startRow++);
        // key label

        row.createCell(0).setCellValue(object.getKey().getKeyLabel());
        // spec
        for (int index = 1; index < headers.size(); index++) {
            String speckey = headers.get(index);
            String value = object.getSpecs().stream().filter(e -> e.getSpecKey().equals(speckey)).findAny().map(Spec::getSpecValue).orElse(Collections.emptyList()).toString();
            row.createCell(index).setCellValue(value);
        }
    }

    FileOutputStream fileOut = new FileOutputStream("D:\\poi-generated-file.xlsx");
    try {
        workbook.write(fileOut);
    } finally {
        fileOut.close();
        workbook.close();
    }

Это только пример кода. Вы должны изменить и обновить к лучшему.

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