Word Interop копировать форматированный текст ячейки таблицы

Я пишу дополнение для word для автоматизации редактирования шаблона протокола.

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

сейчас я делаю это так:

Range formattedText = agendaTable.Rows[i].Cells[1].Range;
string temp = formattedText.WordOpenXML;

позже я хочу вставить текст в другую ячейку таблицы:

otherTablesRow.Cells[1].Range.InsertXML(temp);

формирование является правильным, за исключением linebreak ("ra") в конце, который происходит из диапазона, где я извлекаю текст из клетка. Похоже, word использует linebreak для обозначения конца ячеек.

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


Update: может быть, я задаю свой вопрос по-другому.

моя общая проблема заключается в том, чтобы скопировать более одного отформатированного текстового диапазона в память и позже вставить его где-то в том же документ.

2 ответов


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

var copyFrom = agendaTable.Rows[i].Cells[1].Range;
var copyTo = otherTablesRow.Cells[1].Range;

copyFrom.MoveEnd(WdUnits.wdCharacter, -1);
copyTo.FormattedText = copyFrom.FormattedText;

есть конец ячейки символов в agendaTable диапазоне, который портит целевую ячейку в вашем примере; используя MoveEnd мы копируем все, кроме конца ячейку символ (последний символ).


вы можете скопировать и вставить выбор таким образом:

public void Copy()
{
    var selection = (Range)Application.Selection;
    selection.Copy();
}

public void Paste()
{
    var selection = (Range)Application.Selection;
    selection.PasteSpecial();
}

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

EDIT: копирование форматированного текста без использования буфера обмена (это простая копия XML):

List<string> copies = new List<string>();
public void Copy()
{
    Microsoft.Office.Interop.Word.Selection wordSelection = Application.Selection;
    if (wordSelection != null && wordSelection.Range != null)
    {
        copies.Add(wordSelection.get_XML());
    }            
}

public void Paste(int index)
{
    Microsoft.Office.Interop.Word.Selection wordSelection = Application.Selection;
    if (wordSelection != null && copies.Count > index)
    {
        wordSelection.InsertXML(copies[index]);
    }              
}