我正在使用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
答案 0 :(得分:1)
在Excel
系统区域设置Change the Windows regional settings上确定如何在Windows
中完成数字分组。实际上,没有通过数字格式进行设置的本机选项。因此,只要您的系统告诉Excel
:“我们要使用Hindi(India)格式”,因此将数字分组设置为12,34,56,789
,那么对于每个设置了数千个分隔符的数字来说都是如此。>
唯一避免这种情况的可能性是将使用的系统区域设置不设置为格式Hindi(India)
,并因此将数字分组 not 设置为12,34,56,789
。
或者使用伪造的数字格式作为[$$-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
:
如您所见,所有默认数字格式均使用系统的数字分组。但是我的假美元格式有效。
OpenOffice 3.2.1 Ubuntu 18.04.1 LTS中的结果。
答案 1 :(得分:0)
请尝试对货币格式进行以下修改
USformatStyle.setDataFormat(df.getFormat("$#,##0.00"));
INRformatStyle.setDataFormat(df.getFormat("₹#,##0.00"));
答案 2 :(得分:0)
最后发现Libreoffice Calc采用了区域语言格式(默认情况下,我使用印度语格式)..在MS excel中工作正常。