Léo*_*tel 1 java excel apache-poi
我正在尝试使用 POI 解析 Excel 工作簿。在一张纸中,我有一些数字显示为:
\n\n06 85 85 65 45
\n\n(这是一个法国电话号码,总是以 0 开头,每 2 位数字有一个空格)。
\n\n我的需要是从 Excel 单元格中获取带有零和空格的字符串。
\n\n以下是我调查的一些内容:
\n\ndouble doubleValue = cell.getNumericCellValue(); // worth 6.85856545E8\nString dataStringFormat = cell.getCellStyle().getDataStringFormat(); // worth 0#" "##" "##" "##" "##\nRun Code Online (Sandbox Code Playgroud)\n\n我猜想 POI API 有一种方法可以将“dataStringFormat”应用于“doubleValue”以获得类似 06 85 85 65 45 的内容。
\n\n有人知道我该怎么做吗?
\n\n非常感谢。
\n\n编辑:\nGagravarr 让我上路了。他的
\n\nDataFormatter fmt = new DataFormatter();\nString phoneNumber = fmt.formatCellValue(cell);\nRun Code Online (Sandbox Code Playgroud)\n\n仍然返回 685856545 但我感谢他,我找到了 CellNumberFormatter 类。并使用以下代码获取我的 06 85 85 65 45 :
\n\nString stringFormat = cell.getCellStyle().getDataFormatString();\nCellNumberFormatter fmt = new CellNumberFormatter(stringFormat);\nString phoneNumber = fmt.format(cell.getNumericCellValue()); // = 06 85 85 65 45\nRun 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感谢您的帮助。
\nExcel 中的数字(除了少数边缘情况)存储为浮点数。Java 中的浮点数,当格式化为字符串时,会以尾随小数点打印,如果很大,则以科学(指数)格式打印,如您所见
假设您真正想要的是“给我一个看起来像 Excel 在该单元格中显示的字符串”,那么不要调用 cell.toString(),并且不要获取数字双值 + 作为字符串打印。这些不会给你你所需要的。
相反,您需要使用DataFormatter 类,它提供了读取应用于单元格的 Excel 格式规则的方法,然后在 Java 中重新创建(尽可能)这些规则
你的代码应该是:
DataFormatter fmt = new DataFormatter();
String phoneNumber = fmt.formatCellValue(cell);
Run Code Online (Sandbox Code Playgroud)
这将根据 Excel 中应用的格式规则设置数字格式,因此返回的结果应如您所期望的那样