Apache POI: немецкий формат ячейки в ячейке со сцепленной строкой - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть файл Excel- (xlsx-) с двумя ячейками:

  • А1 - это число со значением "5,3"
  • B1 - формула = "Число:" & A1

Когда я открываю этот Excel-файл в немецком LibreOffice или Excel, тогда оба показывают мне содержимое ячейки через запятую:

  • A1: 5,3
  • B1: номер: 5,3

Когда я читаю содержимое с помощью Apache POI (версия 3.17; new DataFormatter(Locale.GERMAN).formatCellValue(cell, formulaEvaluator)), числовая ячейка A1 правильно форматируется как «5,3», но объединенная ячейка B1 неожиданно форматируется с точкой в ​​качестве разделителя.

Вот мой пример кода:

import java.io.File;
import java.util.Locale;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class MiniPoiTest {

  public static void main(String[] args) throws Exception {
    // doesn't change anything
    // LocaleUtil.setUserLocale(Locale.GERMAN);

    // read workbook
    File xlsxFile = new File("string-concat.xlsx");
    Workbook workbook = WorkbookFactory.create(xlsxFile);
    FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
    formulaEvaluator.clearAllCachedResultValues();
    Sheet sheet = workbook.getSheetAt(0);

    // read two cells
    Row row = sheet.getRow(0);
    Cell numericCell = row.getCell(0);
    Cell concatenatedCell = row.getCell(1);

    // print numeric cell
    String numericCellValue = new DataFormatter(Locale.GERMAN).formatCellValue(numericCell,
            formulaEvaluator);
    System.out.println("Value in " + numericCell.getAddress().formatAsString()
            + " (numeric cell): '" + numericCellValue + "'");

    // print concatenated cell
    String concatenatedCellValue = new DataFormatter(Locale.GERMAN)
            .formatCellValue(concatenatedCell, formulaEvaluator);
    System.out.println("Value in " + concatenatedCell.getAddress().formatAsString()
            + " (concatenated cell): '" + concatenatedCellValue + "'");
    System.out.println("Formula in " + concatenatedCell.getAddress().formatAsString()
            + " (concatenated cell): '" + concatenatedCell.getCellFormula() + "'");
  }

}

Результат при выполнении примера кода:

Value in A1 (numeric cell): '5,3'
Value in B1 (concatenated cell): 'Number: 5.3'
Formula in B1 (concatenated cell): '"Number: "&A1'

Есть ли какая-нибудь хитрость, чтобы получить составное содержимое B1, также отформатированное с немецким цифровым разделителем ("Number: 5,3")?

...