ExcelExtractor如何决定使用逗号或点作为千位分隔符?

时间:2018-02-22 04:00:10

标签: apache-poi locale

我有这个静态方法,它从.xls文件接收文件路径并从中提取单个String。我使用POI来检索此数据。这是代码:

private static String readsIPCASheet() throws Exception {
    String filePath = unzipsIPCAfile();
    InputStream input = new FileInputStream(filePath);
    HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(input));
    ExcelExtractor extractor = new ExcelExtractor(wb);
    extractor.setFormulasNotResults(true);
    extractor.setIncludeSheetNames(false);
    extractor.setIncludeBlankCells(true);
    String text = extractor.getText();
    extractor.close();
}

我发现使用我的本地机器(位于巴西)我收到以下数据:

198.22  40.27   171.24  568.17  98.22   3,035.71

但是当我在我的VPS(位于美国)上运行此代码时,我会收到:

198,22  40,27   171,24  568,17  98,22   3.035,71

使用unix locale,我得到了这个:

远程:

wildfly@server:~$ locale
LANG=pt_BR.UTF-8
LANGUAGE=
LC_CTYPE=pt_BR.UTF-8
LC_NUMERIC=pt_BR.UTF-8
LC_TIME=pt_BR.UTF-8
LC_COLLATE="pt_BR.UTF-8"
LC_MONETARY=pt_BR.UTF-8
LC_MESSAGES="pt_BR.UTF-8"
LC_PAPER=pt_BR.UTF-8
LC_NAME=pt_BR.UTF-8
LC_ADDRESS=pt_BR.UTF-8
LC_TELEPHONE=pt_BR.UTF-8
LC_MEASUREMENT=pt_BR.UTF-8
LC_IDENTIFICATION=pt_BR.UTF-8
LC_ALL=

本地:

gabriel ~ $ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE=pt_BR.UTF-8
LC_NUMERIC=pt_BR.UTF-8
LC_TIME=pt_BR.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=pt_BR.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=pt_BR.UTF-8
LC_NAME=pt_BR.UTF-8
LC_ADDRESS=pt_BR.UTF-8
LC_TELEPHONE=pt_BR.UTF-8
LC_MEASUREMENT=pt_BR.UTF-8
LC_IDENTIFICATION=pt_BR.UTF-8
LC_ALL=

由于我在这段代码之后处理正则表达式,我更喜欢设置一个标准,而不是解决两个不必要的情况。怎么能做到这一点?

1 个答案:

答案 0 :(得分:2)

apache poi Excel提取器(HSSF以及XSSF)正在使用DataFormatter来格式化数值。所以DataFormatter决定使用逗号或点作为千分隔符。至少在上一个稳定的apache poi版本3.17中,它会根据LocaleUtil.getUserLocale()做出此决定。请参阅DataFormatter.java:235ff

因此,如果您在创建提取器之前设置LocaleUtil.setUserLocale,则此区域设置将用于决定使用逗号或点作为千位分隔符。

实施例

...
LocaleUtil.setUserLocale(java.util.Locale.US);
ExcelExtractor extractor = new ExcelExtractor(wb);
...

US中使用DataFormatter区域设置,因此使用点作为小数分隔符,使用逗号作为千位分隔符。