Я попытался решить проблему, добавив 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();
}
}