2016-08-03 17 views
0

Ich habe eine ganze Reihe von Dokumenten, die einen Plain Text Marker wie ~ {fieldToBeReplaced} haben und ich möchte, dass es durch ein Merge Feld ersetzt wird.Syncfusion DocIO Ersetze Text mit merge Feld

Ich habe den folgenden Code, die Art der merge-Feld und fügt dann den Text < < MERGEFIELD_NAME >>.

Was ich will, ist es, das Mergefield mit dem Namen angezeigt werden, so wie es wäre, wenn ich Einfügen-> Feld in Wort einfügen würde.

//linqPad Script 
void Main() 
{ 
    Console.WriteLine("::::: Replacing BookMarks ::::: "); 
    //Search And Replace bookmarks 
    try 
    { 
     var replaceDir = new DirectoryInfo(saveFileLocation); 
     var bookmarkFiles = replaceDir.GetFiles().ToList(); 
     foreach (var bkmFile in bookmarkFiles) 
     { 
      if (SearchReplaceBookmarks(bkmFile.FullName)) 
      { 
       Console.WriteLine("Bookmarks Replace:" + bkmFile.Name + " ::: "); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("ERROR: ::: " + ex.Message); 
    } 
} 
static string startDir = Path.GetDirectoryName(Util.CurrentQueryPath); 
string saveFileLocation = startDir + @"\Converted\"; 
    private List<fieldReplace> fieldList = new List<fieldReplace>() { 
    //new fieldReplace("",""), 
    new fieldReplace("~{U-nm}","_Doctor"), 
    new fieldReplace("~{P-nl}","_Patient_Surname","Patient_Firstname"), 
    new fieldReplace("~{DOBN}","_Patient_DOB"), 
    new fieldReplace("~{U-ph","_Doctor_PhoneWork"),//Surgeon Business 
    new fieldReplace("~{U-pm}","_Doctor_PhoneMobile")//Surgeon After Hours 
} 
// Define other methods and classes here 
private bool SearchReplaceBookmarks(string filename) 
{ 
    try 
    { 
     WordDocument wordDocument = new WordDocument(filename); 
     //Adds one section and one paragraph to the document 
     foreach (var fld in fieldList) 
     { 
      var replaceBookmark = wordDocument.Find(fld.TextToReplace, false, true); 
      //if the bookmark is in the list then 
      while (replaceBookmark != null) 
      { 
       //Find and replace text with merge field. 
       var paragraph = new WParagraph(wordDocument); 
       for (int i =0 ; i<= fld.FieldNames.Length-1;i++){ 
        var field = paragraph.AppendField(fld.FieldNames[i], FieldType.FieldMergeField); 
        field.FieldType = FieldType.FieldMergeField; 
        if (i < fld.FieldNames.Length - 1) { paragraph.AppendText(", ");} 
       } 
       var selection = new TextSelection(paragraph, 0, paragraph.Text.Length); 
      wordDocument.Replace(fld.TextToReplace, selection, true, true); //This is where the Merge Field is meant to be inserted 
       replaceBookmark = wordDocument.FindNext(paragraph, fld.TextToReplace, false, true); 
      } 
     } 
     //Debug.Write(wordDocument.MailMerge.MappedFields); 
     wordDocument.Save(filename, FormatType.Docx); 
     wordDocument.Close(); 
     return true; 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("ERROR:" + filename + " ::: " + ex.Message); 
     return false; 
    } 
} 
private class fieldReplace 
{ 
    public fieldReplace(string oldText, params string[] newNewFieldName) 
    { 
     this.TextToReplace = oldText; 
     this.FieldNames = newNewFieldName; 
    } 
    public string TextToReplace { get; set; } 
    public string[] FieldNames { get; set; } 
} 

Antwort

2

On auf dem genannte Szenario zu analysieren, 1), um den Platzhalter Text aus dem Word-Dokument zu finden. 2) Ersetzen des Platzhaltertextes durch die Zusammenführungsfelder und die Felder, die als solche im MS Word-Dokument ersetzt werden sollen.

Ja, mit DocIO kann der Platzhaltertext durch Merge-Felder ersetzt werden, die MS Word entsprechen. Wir haben Ihren Code geändert, um Ihre Anforderungen zu erfüllen. Wir haben die TextBodyPart-Überladung der Replace() -Methode verwendet. Bitte finden Sie das folgende Code-Snippet.

Modifizierter Codeschnipsel TextBodyPart bodyPart = new TextBodyPart (wordDocument); bodyPart.BodyItems.Add (Absatz); wordDocument.Replace (fld.TextToReplace, bodyPart, true, true);

Bei weiteren Fragen wenden Sie sich bitte an unser Support-Team unter [email protected], um umgehend Hilfe zu erhalten.