使用 DocumentFormat.OpenXml 从数据库中填充带有阿拉伯语/英语文本的 Word 文档

问题描述

我在 .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