You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 19:45:03