gpt4 book ai didi

java - Apache POI 数据格式化程序无法应用自定义格式 "0.0 p.p.;(0.0 p.p.)"

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

在我尝试使用 Apache POI 进行转换的 Excel 文件中,我有一个单元格的数值为 -3.97819466831428,自定义格式为“0.0 p.p.;(0.0 p.p.)”。因此,在 Excel 中显示的值为“(4.0 p.p.)”

当我使用 POI 库转换相同的内容时,我得到的输出为:“(4.0 p”如何获得与 Excel 中相同的值:(4.0 p.p.)?

我使用 DataFormatter 的方式是:

val = dataFormatter.formatRawCellContents(cell.getNumericCellValue(), style.getDataFormat(), style.getDataFormatString());

我认为问题出在“p.p.”的使用上。在数据格式字符串中,尤其是点。当我使用 style.getDataFormatString() 从 POI 打印数据格式字符串时,我得到的格式为“0.0\\p.\p.;(0.0\\p.\p.\)”。

即使我手动更改格式字符串以使用“0.0;(0.0\\p\.\p\.\)”,结果仍然相同。所以,我现在没有想法了。如何从数据格式化程序中获取完整结果,如 Excel 中的“(4.0 p.p.)”?

我的另一个问题是:是否可以使用 Apache POI 获取 Excel 文件中的实际显示值?像本例一样,是否可以直接从 Excel 获取值“(4.0 p.p.)”,而无需在 POI 中应用任何数据格式?

最佳答案

这是在转换 Excel 数字格式 0.0\\p.\p 时 apache poiDataFormatter 中出现的错误.;\(0.0\\p.\p.\) 转换为 java.text.Format。正确的对应 java.text.Format 将是 new java.text.DecimalFormat("0.0' p.p.';(0.0' p.p.')")。但是 apache poiDataFormatter 无法正确转换此内容。

您应该向 apache poi 提交有关此问题的错误报告。在该错误报告中,您应该提供一个工作示例(完整的 Java 代码和示例 Excel 文件)来重现该问题。

作为一种解决方法,人们可以告诉 DataFormatter 如何转换单个特殊的 Excel 数字格式。为此,请使用方法 DataFormatter.addFormat .

示例:

import org.apache.poi.ss.usermodel.*;

import java.io.FileInputStream;

class DataFormatterAddFormat {

public static void main(String[] args) throws Exception {

Workbook workbook = WorkbookFactory.create(new FileInputStream("ExcelExample.xlsx"));

DataFormatter dataFormatter = new DataFormatter();
FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();

dataFormatter.addFormat("0.0 p.p.;(0.0 p.p.)",
new java.text.DecimalFormat("0.0' p.p.';(0.0' p.p.')"));
dataFormatter.addFormat("0.0\" p.p.\";\\(0.0\" p.p.\"\\)",
new java.text.DecimalFormat("0.0' p.p.';(0.0' p.p.')"));
dataFormatter.addFormat("0.0\\ \\p.\\p.;\\(0.0\\ \\p.\\p.\\)",
new java.text.DecimalFormat("0.0' p.p.';(0.0' p.p.')"));

Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {

String value = dataFormatter.formatCellValue(cell, formulaEvaluator);
System.out.println(value);

}
}
workbook.close();
}
}

现在可以正确翻译添加的特殊数字格式。当然,这并不是真正的最终解决方案,因为这里需要捕获所有可能需要翻译的 Excel 格式。这就是为什么提示向 apache poi 提交错误报告。

顺便说一句:Excel 格式 0.0"p.p.";\(0.0"p.p."\) 对此更为通用。它可以避免将 p.p. 中的点 (.) 与小数点分隔符混淆。

关于直接从 Excel 文件获取格式化值的问题:这是不可能的。所有 Excel 版本都单独存储值和样式。数值始终以 double 浮点值存储。这些值的数字格式存储在文件的单独样式部分中。因此,使用 apache poi 获取在 Excel 中样式化的单元格值的最佳实践是使用 DataFormatter.formatCellValue如我的代码示例所示。

关于java - Apache POI 数据格式化程序无法应用自定义格式 "0.0 p.p.;(0.0 p.p.)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58982545/

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