我有这个静态方法,它从.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=
由于我在这段代码之后处理正则表达式,我更喜欢设置一个标准,而不是解决两个不必要的情况。怎么能做到这一点?
答案 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
区域设置,因此使用点作为小数分隔符,使用逗号作为千位分隔符。