Я пишу простую программу, которая должна переводить страницу Excel с иврита на английский.
для этого код считывает содержимое каждой ячейки и сравнивает его с картой, которая получает информацию из простого CSV-файла.
Запустив программу из IntelliJ, программа ведет себя отлично и делает то, что должна, однако компилируя ее в банку, программа этого не делает.
//Code for loading the csv contents to a map
private static Map<String,String> getLocalization(String pathToJar) {
String path = null;
path = pathToJar + "localization.csv";
String line = "";
HashMap<String, String> list = new HashMap<>();
try {
BufferedReader br = new BufferedReader(new FileReader(path));
while ((line = br.readLine()) != null) {
// use comma as separator
String[] array = line.split(",");
list.put(array[0], array[1]);
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
//Code for loading an Excel file and translating it
private static boolean updateExcel(Map<String,String> translation, String filepath, String pathToJar) {
String path = pathToJar + "temp\\week.xlsx";
//Read Excel document first
FileInputStream input_document = null;
XSSFWorkbook my_xlsx_workbook = null;
try {
input_document = new FileInputStream(new File(path));
// convert it into a POI object
my_xlsx_workbook = new XSSFWorkbook(input_document);
} catch (IOException e) {
e.printStackTrace();
}
// Read excel sheet that needs to be updated
XSSFSheet my_worksheet = null;
if (my_xlsx_workbook != null) {
my_worksheet = my_xlsx_workbook.getSheetAt(0);
}
for (Row cells : my_worksheet) {
String name = "";
String shortCode = "";
//Get the row object
Row row = cells;
//Every row has columns, get the column iterator and iterate over them
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
//Get the Cell object
Cell cell = cellIterator.next();
//check the cell type and process accordingly
switch (cell.getCellType()) {
case STRING:
for (Map.Entry<String, String> entry : translation.entrySet()) {
if (cell.getStringCellValue().contains(entry.getKey())) {
cell.setCellValue(entry.getValue());
}
}
break;
}
}
}
my_worksheet.autoSizeColumn(1);
FileOutputStream outFile = null;
try {
if (input_document != null) {
input_document.close();
}
File finishedFile = new File(path);
outFile = new FileOutputStream(finishedFile);
my_xlsx_workbook.write(outFile);
outFile.close();
finishedFile.renameTo(new File(filepath));
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
CSV-файл выглядит примерно так:
иврит_слово, английское_слово
иврит_слово, английское_слово
иврит_слово, английское_слово
...
Несколько вещей, которые я проверил:
1. Карта читается из файла (пробовал кодировать в UTF-8)
2. В настройках IntelliJ установлено значение UTF-8
Я считаю, что это проблема кодировки, вывод ключей карты в ячейки Excel показывает набор специальных символов вместо слов.
Если есть какая-либо другая необходимая информация, пожалуйста, сообщите мне, и спасибо заранее.




FileReader — это старый служебный класс, который использует кодировку платформы по умолчанию. Запустив IntelliJ, вы сказали, что для него установлено значение UTF-8, как и кодировка файла. Вне IntelliJ это зависит от машины. Windows до сих пор не использует UTF-8.
Это можно сделать с помощью Files.lines начиная с Java 8:
try {
Path p = Paths.get(path);
Files.lines(p)
.map(line ->line.split(",\\s*"))
.filter(array -> array.length >= 2)
.forEach(array -> list.put(array[0], array[1]));
} catch (IOException e) {
e.printStackTrace();
}
Files.lines также можно передать кодировку, но новым значением по умолчанию является UTF-8.