使用Apache POI导出数据时,印度(INR)和美国(美元)的货币格式不起作用

时间:2019-01-07 07:50:11

标签: java apache-poi

我正在使用Apache POI导出数据,并且数据同时显示印度和美国货币。但是在应用单独的DataFormats之后,我也将相同的格式(印度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,00,000.00          ₹1,00,000.00

3 个答案:

答案 0 :(得分:1)

Excel系统区域设置Change the Windows regional settings上确定如何在Windows中完成数字分组。实际上,没有通过数字格式进行设置的本机选项。因此,只要您的系统告诉Excel:“我们要使用Hindi(India)格式”,因此将数字分组设置为12,34,56,789,那么对于每个设置了数千个分隔符的数字来说都是如此。

唯一避免这种情况的可能性是将使用的系统区域设置设置为格式Hindi(India),并因此将数字分组 not 设置为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

答案 1 :(得分:0)

请尝试对货币格式进行以下修改

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

答案 2 :(得分:0)

最后发现Libreoffice Calc采用了区域语言格式(默认情况下,我使用印度语格式)..在MS excel中工作正常。