Apache POI中XSSFCell自动编码字符为Unicode,如何阻止?需转义吗?
阻止Apache POI中XSSFCell自动解析
_xHHHH_序列为Unicode字符的方法 这个问题我之前也踩过坑——Apache POI默认会遵循Excel的XML格式规范,把_x[四位十六进制]_这种序列自动解析成对应的Unicode字符,哪怕你设置了单元格类型为字符串也没用,因为这是POI在处理字符串内容时的内置逻辑,和单元格类型、字体完全无关。
要解决这个问题,核心是绕过POI的自动解析逻辑,直接把原始字符串写入Excel的底层XML结构中。这里有个可靠的实现方式:
import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRichTextString; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTString; // 你的原始目标字符串 String rawText = "LUS_BO_WP_x24B8_AI"; // 创建底层CTString对象,直接设置原始值,跳过POI的解析逻辑 CTString ctString = CTString.Factory.newInstance(); ctString.setValue(rawText); // 用XSSFRichTextString包装这个CTString对象 XSSFRichTextString richText = new XSSFRichTextString(ctString); // 给单元格设置值 XSSFCell cell = ...; // 替换成你的单元格实例 cell.setCellValue(richText);
为什么这个方法管用?
平时我们调用cell.setCellValue(String)时,POI会先把字符串传入内部的UnicodeString处理逻辑,这个逻辑会自动扫描并解析_xHHHH_格式的转义序列。而上面的方法直接操作Excel的OOXML底层对象CTString,把原始字符串直接写入XML节点,完全绕过了POI的解析步骤,自然就不会把_x24B8_转成U+24B8(Ⓒ)了。
如果你不想引入底层OOXML依赖,还有个临时变通方案:把_x替换成_x\uFEFF(零宽度不可见字符),这样POI就识别不出_xHHHH_的格式了,但这个方法可能在少数场景下有兼容性问题,不如底层方法可靠。
内容的提问来源于stack exchange,提问作者Matthias Gerth
相关产品推荐
相关产品推荐

