Java 使用ApachePOIxWPFDocument编写RTL语言时出现符号(撇号、括号)问题
我一直在尝试将希伯莱语数据从excel文件复制到文档中。 虽然字母本身被正确地复制,但每当涉及到一些符号时,它就会变得一团糟 例如:我得到的不是(文本),而是文本( 这是我目前的代码: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 ((
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((שָׁջֹ㤿ם)“)
.UsedApachePOI
was4.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“+”)代码>?