Вставка содержимого RTF в существующий текстовый диапазон в Word с использованием сборок Interop c # - PullRequest
0 голосов
/ 19 сентября 2018

Я работаю над созданием сложного отчета из моего приложения WPF в текстовом формате.Часть содержимого, которое мне нужно вставить в отчет, имеет тип RTF.Я не могу понять, как вставить RTF-контент в конце определенного текстового диапазона.На данный момент я знаю только один способ программного добавления содержимого RTF в текстовый документ, который заключается в установке содержимого RTF в буфер обмена и последующей вставке данных обратно.Но я не могу найти способ вставить содержимое точно после существующего содержимого текстового диапазона.Я попытался добавить абзац в конец текстового диапазона и вставить в него содержимое RTF, но после циклического выполнения нескольких операций вставки конечное содержимое, которое я вижу в документе, перемешано и не в правильном порядке.

enter image description here

Ниже приведен фрагмент кода, который я пробовал:

        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в определенном месте в текстовом диапазоне.Может ли кто-нибудь помочь с этим (желательно с фрагментом кода)?

Спасибо,

1 Ответ

0 голосов
/ 21 сентября 2018

Попробуйте поработать с объектом Range и «свернуть» диапазон по мере продвижения.Я не проверял следующее, только с головы до головы ...

var para = textRange.Paragraphs.Add();
var rng = para.Range;
Clipboard.SetData(System.Windows.DataFormats.Rtf, text);
rng.PasteSpecial(DataType: Microsoft.Office.Interop.Word.WdPasteDataType.wdPasteRTF);
rng.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
//Alternative to insert a new paragraph
rng.Text = "\n";
//prepare for the next entry, for illustration - of course you'd built this into a loop
rng.Collapse(Word.WdCollapseDirection.wdCollapseEnd);
Clipboard.SetData(System.Windows.DataFormats.Rtf, otherText);
rng.PasteSpecial(DataType: Microsoft.Office.Interop.Word.WdPasteDataType.wdPasteRTF);
...