Как прочитать 2 столбца из файла Excel (xlsx) и записать его в свойства ресурса как пара ключ = значение - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь сгенерировать файл messages_ [en / da / bg] .properties из заданного набора для файлов excel (xlsx).Каждый лист Excel снабжен двумя столбцами в виде пары ключ-значение.Я должен прочитать каждый файл и записать его для создания файла messages_en.properties для i18n.

Если у меня есть листы Excel с именами файлов, такими как locales_ENG.xlsx, locales_DAN.xlsx & locales_BGR.xlsx, тогда он должен генерировать файлы как:messages_en.properties messages_da.properties messages_bg.properties

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Я попытался решить проблему, добавив Apache POI в качестве зависимости для чтения файла Excel.

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>

и для записи пары ключ-значение я использовал класс свойств java.

public class App {

LinkedHashMap<String, String> map = new LinkedHashMap<>();

public static void main(String[] args) throws IOException {

    final App app = new App();

    for (final Locale locale : Locale.values()) {

        app.readExcelFile("locales_" + locale + ".xlsx");

        app.writeToPropertiesFile("messages_" + locale.name().substring(0, 2).toLowerCase() + ".properties");

    }

}

public void writeToPropertiesFile(String propertiesPath) throws IOException {

    final LinkedProperties props = new LinkedProperties();

    map.entrySet().forEach(entry -> props.setProperty(entry.getKey(), entry.getValue()));

    props.store(new FileOutputStream(new File(propertiesPath)), null);

}

public void readExcelFile(String fileName) throws IOException {

    Workbook workbook = null;

    XSSFCell cell1 = null;

    XSSFCell cell2 = null;

    try {

        workbook = WorkbookFactory.create(new File(fileName));

        final XSSFSheet sheet = (XSSFSheet) workbook.getSheetAt(0);

        final Iterator<Row> rowIterator = sheet.rowIterator();

        // skip first row which is header
        rowIterator.next();

        while (rowIterator.hasNext()) {

            final XSSFRow row = (XSSFRow) rowIterator.next();

            final Iterator<Cell> cellIterator = row.cellIterator();

            while (cellIterator.hasNext()) {

                cell1 = (XSSFCell) cellIterator.next();

                final String key = cell1.getRichStringCellValue().toString();

                if (key == "")
                    break;

                cell2 = (XSSFCell) cellIterator.next();

                final String value = cell2.getRichStringCellValue().toString();

                map.put(key, value);

            }
        }
    }

    catch (final Exception e) {

    } finally {

        if (workbook != null)

            workbook.close();
    }
}

}

Чтобы поддерживать порядок значения ключа в файле свойств, я создал класс пользовательских свойств, то есть LinkedProperties, который расширяет класс Properties.

public class LinkedProperties extends Properties {
/**
 *
 */
private static final long serialVersionUID = 1L;

private final HashSet<Object> keys = new LinkedHashSet<>();

public LinkedProperties() {
    // Nothing is done here
}

public Iterable<Object> orderedKeys() {
    return Collections.list(keys());
}

@Override
public Enumeration<Object> keys() {
    return Collections.<Object>enumeration(keys);
}

@Override
public Object put(Object key, Object value) {
    keys.add(key);
    return super.put(key, value);
}

@Override
public synchronized boolean equals(Object o) {
    return super.equals(o);
}

@Override
public synchronized int hashCode() {
    return super.hashCode();
}

}

0 голосов
/ 11 февраля 2019

Я бы предложил экспортировать листы Excel как CSV (символьно-разделенное значение), а затем использовать обычный текстовый редактор и регулярное выражение для поиска и замены в заданном формате.Это ручное усилие, но оно выполняется быстро.

Если вы предпочитаете писать код, вы можете использовать Apache POI (https://poi.apache.org/)to читать файлы Excel.

Хороший пример опубликован в этомстатья: https://www.mkyong.com/java/apache-poi-reading-and-writing-excel-file-in-java/

...