Формат валюты для индийских (INR) и американских (доллар) при экспорте данных с использованием Apache POI не работает - PullRequest
0 голосов
/ 07 января 2019

Я экспортирую данные, используя Apache POI, и данные должны отображаться как в индийской, так и в американской валюте ... но после применения отдельных форматов данных я получаю одинаковый формат (индийский INR), примененный ко всем данным.

public static void main(String[] args) {
    try {
        System.out.println("*******Export Excel*********");

        File myFile = new File("MyFirstExcel.xls");
        FileOutputStream out = new FileOutputStream(myFile);
        XSSFWorkbook xssfworkbook = new XSSFWorkbook();
        XSSFSheet sheet = xssfworkbook.createSheet("new sheet");

        XSSFCellStyle INRformatStyle = xssfworkbook.createCellStyle();
        XSSFCellStyle USformatStyle = xssfworkbook.createCellStyle();

        XSSFDataFormat df = xssfworkbook.createDataFormat();

        USformatStyle.setDataFormat(df.getFormat("[$$-409]#,##0.00;"));
        INRformatStyle.setDataFormat(df.getFormat("₹#,##0.00;"));

        sheet.setColumnWidth(0, 7000);

        XSSFRow row = sheet.createRow((short) 0);
        XSSFCell cell = row.createCell((short) 0);
        cell.setCellValue(100000.0);
        cell.setCellStyle(USformatStyle);

        XSSFRow row1 = sheet.createRow((short) 1);
        XSSFCell cell1 = row1.createCell((short) 0);
        cell1.setCellValue(100000.0);
        cell1.setCellStyle(INRformatStyle);

        xssfworkbook.write(out);
        out.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

}

Ожидаемое $ 100 000,00 ₹ 1,00,000.00

Фактическая $ 1 000 000,00 ₹ 1,00,000.00

Ответы [ 3 ]

0 голосов
/ 07 января 2019

Способ группировки цифр в Excel определяется в региональных настройках системы Windows: Изменение региональных настроек Windows . На самом деле нет родной опции, чтобы установить это через числовой формат. Итак, пока ваша система говорит Excel: «Мы хотим использовать формат хинди (Индия)», и поэтому группировка цифр установлена ​​на 12,34,56,789, то это будет так для каждого числа с установленным разделителем тысяч.

Единственная возможность избежать этого - установить региональные настройки используемой системы , а не в формат Hindi(India) и, таким образом, установить группировку цифр , а не в 12,34,56,789.

enter image description here

Или использовать тип поддельного числа как [$$-409]#\,###\,##0.00.

...
USformatStyle.setDataFormat(df.getFormat("[$$-409]#\\,###\\,##0.00"));
...

Это не использование запятой в качестве разделителя тысяч, а , в качестве текста в потоке цифр. Таким образом, группировка цифр системы обойдена.

Полный пример:

import java.io.FileOutputStream;

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

class CreateExcelDigitGroupings {

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

  Workbook workbook = new XSSFWorkbook();
  DataFormat dataformat = workbook.createDataFormat();
  CellStyle defaultCurrency = workbook.createCellStyle();
  defaultCurrency.setDataFormat((short)8); //see https://poi.apache.org/apidocs/dev/org/apache/poi/ss/usermodel/BuiltinFormats.html
  CellStyle defaultUSDCurrency = workbook.createCellStyle();
  defaultUSDCurrency.setDataFormat(dataformat.getFormat("[$$-409]#,##0.00"));
  CellStyle fakeHindiCurrency = workbook.createCellStyle();
  fakeHindiCurrency.setDataFormat(dataformat.getFormat("₹#\\,##\\,##\\,##0.00"));
  CellStyle fakeUSDCurrency = workbook.createCellStyle();
  fakeUSDCurrency.setDataFormat(dataformat.getFormat("$#\\,###\\,##0.00"));

  Sheet sheet = workbook.createSheet("Sheet1");

  double value = 12345678.9;
  Cell cell;
  int r = 0;
  sheet.createRow(r).createCell(0).setCellValue("defaultCurrency");
  cell = sheet.getRow(r++).createCell(1);
  cell.setCellValue(value);
  cell.setCellStyle(defaultCurrency);

  sheet.createRow(r).createCell(0).setCellValue("defaultUSDCurrency");
  cell = sheet.getRow(r++).createCell(1);
  cell.setCellValue(value);
  cell.setCellStyle(defaultUSDCurrency);

  sheet.createRow(r).createCell(0).setCellValue("fakeHindiCurrency");
  cell = sheet.getRow(r++).createCell(1);
  cell.setCellValue(value);
  cell.setCellStyle(fakeHindiCurrency);

  sheet.createRow(r).createCell(0).setCellValue("fakeUSDCurrency");
  cell = sheet.getRow(r++).createCell(1);
  cell.setCellValue(value);
  cell.setCellStyle(fakeUSDCurrency);

  sheet.autoSizeColumn(0);
  sheet.autoSizeColumn(1);

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

 }
}

Результат в Excel с форматом Hindi(India), установленным в Windows regional settings, и поэтому группировка цифр по умолчанию установлена ​​на 12,34,56,789:

enter image description here

Как вы видите для всех числовых форматов по умолчанию, используется системная группировка цифр. Но мой поддельный формат в долларах США работает.

Результат в OpenOffice 3.2.1 Ubuntu 18.04.1 LTS.

enter image description here

0 голосов
/ 05 августа 2019

Наконец-то обнаружил, что Libreoffice Calc принимает форматирование на региональном языке (по умолчанию я получаю форматирование на индийском языке) .. отлично работает в MS Excel.

0 голосов
/ 07 января 2019

Пожалуйста, попробуйте следующие модификации форматов валют

  USformatStyle.setDataFormat(df.getFormat("$#,##0.00"));
  INRformatStyle.setDataFormat(df.getFormat("₹#,##0.00"));
...