如何使用Apache POI(SXSSF)为特定单元格设置数据(数字)格式区域设置?
问题是非常具体的:使用Apache POI,我想创build单元格(完成),为其分配数字格式(完成),并设置格式的语言环境( 卡在这里 )。
代码如下所示:
SXSSFWorkbook workbook = new SXSSFWorkbook(100); Sheet sheet = workbook.createSheet(); Row row = sheet.createRow(1); Cell cell = row.createCell(0); CellStyle cellStyle = workbook.createCellStyle(); cellStyle.setDataFormat(8); //currency with thousands separator and two decimal places after period cell.setCellValue(123456.78); //??? how to set custom locale for the cell's number format?
我试图解决与自定义区域设置的问题是自定义千位分隔符字符(法国的非rest空间对我来说是好的)。
XLSX工作簿允许这样的自定义(更新:我的意思是设置格式区域设置每个单元格),这是可以实现与MS Office和OpenOffice。 我想在代码中做同样的事情。
(Apache POI 3.12)
在用于货币数字格式的Offixe OpenXML( *.xlsx
)中,只能将货币符号本地化,而不能使用小数点分隔符。 小数点分隔符来自运行Excel的Windows系统的Windows系统区域设置。 千位分隔符还默认为运行Excel的Windows系统的Windows系统区域设置。
在Excel中,这看起来像:
如您所见,只有货币符号可以被本地化。
至less可以使用格式string来设置数千个分隔符。 所以格式string可以
"#\\ ###\\ ##0.00\\ [$€-40C];[RED]\\-#\\ ###\\ ##0.00\\ [$€-40C]"
。
这是具有本地化法国欧元货币符号和空间作为数千分隔符的货币数字格式。 因为我们伪造了千位分隔符,所以我们必须在格式string中根据需要提供尽可能多的数字。
小数点分隔符是默认值,这意味着它来自运行Excel的Windows系统的Windows系统区域设置。 所以点.
在格式string中并不意味着总是使用小数点作为十进制分隔符,而是使用来自运行Excel的Windows系统的Windows系统语言环境设置的十进制分隔符。 如果我们已经使用了逗号作为格式string中的千位分隔符,那么这也将使用来自运行Excel的Windows系统的Windows系统语言环境设置的千位分隔符。 然后,我们不需要在格式string中input太多的数字,因为那么千位分隔符设置会重复每千位数字。 所以
"#,##0.00\\ [$€-40C];[RED]\\-#,##0.00\\ [$€-40C]"
就足够了。
例:
import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.streaming.SXSSFWorkbook; import org.apache.poi.xssf.streaming.SXSSFSheet; public class CreateExcelNumberFormat { public static void main(String[] args) throws Exception { SXSSFWorkbook workbook = new SXSSFWorkbook(100); DataFormat dataformat = workbook.createDataFormat(); CellStyle cellStyleCurrency = workbook.createCellStyle(); cellStyleCurrency.setDataFormat(dataformat.getFormat("#\\ ###\\ ##0.00\\ [$€-40C];[RED]\\-#\\ ###\\ ##0.00\\ [$€-40C]")); Sheet sheet = workbook.createSheet(); Row row = sheet.createRow(1); Cell cell = row.createCell(0); cell.setCellValue(123456.78); cell.setCellStyle(cellStyleCurrency); ((SXSSFSheet)sheet).trackColumnForAutoSizing(0); sheet.autoSizeColumn(0); workbook.write(new FileOutputStream("CreateExcelNumberFormat.xlsx")); workbook.close(); workbook.dispose(); } }
但这与Libreoffice OpenDocument Spreadsheet格式中可用的本地化货币格式不同。 这看起来像:
正如你在这里看到的,货币符号和整个格式的语言都可以被本地化。
但是,Office OpenXML( *.xlsx
)不能存储本地化的货币数字格式。 OpenDocument Spreadsheet( *.ods
)是OpenOffice / LibreOffice的原生格式,可以保存本地化的货币数量格式,但是如果Excel打开这样的文件,本地化将会丢失。
OpenOffice / Libreoffice的“Language”combobox的设置不能存储在*.xlsx
,也不能存储在OpenOffice / Libreoffice中。 在OpenOffice / Libreoffice中设置别的默认值,将文件保存为*.xlsx
,closuresOpenOffice / Libreoffice,再次在OpenOffice / Libreoffice中打开存储的*.xlsx
文件。 你会看到“语言”被重置为默认值。