问题描述
我在 .Net Core 5.0 中使用 DocumentFormat.OpenXml 填充 Word 文档,文本来自数据库,有时文本包含阿拉伯语文本,但英语单词很少,单词出现的顺序不正确,例如例如,如果这是一个阿拉伯文本,第二个作品是英文“一二三”,它将出现在 Word 文档中,就像这样“三二一”,如果我从数据库中复制相同的文本并将其粘贴到 Word 中,它将出现在正确的顺序。
我认为 Word 正在将我粘贴到不同运行的文本分开并将它们按正确的顺序排列,但在我的代码中,我将完整的文本放在一次运行中,有没有办法通过 OpenXML 或我必须手动完成吗?
这是我的代码:
int rowNo = 2;
foreach (DataLine line in data.Lines)
{
TableRow row = table.Elements<TableRow>().ElementAt(rowNo++);
Paragraph p1 = row.Elements<TableCell>().ElementAt(0).Elements<Paragraph>().First();
Run r1 = new();
Text t1 = new(line.AmountString);
r1.AddChild(t1);
p1.AddChild(r1);
Paragraph p2 = row.Elements<TableCell>().ElementAt(1).Elements<Paragraph>().First();
Run r2 = new();
Text t2 = new(line.Description);
r2.AddChild(t2);
p2.AddChild(r2);
ParagraPHProperties pp = p2.ChildElements.First<ParagraPHProperties>();
BiDi bidi = new BiDi();
pp.TextDirection = new TextDirection() { Val = TextDirectionValues.TopToBottomrightToLeft };
pp.Append(bidi);
}
最后 4 行没有区别。
请注意,工作文档格式正确,文本方向和字体正确。
问候
阿明
解决方法
事实证明,可以将 RTL 和 LTR 文本放在单个 Run 中,以下 RunPropoetries 对我有用:
run.RunProperties = new RunProperties
{
RunFonts = new RunFonts { ComplexScript = "Calibri" },RightToLeftText = new RightToLeftText(),Languages = new Languages() {
Bidi = new StringValue("ar-IQ"),Val = new StringValue("en-US")
}
};
我从在 MS Word 中创建的 Word 文档中提取了值,但该段落被分隔为 3 个运行。
感谢 (amiry jd),他在 5 年前遇到了同样的问题check this post