1

目前我有一个带有 RTF-FormField 的 Word 模板,在这个 FormField 中我想插入来自 MSSQL 数据库的纯文本。

使用这种方法,我在我的文档中设置任何 FormField 的内容(包括我的 RTF-FormField)

public static void SetContentControlValue(this WordprocessingDocument doc, string name, string value)
{
    var main = doc.MainDocumentPart;

    var stdRuns = main.Document.Body
                      .Descendants<SdtRun>()
                      .Where(r => r.SdtProperties.GetFirstChild<Tag>().Val.Value.ToLower().Equals(name))
                      .ToList();

    stdRuns.ForEach(c => c.Descendants<Text>().First().Text = value);

    main.Document.Body
                 .Descendants<SdtBlock>()
                 .Where(r => r.SdtProperties.GetFirstChild<Tag>().Val.Value.ToLower().Equals(name))
                 .ToList()
                 .ForEach(c => c.Descendants<Text>().First().Text = value);
}

不幸的是它吞下了回车/换行

我试着这样做

var run = new SdtRun();

string[] newLineArray = { Environment.NewLine };
string[] textArray = value.Split(newLineArray, StringSplitOptions.None);

bool first = true;
foreach (var line in textArray)
{
    if (!first)
    {
        run.Append(new Break());
    }
    first = false;

    Text txt = new Text();
    txt.Text = line;
    run.Append(txt);
}
main.Document.Body.Append(run);

但不幸的是,这破坏了 WordDocument,我再也无法打开它了:-/

这里的任何人都可能有同样的问题并且有一个想法,我可以在不丢失纯文本格式(回车和换行)的情况下插入文本?

4

1 回答 1

1

所以最后我自己找到了一个解决方案,你可以使用 AltChunk 插入纯文本而不丢失你的格式:-)

这是代码,也许它可以帮助遇到同样问题的人;-)

public static void SetNotes(this WordprocessingDocument doc, string value)
{
    MainDocumentPart main = doc.MainDocumentPart;
    string altChunkId = "AltChunkId" + Guid.NewGuid().ToString().Replace("-", "");
    var chunk = main.AddAlternativeFormatImportPart(AlternativeFormatImportPartType.TextPlain, altChunkId);

    using (var mStream = new MemoryStream())
    {
        using (var writer = new StreamWriter(mStream))
        {
            writer.Write(value);
            writer.Flush();
            mStream.Position = 0;
            chunk.FeedData(mStream);
        }
    }

    var altChunk = new AltChunk();
    altChunk.Id = altChunkId;

    OpenXmlElement afterThat = null;
    foreach (var para in main.Document.Body.Descendants<Paragraph>())
    {
        if (para.InnerText.Equals("Notes:"))
        {
            afterThat = para;
        }
    }
    main.Document.Body.InsertAfter(altChunk, afterThat);
}
于 2013-09-12T12:44:09.413 回答