C # Word Interop, вставка буфера обмена в абзац - PullRequest
4 голосов
/ 22 сентября 2011

У меня есть создатель отчетов, который создает начало отчета в слове.Word остается открытым для пользователя, чтобы продолжить работу с отчетом.Построитель отчетов получает rtf из базы данных, которая будет использоваться в качестве абзацев.Для каждого RTF в документе создается абзац, и к нему добавляется RTF.

Кажется, что я прочитал, подразумевает, что если я хочу вставить RTF в документ Word, тогда я помещаю его в буфер обменавставьте его из буфера обмена в слово.Это прекрасно работает, за исключением того, что на самом деле не помещает это в абзац так, как я хочуКогда вызывается метод вставки, он фактически не помещает rtf в диапазон абзаца, он просто вставляет его там, где начинается абзац.Он не перезаписывает абзац, абзац все еще существует под блоком RTF, который я вставил.Перемещение диапазона на единицу для размещения меток абзаца не работает, вместо этого просто вставляется под абзац.Я думаю, что для этого нужно использовать метод Insert (), а не метод Paste (), однако я не знаю, как это сделать, и не могу найти никакой информации, как это сделать.Я могу вставлять из строительных блоков или вставлять обычный текст нормально, но то, что здесь вставляется, должно быть отформатированным текстом.Форматированный текст имеет сочетание стилей и т. Д., Которые создает другой пользователь.

Код для копирования в буфер обмена и вставки следующий:

Clipboard.SetText(richTextBox1.Rtf, TextDataFormat.Rtf);
oPara[i].Range.Paste();

Я знаю, что вы можете вставлять строительные блокив абзацы, который сохраняет форматирование абзаца, со следующим:

tTemplate.BuildingBlockEntries.Item(foundList[i]).Insert(oPara[i].Range.FormattedText);

, но я не могу найти, как вы достигли бы этого в моем сценарии.

Причина, по которой я хотел бывставить его в абзац, чтобы отредактировать некоторые аспекты формата и убедиться, что такие вещи, как не разбивать строки на страницах и т. д.

Код, который я сейчас использую для создания и вставки, такой:

Word.Paragraph[] oPara = new Word.Paragraph[foundList.Count];

for (int i = 0; i < foundList.Count; i++)
{
    oPara[i] = oDoc.Content.Paragraphs.Add();
    Clipboard.SetText(foundList[i].Paragraph, TextDataFormat.Rtf);
    oPara[i].Range.InsertParagraphAfter();
    oPara[i].Range.Paste();
    oPara[i].KeepTogether = -1;
    oPara[i].Range.Font.Size = 10;
    oPara[i].Range.Font.Name = "Arial";
}

Я проверил, где абзац был точно визуально со строкой

oPara[0].Range.Select(); //To see first paragraph

В результате rtf вставлен в том месте, где начинается абзац, а абзац чуть ниже вставленного rtf.Как бы вы вставили rtf так, как я хочу, в абзац в MS-Word?

РЕДАКТИРОВАТЬ: вызов метода свернуть не делает то, что я хочу, чтобы

1 Ответ

2 голосов
/ 26 сентября 2011

Нашли решение: метод вставки действительно вставляет теги абзаца, проблема в том, что при вводе текста в поле расширенного текста поле расширенного текста автоматически добавляет теги абзаца независимо от того, были ли они для начала или нет.Поскольку у rtf были теги абзаца, он считался другим абзацем.Таким образом, в rtf из базы данных были теги абзаца, которые были добавлены с помощью расширенного текстового поля, а не пользователя.Чтобы это исправить, я просто удалил теги абзаца из rtf, взятого из базы данных.Вот код, с которым я закончил:

for (int i = 0; i < foundList.Count; i++)
{
    oPara[i] = oDoc.Content.Paragraphs.Add();
    string tempS = foundList[i].Paragraph;
    tempS = tempS.Replace("\\pard", "");
    tempS = tempS.Replace("\\par", "");
    Clipboard.SetText(tempS, TextDataFormat.Rtf);
    oPara[i].Range.InsertParagraphAfter();
    oPara[i].Range.Paste();
    oPara[i].KeepTogether = -1;
    oPara[i].Range.Font.Size = 10;
    oPara[i].Range.Font.Name = "Arial";
}
...