Java 使用ApachePOIxWPFDocument编写RTL语言时出现符号(撇号、括号)问题

Java 使用ApachePOIxWPFDocument编写RTL语言时出现符号(撇号、括号)问题,java,apache-poi,Java,Apache Poi,我一直在尝试将希伯莱语数据从excel文件复制到文档中。 虽然字母本身被正确地复制,但每当涉及到一些符号时,它就会变得一团糟 例如:我得到的不是(文本),而是文本( 这是我目前的代码: XWPFParagraph newPara = document.insertNewParagraph(cursor); newPara.setAlignment (ParagraphAlignment.RIGHT); CTP ctp = newPara.getCTP(); CTPPr ctppr; if ((

我一直在尝试将希伯莱语数据从excel文件复制到文档中。 虽然字母本身被正确地复制,但每当涉及到一些符号时,它就会变得一团糟

例如:我得到的不是(文本),而是文本(

这是我目前的代码:

XWPFParagraph newPara = document.insertNewParagraph(cursor);
newPara.setAlignment (ParagraphAlignment.RIGHT); 
CTP ctp = newPara.getCTP();
CTPPr ctppr;
if ((ctppr = ctp.getPPr()) == null) ctppr = ctp.addNewPPr();
ctppr.addNewBidi().setVal(STOnOff.ON);
XWPFRun newParaRun = newPara.createRun();
newParaRun.setText(name);
我尝试了一些“双向文本方向支持”(bidi)行

(从这里得到: )


但这与对齐无关…

使用较旧的字处理软件应用程序,当LTR字符和RTL字符在一次文本运行中混合时,似乎会出现问题。然后使用特殊的BiDi字符类型可能是解决方案。请参阅

另见

使用此方法可以完成以下工作:

import java.io.FileOutputStream;

import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;

public class CreateWordRTLParagraph {

 public static void main(String[] args) throws Exception {

  XWPFDocument doc= new XWPFDocument();

  XWPFParagraph paragraph = doc.createParagraph();
  XWPFRun run = paragraph.createRun();
  run.setText("Paragraph 1 LTR");

  paragraph = doc.createParagraph();

  CTP ctp = paragraph.getCTP();
  CTPPr ctppr;
  if ((ctppr = ctp.getPPr()) == null) ctppr = ctp.addNewPPr();
  ctppr.addNewBidi().setVal(STOnOff.ON);

  run = paragraph.createRun();
  String line = "(שָׁלוֹם)";
  run.setText("\u202E" + line + "\u202C");

  paragraph = doc.createParagraph();
  run = paragraph.createRun();
  run.setText("Paragraph 3 LTR");
    
  FileOutputStream out = new FileOutputStream("WordDocument.docx");
  doc.write(out);
  out.close();
  doc.close();    
 }
}
它在包含LTR字符(
)和RTL字符(
)的混合和
U+202C POP定向格式(PDF)的文本行之前使用
U+202E从右向左覆盖(RLO)
在该文本行之后。这会准确地告诉文字处理软件RTL的开始和结束位置。这会为我使用
MS word 365
WordPad
获得正确的输出


Bidi
使用
apache-poi 5.0.0
。setVal(STOnOff.ON)
不太可能,但是
.setVal(true)
可以使用:

  //ctppr.addNewBidi().setVal(STOnOff.ON); // up to apache poi 4.1.2
  ctppr.addNewBidi().setVal(true); // from apache poi 5.0.0 on

无法再现您的问题。当我执行
run.setText(“שָל㤿㤿ם”)
而不是
run.setText(“㶊ل㶋ممممم”)时,在我的链接答案中,它工作正常。您能给出一个完整的示例来重现您的问题吗?这很奇怪。我现在正是用您的代码和示例尝试的,并且得到了您的示例)问题是,在System.out.println(“(שלום)”)中,它表现得非常完美。问题在于写入文档的某个地方。我已经开始使用String.replace手动处理它,但显然它远不理想……抱歉,这无法帮助我。对我来说,它使用我的示例代码和
run.setText((שָׁջֹ’㤿ם)“)
.Used
ApachePOI
was
4.1.2
。它创建一个RTL段落,其中包含一段文字(שָׁלוֹם)。尝试使用
Windows 10
MS Word
以及
Ubuntu Linux
Libreoffice Calc
打开结果
WordDocument.docx
。两者都很好用。没关系,谢谢:)您是否使用
WordPad
打开
*.docx
文件?这就导致了我的
)שָׁ㪛㥃ם(
)。但这只显示了
写字板的一个缺点,它不能正确地显示双向文本。非常感谢你的努力!仍然显示为)ש㪛㥃ם(不过对我来说……我会尝试下载其中一个软件,看看它是否能正常工作……非常感谢:)它可以与写字板一起正常工作。问题是它没有显示一些特征,但我想这是另一个问题。谢谢!因此,出于某种原因,它在microsoft word上不起作用:/我尝试了很多方法。当我在一些(不是所有,而是一些)其他文字处理器上打开它时,它工作正常,但它们有不同的问题。是否有其他解决方法/方向?@librogil:您是否尝试过标记每个LTR和RTL块?例如:
run.setText(“\u200E”+”(“+”\u200F“+”שָׁלוֹם“+”\u200E“+”)