Я работаю над созданием сложного отчета из моего приложения WPF в текстовом формате.Часть содержимого, которое мне нужно вставить в отчет, имеет тип RTF.Я не могу понять, как вставить RTF-контент в конце определенного текстового диапазона.На данный момент я знаю только один способ программного добавления содержимого RTF в текстовый документ, который заключается в установке содержимого RTF в буфер обмена и последующей вставке данных обратно.Но я не могу найти способ вставить содержимое точно после существующего содержимого текстового диапазона.Я попытался добавить абзац в конец текстового диапазона и вставить в него содержимое RTF, но после циклического выполнения нескольких операций вставки конечное содержимое, которое я вижу в документе, перемешано и не в правильном порядке.
Ниже приведен фрагмент кода, который я пробовал:
public partial class MainWindow : System.Windows.Window
{
private List<TestData> TestDatas = new List<TestData>();
public MainWindow()
{
InitializeComponent();
TestDatas.Add(new TestData() { Title = "Phrase 01", Description = @"Any RTF Text" });
TestDatas.Add(new TestData() { Title = "Phrase 02", Description = @"Any RTF Text" });
TestDatas.Add(new TestData() { Title = "Phrase 03", Description = @"Any RTF Text" });
TestDatas.Add(new TestData() { Title = "Phrase 04", Description = @"Any RTF Text" });
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Object oMissing = System.Reflection.Missing.Value;
var templateFilePath = Path.GetFullPath(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Report Template\"));
Object oTemplatePath = templateFilePath + @"phrases.dotx";
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.Application();
Document wordDoc = new Document();
wordDoc = wordApp.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
Selection sel = null;
foreach (Field myMergeField in wordDoc.Fields)
{
myMergeField.Select();
sel = wordApp.Selection;
sel.Delete();
Range initialRange = sel.Range;
foreach (var data in TestDatas)
{
Range appendedRange;
var textRange = AppendToRange(initialRange, data.Title + Environment.NewLine, out appendedRange, wordDoc);
appendedRange.Bold = 1;
appendedRange.Font.Size = 11;
appendedRange.Underline = WdUnderline.wdUnderlineSingle;
var para = textRange.Paragraphs.Add();
}
}
wordDoc.SaveAs("myfile.doc");
wordApp.Application.Quit();
}
private Range AppendToRange(Range range, string appendText, out Range appendedRange, Document wordDoc)
{
// Fetch indexes
object oldStartPosition = range.Start;
object oldEndPosition = range.End;
object newEndPosition = (int)oldEndPosition + appendText.Length;
// Append the text
range.InsertAfter(appendText);
// Define the range of the appended text
appendedRange = wordDoc.Range(ref oldEndPosition, ref newEndPosition);
// Return the range of the new combined range
return wordDoc.Range(ref oldStartPosition, ref newEndPosition);
}
}
public class TestData
{
public string Title { get; set; }
public string Description { get; set; }
}
Мне нужно знать, как правильно вставить содержимое RTFв определенном месте в текстовом диапазоне.Может ли кто-нибудь помочь с этим (желательно с фрагментом кода)?
Спасибо,