当前位置: 首页 > 知识库问答 >
问题:

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

邓仲卿
2023-03-14

在我试图使用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(),样式。getDataFormat(),样式。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.)”返回完整结果?

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


共有1个答案

公孙棋
2023-03-14

Excel数字格式0.0\\p.\p.;\(0.0\\p.\p.\)转换成java.text.格式时,apache poiDataForcat中出现错误。正确的相应java.text.格式将是新的java.text.DecimalFormat("0.0'p. p.';(0.0'p. p.')")。但是apache poiDataForcat无法正确翻译此内容。

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

作为一种解决方法,我们可以告诉DataFormatter如何翻译单个特殊的Excel数字格式。为此,请使用DataFormatter方法。添加格式。

例子:

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格式,这些格式必须被翻译。这就是为什么提示向ApachePOI提交错误报告。

顺便说一句:Excel格式0.0“p.p.”\(0.0“p.p.”\)将更通用。它避免了将p.p.中的点()与十进制分隔符混淆。

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

 类似资料:
  • 我是Spring MVC的新手,我刚刚遇到Spring自定义格式化程序。所以我试图为java.util.date创建一个自定义格式化程序。 MyDateFormatter.java

  • 本文向大家介绍.NET Framework 格式:自定义DateTime格式,包括了.NET Framework 格式:自定义DateTime格式的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 本文向大家介绍PHP自定义函数格式化json数据示例,包括了PHP自定义函数格式化json数据示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP自定义函数格式化json数据的方法。分享给大家供大家参考,具体如下: PS:这里再为大家推荐几款比较实用的json在线工具供大家参考使用: 在线JSON代码检验、检验、美化、格式化工具: http://tools.jb51.net/code

  • v-charts 提供对数据格式的设置的能力,一个常见的设置数据格式的方式如下所示: <template> <ve-line :data="chartData" :settings="chartSettings"></ve-line> </template> <script> export default { data () { this.chartSettings = { metr

  • 我想通过LLCP在一个NDEF记录中的NDEF消息中传输一个自定义数据(或者有效载荷可能会被分块到几个NDEF中)。传输的内容是具有特定格式的文件,仅在特定应用中具有意义。那么,指定NDEF头的最佳方法是什么? 1) 将TNF设置为0x04(NFC论坛外部类型),0x03(绝对URI)或0x05(未知)?0x04将在 TYPE 字段中具有自定义相对 URI,如果是绝对 URI,则0x03绝对 UR

  • 问题内容: 我必须在Java中使用自定义日期格式。尽管Java不提供对微秒的支持,但它包含微秒。因此,我用零填充了时间模式,在格式化时它可以很好地工作,但是我无法使用该模式解析日期字符串。 有没有简单的解决方法,还是我必须自己处理微秒(使用String函数)? java.text.ParseException:无法解析的日期:“ 2010-01-25-12.40.35.769000” 问题答案: