Поделиться через


Изменить текст в таблице в текстовом редакторе

В этом разделе показано, как использовать пакет SDK Open XML для Office для программного изменения текста в таблице в существующем текстовом документе.

Открытие существующего документа

Чтобы открыть существующий документ, создайте WordprocessingDocument экземпляр класса, как показано в следующей using инструкции. В той же инструкции откройте текстовый файл в указанном filepath с помощью Open метода с логическим параметром , чтобы true включить редактирование документа.

using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))

В версии 3.0.0+ Close() метод был удален в пользу использования инструкции using. Это гарантирует, что Dispose() метод автоматически вызывается при достижении закрывающей фигурной скобки. Блок, следующий за инструкцией using, создает область для объекта, создаваемого или именуемого в инструкции using. WordprocessingDocument Так как класс в пакете SDK open XML автоматически сохраняет и закрывает объект в рамках его IDisposable реализации, а так как Dispose() вызывается автоматически при выходе из блока, не нужно явно вызывать Save() или Dispose() до тех пор, пока вы используете инструкцию using .

Структура таблицы

Базовая структура WordProcessingML документа состоит из document элементов и body , за которыми следует один или несколько элементов уровня блока, таких как p, который представляет абзац. Абзац содержит один или несколько r элементов. Представляет r собой область текста с общим набором свойств, таких как форматирование. Выполнение содержит один или несколько t элементов. Элемент t содержит диапазон текста.

Документ может содержать таблицу, как в этом примере. — table это набор абзацев (и другого содержимого на уровне блока), упорядоченных в rows и columns. Таблицы в WordprocessingML определяются с помощью tbl элемента , который аналогичен тегу таблицы HTML. Рассмотрим пустую таблицу из одной ячейки (т. е. с одной строкой и одним столбцом) и границ толщиной 1 точка со всех сторон. Эта таблица представлена в следующем WordprocessingML примере кода.

    <w:tbl>
      <w:tblPr>
        <w:tblW w:w="5000" w:type="pct"/>
        <w:tblBorders>
          <w:top w:val="single" w:sz="4" w:space="0" w:color="auto"/>
          <w:left w:val="single" w:sz="4 w:space="0" w:color="auto"/>
          <w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/>
          <w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/>
        </w:tblBorders>
      </w:tblPr>
      <w:tblGrid>
        <w:gridCol w:w="10296"/>
      </w:tblGrid>
      <w:tr>
        <w:tc>
          <w:tcPr>
            <w:tcW w:w="0" w:type="auto"/>
          </w:tcPr>
          <w:p/>
        </w:tc>
      </w:tr>
    </w:tbl>

В этой таблице указываются свойства для всей таблицы, равные 100 % ширины страницы с помощью tblW элемента, набор границ таблицы с помощью tblBorders элемента, сетка таблицы, которая определяет набор общих вертикальных ребер в таблице с помощью tblGrid элемента и одну строку таблицы с помощью tr элемента .

Механизм работы примера кода

В примере кода после открытия документа в инструкции using вы найдете первую таблицу в документе. Затем выполняется поиск второй строки с индексом 1. Далее выполняется поиск третьей ячейки в этой строке с индексом 2, как показано в следующем примере кода.

// Find the first table in the document.
Table table = doc.MainDocumentPart.Document.Body.Elements<Table>().First();

// Find the second row in the table.
TableRow row = table.Elements<TableRow>().ElementAt(1);

// Find the third cell in the row.
TableCell cell = row.Elements<TableCell>().ElementAt(2);

После получения нужной ячейки мы ищем первый прогон первого абзаца ячейки и заменяем текст на переданный. Эти действия показаны в следующем примере кода.

// Find the first paragraph in the table cell.
Paragraph p = cell.Elements<Paragraph>().First();

// Find the first run in the paragraph.
Run r = p.Elements<Run>().First();

// Set the text for the run.
Text t = r.Elements<Text>().First();
t.Text = txt;

Изменение текста в ячейке таблицы

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

Текст Текст Текст
Текст Текст Текст из второго аргумента

Пример кода

Метод ChangeTextInCell изменяет текст во второй строке и третьем столбце первой таблицы, найденной в файле. При его вызове в первом параметре передается путь к файлу, а во втором параметре передается требуемый текст. Например, следующий вызов ChangeTextInCell метода изменяет текст в указанной ячейке на "Текст из примера API".

ChangeTextInCell(args[0], args[1]);

Далее представлен полный пример кода.

// Change the text in a table in a word processing document.
static void ChangeTextInCell(string filePath, string txt)
{
    // Use the file name and path passed in as an argument to 
    // open an existing document.
    using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
    {
        if (doc.MainDocumentPart is null || doc.MainDocumentPart.Document.Body is null)
        {
            throw new ArgumentNullException("MainDocumentPart and/or Body is null.");
        }

        // Find the first table in the document.
        Table table = doc.MainDocumentPart.Document.Body.Elements<Table>().First();

        // Find the second row in the table.
        TableRow row = table.Elements<TableRow>().ElementAt(1);

        // Find the third cell in the row.
        TableCell cell = row.Elements<TableCell>().ElementAt(2);
        // Find the first paragraph in the table cell.
        Paragraph p = cell.Elements<Paragraph>().First();

        // Find the first run in the paragraph.
        Run r = p.Elements<Run>().First();

        // Set the text for the run.
        Text t = r.Elements<Text>().First();
        t.Text = txt;
    }
}

См. также

Справочник по библиотеке классов пакета SDK Open XML

Как изменить текст в таблице документа Word

LINQ

Методы расширения (руководство по программированию на C#)

Методы расширения (Visual Basic)