Локализация таблиц POI - PullRequest
0 голосов
/ 24 июня 2019

Используя Apache POI OOXML и режим XSSF, создавая новую книгу, как установить язык электронной таблицы (т. Е. Английский (США))?Я ничего не могу найти на этом.Параметр не обязательно должен быть специфичным для ячейки и должен применяться ко всем листам.Я использую POI версии 4.1.0.

1 Ответ

1 голос
/ 26 июня 2019

Хранение данных листов в Excel файлах не локализовано. Хранение данных листов всегда выполняется на английском языке США с точки зрения имен функций, разделителей списков и десятичных разделителей, а также тысяч разделителей. Только приложения Excel локализованы. Excel GUI считывает данные из файла и затем переводит имена функций, разделители списков и десятичные и тысячи разделителей.

Давайте рассмотрим пример:

import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.util.GregorianCalendar;

class CreateExcel {

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

  try (Workbook workbook = new XSSFWorkbook(); 
       FileOutputStream fileout = new FileOutputStream("Excel.xlsx") ) {

   Object[][] data = new Object[][] {
    new Object[] {"Value", "Date", "Formatted value", "Formula"},
    new Object[] {123.456789, new GregorianCalendar(2019, 0, 15), 123.456789, "ROUND(A2,2)"},
    new Object[] {1234.56789, new GregorianCalendar(2019, 5, 15), 1234.56789, "ROUND(A3,2)"}
   };

   DataFormat dataFormat = workbook.createDataFormat();
   CellStyle dateStyle = workbook.createCellStyle();
   dateStyle.setDataFormat(dataFormat.getFormat("DDDD, MMMM, DD, YYYY"));
   CellStyle numberStyle = workbook.createCellStyle();
   numberStyle.setDataFormat(dataFormat.getFormat("#,##0.00 \" Coins\""));

   Sheet sheet = workbook.createSheet(); 

   for (int r = 0; r < data.length; r++) {
    Row row = sheet.createRow(r);
    for (int c = 0; c < data[0].length; c++) {
     Cell cell = row.createCell(c);

     if (r == 0) cell.setCellValue((String)data[r][c]);
     if (r > 0 && c == 0) {
      cell.setCellValue((Double)data[r][c]);
     } else if (r > 0 && c == 1) {
      cell.setCellValue((GregorianCalendar)data[r][c]);
      cell.setCellStyle(dateStyle);
     } else if (r > 0 && c == 2) {
      cell.setCellValue((Double)data[r][c]);
      cell.setCellStyle(numberStyle);
     } else if (r > 0 && c == 3) {
      cell.setCellFormula((String)data[r][c]);
     }
    }
   }

   for (int c = 0; c < data[0].length; c++) {
    sheet.autoSizeColumn(c);
   }

   workbook.write(fileout);
  }

 }
}

Как видите, в коде ничего не локализовано. Все это en_US. Имя функции в формуле ROUND, разделитель между параметрами функции - запятая, то же самое - разделитель списка, а десятичный разделитель в двойных значениях - точка. Также коды числового формата: en_US.

Содержимое, хранящееся в файле Excel.xlsx, никоим образом не локализовано.

Но если я открываю Excel.xlsx в моем немецком Excel, то это выглядит так:

enter image description here

Обратите внимание на формулу =RUNDEN(A3;2). Имя функции переводится на немецкий язык, разделитель между параметрами функции - точка с запятой, то же самое будет разделитель списка, а десятичный разделитель в двойных значениях - запятая, разделитель тысяч - точка.

Также коды числовых форматов теперь немецкие:

enter image description here

Почему это? В основном потому, что это немецкое приложение Excel. Но также из-за региональных настроек Windows, которые определяют форматы даты

enter image description here

... и десятичный разделитель, разделитель списка и разделитель тысяч.

enter image description here

...