Apache Изменен формат пользовательских данных POI - PullRequest
0 голосов
/ 01 апреля 2020

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

Я хочу, чтобы мои валюты были отформатированы как € 1.000,43. Таким образом, знак евро слева, сумма справа с точкой в ​​качестве разделителя тысяч, запятая в качестве десятичного разделителя и два десятичных знака.

Если я делаю это в Excel и применяю это правило пользовательского форматирования, это работает: "_ [$€-nl-BE] * #.##0,00_ ;_ [$€-nl-BE] * -#.##0,00_ ;_ [$€-nl-BE] * \"-\"??_ ;_ @_ "

Итак, я просто скопировал это правило и применил его через Apache POI:

XSSFDataFormat dataFormat = (XSSFDataFormat) workbook.createDataFormat();
cellStyle.setDataFormat(dataFormat.getFormat("_ [$€-nl-BE] * #.##0,00_ ;_ [$€-nl-BE] * -#.##0,00_ ;_ [$€-nl-BE] * \"-\"??_ ;_ @_ "));

Однако это приводит к чему-то немного другому: € 1.000,4300. Вы можете видеть, что все идет хорошо, за исключением десятичных дробей. Есть 4 вместо 2 ... Когда я смотрю в Excel на пользовательское форматирование, оно также немного отличается (обратите внимание на 4 нуля): _ [$€-nl-BE] * #.##0,00000_ ;_ [$€-nl-BE] * -#.##0,00000_ ;_ [$€-nl-BE] * "-"?????_ ;_ @_

Так что мне интересно, что может быть не так, что где-то кто-то (либо Apache POI, либо Excel) поставил 4 десятичных знака вместо 2, которые я определил. Обратите внимание, что если я изменю его в Excel на 2 десятичных знака, он снова будет отображаться правильно. Даже после сохранения и закрытия и повторного открытия документа.

1 Ответ

2 голосов
/ 01 апреля 2020

Apache poi создает файл *.xlsx, поскольку Excel сохранит его. А в хранилище числовые форматы никогда не локализуются, а всегда в формате en_US. Только Excel GUI затем локализует числовой формат.

Так что для хранения ваш числовой формат должен быть

"_ [$€-nl-BE] * #,##0.00_ ;_ [$€-nl-BE] * -#,##0.00_ ;_ [$€-nl-BE] * \"-\"??_ ;_ @_ "

Обратите внимание, что десятичный разделитель равен ., а разделитель тысяч - , из-за en_US языкового стандарта.

Если открыть в локализованном Excel GUI, то это изменится на заданный языковой стандарт c десятичный разделитель и разделитель тысяч.

Но в Excel Сам по себе также не хранит языковые теги, такие как nl-BE в числовых форматах. Вместо этого он использует Windows идентификатор кода языка (LCID) . Это 813 для nl-BE. Так что лучше будет использовать [$€-813], что совпадает с [$€-nl-BE].

Следующее работает для меня и на моем немецком Excel:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;

class CreateExcelCustomNumberFormat {

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

  Workbook workbook = new XSSFWorkbook();
  DataFormat dataFormat = workbook.createDataFormat();
  CellStyle cellStyle = workbook.createCellStyle();
  cellStyle.setDataFormat(dataFormat.getFormat("_ [$€-813] * #,##0.00_ ;_ [$€-813] * -#,##0.00_ ;_ [$€-813] * \"-\"??_ ;_ @_ "));

  Cell cell = workbook.createSheet().createRow(0).createCell(0);
  cell.setCellValue(1000.43);
  cell.setCellStyle(cellStyle);

  FileOutputStream out = new FileOutputStream("Excel.xlsx");
  workbook.write(out);
  out.close();
  workbook.close();
 }
}

Этот код проверен используя текущие apache poi 4.1.2 и Excel 2016.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...