通过Java Apache POI向Word写入阿拉伯语出现括号反转问题咨询
问题根因
你遇到的是双向文本(BiDi)渲染异常:阿拉伯语属于从右到左(RTL)书写的语言,仅设置段落右对齐不足以支持复杂双向文本渲染,Word处理多对括号/引号这类中性字符时,会因为缺少RTL标识出现顺序错乱。
你原有代码还有一处冗余操作:调用addParagraph()得到arabicParagraph后,再次调用addParagraph(arabicParagraph)会重复插入两次段落,也可能干扰文本渲染。
可行解决方案
修改段落配置,显式开启RTL双向布局属性,同时给文本设置阿拉伯语语言标识即可,修改后的代码如下:
try (var WordOutput = new FileOutputStream(whichFile, true); var MSDoc = new XWPFDocument(OPCPackage.open(whichFile)); ) { List<XWPFTable> tables = MSDoc.getTables(); XWPFTable ArabicTable = tables.get(0); var ArabicRow = ArabicTable.getRow(0); ArabicRow.getCell(1).removeParagraph(0); XWPFParagraph arabicParagraph = ArabicRow.getCell(1).addParagraph(); arabicParagraph.setAlignment(ParagraphAlignment.RIGHT); // 新增:开启段落RTL双向布局 arabicParagraph.setRightToLeft(true); // 低版本POI如果没有setRightToLeft方法,替换为下面的底层调用 // arabicParagraph.getCTP().addNewPPr().addNewBidi().setVal(true); XWPFRun run = arabicParagraph.createRun(); // 新增:设置文本语言为阿拉伯语(沙特),辅助Word正确识别文本类型 run.setLang("ar-SA"); String theString = "(هذا نص عربي) (هذا نص عربي آخر)"; run.setText(theString); // 删除重复添加段落的冗余代码 // ArabicRow.getCell(1).addParagraph(arabicParagraph); MSDoc.write(WordOutput); } catch(Exception e) { // 你的异常处理逻辑 }
补充说明
如果调整后仍有个别特殊符号顺序异常,可以提前使用ICU4J的BiDi转换工具预处理字符串,但90%以上的场景仅需添加上述RTL配置即可解决问题。
内容的提问来源于stack exchange,提问作者user12616222
相关产品推荐
相关产品推荐

