2013-09-12 5 views
1

В настоящее время у меня есть Word-Template с RTF-FormField, в этом FormField я хочу вставить Plaintext, который поступает из MSSQL-Database.OpenXml-SDK: как вставить Plaintext с CarriageReturn/Linefeed

При настройке этого метода я эксперт Содержание любого в моем поле формы документа (в том числе и мой RTF-поле формы)

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); 
} 

К сожалению, проглатывает CarriageReturn/перевод строки

Я пытался сделать это таким образом

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, и я не могу открыть его больше: -/

У кого-нибудь здесь может быть одна и та же проблема и есть идея, как я могу вставить текст без потери формального форматирования (CarriageReturns и linefeeds)?

ответ

1

Итак, наконец я нашел решение самостоятельно, вы можете использовать AltChunk для вставки PLAINTEXT и не потерять форматирование :-)

Вот код, может быть, это помогает кто-то, кто имеет такую ​​же проблему ;-)

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); 
}