Изменить текст в таблице в текстовом редакторе
В этом разделе показано, как использовать пакет 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