2012-04-02 11 views
0

Wir verwenden Aspose.Words für .NET, um Word-Dokumente in unserer Anwendung zu exportieren. Jetzt muss ich auch RichText Inhalt (eigentlich ein FlowDocument) in das exportierte Dokument einfügen. Um zu exportieren, implementieren wir die IMailMergeDataSource-Schnittstelle. Die GetValue Funktion dieser IMailMergeDataSource Implementierung wird durch die Aspose Bibliothek genannt, und diese Funktion ist wie folgt aussieht:Wie Sie RichText mit Aspose.Words für .NET in Word speichern?

public override bool GetValue(string fieldName, out object fieldValue) { ... } 

So bekomme ich die Feldnamen des aktuellen Feldes in der Word-Vorlage, und ich habe die festlegen fieldValue zu einer Zeichenfolge, sodass die Zeichenfolge im FeldValue im Word-Dokument angezeigt werden kann.

Aber zum Beispiel, wenn ich die fieldvalue auf ein Flowdocument gesetzt ist, wird das Ergebnis ein XML-String sein (die ToString Darstellung des Flowdocument-Objekts)

Antwort

1

würde ich vorschlagen, dass Sie den Rich-Text in der fieldvalue übergeben. Laden Sie diese Rich-Text in Aspose.Words Document-Objekt wie folgt (in FieldMerging Ereignis):

string rtfStr = "{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang3079{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}}{\\colortbl ;\\red255\\green0\\blue0;\\red0\\green128\\blue0;\\red0\\green0\\blue255;}\\viewkind4\\uc1\\pard\\cf1\\f0\\fs17 Rot.\\cf0\\fs17 \\cf2\\fs17 Gr\\'fcn.\\cf0\\fs17 \\cf3\\fs17 Blau.\\cf0\\fs17 \\i\\fs17 Kursiv.\\i0\\fs17 \\strike\\fs17 Durchgestrichen. \\ul\\strike0 Unterstrichen.\\ulnone\\fs17 \\b\\fs17 Fett.\\b0\\fs17\\par}"; 

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
byte[] dataBytes = encoding.GetBytes(rtfStr); 
MemoryStream stream = new MemoryStream(dataBytes); 

LoadOptions loadOptions = new LoadOptions(); 
loadOptions.LoadFormat = LoadFormat.Rtf; 

Document doc = new Document(stream, loadOptions); 

Sie müssen Implementieren IFieldMergingCallback Schnittstelle in der Lage sein zu steuern, wie Daten in Datenfelder während eines Serienvorgang eingeführt wird.

private class HandleMergeFields : IFieldMergingCallback 
{ 
    void IFieldMergingCallback.FieldMerging(FieldMergingArgs e) 
    { 
     DocumentBuilder builder = new DocumentBuilder(e.Document); 

     builder.MoveToMergeField("fieldName"); 
     Node node = builder.CurrentNode; 

     // doc is an RTF document we created from RTF string 
     InsertDocument(node, doc); 

Ich hoffe, dass dies in Ihrem Szenario helfen wird. Wenn es nicht hilft, lass es mich wissen.

+1

Es funktioniert! Vielen Dank! Ich musste nur die FlowDocument-Zeichenfolge in eine RTF-Zeichenfolge konvertieren: – asdfghjkl

+0

var xamlString = "..."; var flowDocument = FlowDocumentService.GetFlowDocument (xamlString); Zeichenfolge dataFormat = DataFormats.Rtf; var documentTextRange = neuer TextRange (flowDocument.ContentStart, flowDocument.ContentEnd); var stream = neuer MemoryStream(); documentTextRange.Save (stream, dataFormat); LoadOptions loadOptions = neu LoadOptions(); loadOptions.LoadFormat = LoadFormat.Rtf; fieldValue = neues Dokument (stream, loadOptions); – asdfghjkl