Способ группировки цифр в Excel
определяется в региональных настройках системы Windows
: Изменение региональных настроек Windows . На самом деле нет родной опции, чтобы установить это через числовой формат. Итак, пока ваша система говорит Excel
: «Мы хотим использовать формат хинди (Индия)», и поэтому группировка цифр установлена на 12,34,56,789
, то это будет так для каждого числа с установленным разделителем тысяч.
Единственная возможность избежать этого - установить региональные настройки используемой системы , а не в формат Hindi(India)
и, таким образом, установить группировку цифр , а не в 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.