1、问题
今天在做下载 Excel 文件,解析数据时,遇到一个奇葩问题。
文件格式大致长这样
我们是要解析这个 Excel 文件,然后用 map.get("订单号") 这种方式获取每一列的值,结果后面列都能正常获取,只有第一列获取结果为 null 。
后来控制台打印结果看起来也正常,把打印的结果复制在粘贴到代码里之后发现多了一个 \uFEFF 符号,也就是要用 map.get("\uFEFF订单号") 这种方式才能获取到值。
2、分析原因
经过和提供 Excel 文件的第三方沟通他们的原因:
三方为了兼容中文格式问题,确保读取到的文件内容格式都是 utf8 格式的,在文件内容头里带上了加 BOM 的 utf8,加完之后读取第一列需要 map.get(\uFEFF商户订单号) 这样读取。
BOM(Byte Order Mark,字节顺序标记,出现在文本文件头部,Unicode 编码标准中用于标识文件是采用哪种格式的编码),Java在读取 Unicode 文件的时候,会统一把 BOM 变成 “\uFEFF”。
到这里基本就能大概明白为啥只有第一列会出现问题了,因为只会在文件头出现,问题也就找到出在哪了。
3、解决方案
解决办法就是:我们获取第一列值得时候稍微做了一下调整,用下面方式获取就正常了。
map.get(\uFEFF商户订单号)