Доступ к таблице по имени в Word с помощью C#

У меня есть документ, содержащий множество таблиц. Я хочу изменить эти таблицы с помощью C# и Microsoft.Office.Interop.Word. Я прочитал, что могу перебирать все таблицы, используя интерфейс таблиц.

Вопрос: можно ли дать таблице имя / идентификатор и получить доступ к таблице по ее имени? (как с формами в автоматизации Powerpoint).

Вопрос 2: Если это невозможно с Microsoft.Office.Interop.Word, предлагают ли альтернативы, такие как Aspose Words, более удобный способ?

2 ответа

Решение

Можно ли дать таблице имя / идентификатор и получить доступ к таблице по ее имени?

Объект Table предлагает свойство ID, однако это только документы, сохраненные в виде веб-страницы. Я предполагаю, что это не то, что вы хотите.

Это все еще возможно, однако это не обеспечивается API; вам нужно создать эту функцию самостоятельно. Есть два способа:

Первый: используя Interop, вы можете получить хеш-код таблицы, который (будем надеяться) возвращает уникальный идентификатор. Например:

Word.Application wordApp = new Word.Application();
Word.Document wordDoc = wordApp.Documents.Open(@"C:\Users\username\Documents\HasTables.docx");
var tableID = wordDoc.Tables[1].GetHashCode();

Тщательное решение может заключаться в том, чтобы хранить идентификаторы всех таблиц в документе в Словаре или другом типе коллекции, в котором есть карта пар ключ / значение. Теперь обратите внимание, что эти идентификаторы не сохраняются в сеансах Word... поэтому, если вам нужно будет идентифицировать таблицу за пределами того же сеанса, вам потребуется другой метод.

Два: Используя OpenXML (для формата.docx) и / или WordML (для Word 2003 XML, если вы не можете просто обновить документ до.docx), создайте свой собственный атрибут Id или Name для каждого элемента w: tbl. Вы можете устранить неоднозначность, используя свое собственное пространство имен. Это также будет сохраняться в течение сеансов Word. Это другой мир, чем Interop, но, на мой взгляд, это гораздо лучший маршрут (Производительность, доступная документация).

Если это невозможно с Microsoft.Office.Interop.Word, предлагают ли альтернативы, такие как Aspose Words, более удобный способ?

Нет, Aspose не предлагает ничего подобного в своих объектах TableCollection или Table.

В Word 2010 было добавлено новое свойство таблицы под названием Descr, которое предназначено для описания таблицы, но также может использоваться в качестве поля имени. Вам по-прежнему нужно просмотреть коллекцию таблиц, чтобы найти нужную, но это дает вам возможность пометить таблицу чем-то, что сохраняется после сохранения и повторного открытия таблицы.

Другие вопросы по тегам