Apache POI:获取字符串形式的数字,如 Excel 中所示

Léo*_*tel 1 java excel apache-poi

我正在尝试使用 POI 解析 Excel 工作簿。在一张纸中,我有一些数字显示为:

\n\n

06 85 85 65 45

\n\n

(这是一个法国电话号码,总是以 0 开头,每 2 位数字有一个空格)。

\n\n

我的需要是从 Excel 单元格中获取带有零和空格的字符串。

\n\n

以下是我调查的一些内容:

\n\n
double doubleValue = cell.getNumericCellValue(); // worth 6.85856545E8\nString dataStringFormat = cell.getCellStyle().getDataStringFormat(); // worth 0#" "##" "##" "##" "##\n
Run Code Online (Sandbox Code Playgroud)\n\n

我猜想 POI API 有一种方法可以将“dataStringFormat”应用于“doubleValue”以获得类似 06 85 85 65 45 的内容。

\n\n

有人知道我该怎么做吗?

\n\n

非常感谢。

\n\n

编辑:\nGagravarr 让我上路了。他的

\n\n
DataFormatter fmt = new DataFormatter();\nString phoneNumber = fmt.formatCellValue(cell);\n
Run Code Online (Sandbox Code Playgroud)\n\n

仍然返回 685856545 但我感谢他,我找到了 CellNumberFormatter 类。并使用以下代码获取我的 06 85 85 65 45 :

\n\n
String stringFormat = cell.getCellStyle().getDataFormatString();\nCellNumberFormatter fmt = new CellNumberFormatter(stringFormat);\nString phoneNumber = fmt.format(cell.getNumericCellValue()); // = 06 85 85 65 45\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试了其他格式的技巧,但仍然存在一些问题。\n- 123 3/25 变成 123 ??/?? (不支持分数格式?)\n- 1,23E+09 变为 1,23.1,E+09

\n\n

有些是因为区域设置:\n- 123 456 789 变成 123,456,789 (法语中的千百万分隔符 i \' \' 而不是 \',\')\n- 123,12 变成 123.45 (同样是 \',\' )法语中的小数点分隔符,而不是 \'.\')\n- \xe2\x82\xac 变为 ? (这里编码?)

\n\n

时间和日期有奇怪的行为:\n-12:12:12 PM 变为 [$-4.69]12:00:42 AM ([$-4.69] 是 excel stringFormat 的一部分,似乎不受支持通过 POI)\n-12/11/14 变为 01/01/04(我不明白那个......)

\n\n

我会尝试对此进行调查。

\n\n

感谢您的帮助。

\n

Gag*_*arr 5

Excel 中的数字(除了少数边缘情况)存储为浮点数。Java 中的浮点数,当格式化为字符串时,会以尾随小数点打印,如果很大,则以科学(指数)格式打印,如您所见

假设您真正想要的是“给我一个看起来像 Excel 在该单元格中显示的字符串”,那么不要调用 cell.toString(),并且不要获取数字双值 + 作为字符串打印。这些不会给你你所需要的。

相反,您需要使用DataFormatter 类,它提供了读取应用于单元格的 Excel 格式规则的方法,然后在 Java 中重新创建(尽可能)这些规则

你的代码应该是:

DataFormatter fmt = new DataFormatter();

String phoneNumber = fmt.formatCellValue(cell);
Run Code Online (Sandbox Code Playgroud)

这将根据 Excel 中应用的格式规则设置数字格式,因此返回的结果应如您所期望的那样