gpt4 book ai didi

java - 如何使用 Apache POI (SXSSF) 设置特定单元格的数据(数字)格式区域设置?

转载 作者:行者123 更新时间:2023-12-02 02:36:58 26 4
gpt4 key购买 nike

问题非常具体:使用 Apache POI,我想创建单元格(完成),为其分配数字格式(完成),并设置格式的区域设置(卡在这里)。

代码如下所示:

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?

我试图用自定义区域设置解决的问题是自定义千位分隔符(法语的不间断空格对我来说没问题)。

XLSX 工作簿允许此类自定义(更新:我的意思是设置每个单元格的格式区域设置),这可以通过 MS Office 和 OpenOffice 实现。我想在代码中做同样的事情。

( Apache POI 3.12)

最佳答案

在货币数字格式的 Offixe OpenXML (*.xlsx) 中,只能本地化货币符号,但不能本地化小数点分隔符。小数点分隔符来自运行 Excel 的 Windows 系统的 Windows 系统区域设置。千位分隔符也默认为运行 Excel 的 Windows 系统的 Windows 系统区域设置。

在 Excel 中,这看起来像:

enter image description here

如您所见,只能本地化货币符号。

至少可以使用格式字符串设置千位分隔符。所以格式字符串可以是

"#\\###\\##0.00\\[$€-40C];[红色]\\-#\\###\\##0.00\\[$€- 40C]”

这是货币数字格式,具有本地化的法国欧元货币符号和空格作为千​​位分隔符。因为我们伪造了千位分隔符,所以我们必须在格式字符串中提供所需数量的数字。

小数分隔符是默认值,这意味着它来自运行 Excel 的 Windows 系统的 Windows 系统区域设置。因此,格式字符串中的点 . 并不意味着始终使用点作为小数分隔符,而是使用来自运行 Excel 的 Windows 系统的 Windows 系统区域设置的小数分隔符。如果我们使用逗号 , 作为格式字符串中的千位分隔符,那么这也会使用来自运行 Excel 的 Windows 系统的 Windows 系统区域设置的千位分隔符。然后我们就不需要在格式字符串中给出这么多数字,因为千位分隔符设置将每千位重复一次。所以

“#,##0.00\\[$€-40C];[红色]\\-#,##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 电子表格格式中可用的本地化货币格式不同。这看起来像:

enter image description here

正如您在此处看到的,货币符号和整个格式的语言都可以本地化。

但 Office OpenXML (*.xlsx) 无法存储本地化的货币数字格式。 OpenDocument Spreadsheet (*.ods) 是 OpenOffice/Libreoffice 的原生格式,可以保存本地化的货币数字格式,但如果 Excel 打开这样的文件,本地化将会丢失。

OpenOffice/Libreoffice 的“语言”组合框的设置不能存储在 *.xlsx 中,也不能存储在 OpenOffice/Libreoffice 中。在 OpenOffice/Libreoffice 中设置默认值以外的其他内容,将文件另存为 *.xlsx,关闭 OpenOffice/Libreoffice,在 OpenOffice/Libreoffice 中打开存储的 *.xlsx 文件再次。您将看到“语言”已重置为默认值。

关于java - 如何使用 Apache POI (SXSSF) 设置特定单元格的数据(数字)格式区域设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46180941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com