Можно ли добавить некоторые данные в документ Word? - PullRequest
2 голосов
/ 22 июня 2010

Можно ли добавить (через объектную модель MS Word или путем редактирования файла) некоторые пользовательские данные (может быть, другой файл?)

Будут ли эти данные сохранены после открытия, изменения и сохранения документа в MSWord?

(мне нужно поместить некоторые данные отслеживания в docx во время экспорта некоторых отчетов, пользовательские данные снова будут использоваться при импорте)

Ответы [ 5 ]

7 голосов
/ 27 июня 2010

Да. Это довольно просто, но, насколько я знаю, не задокументировано (вообще или очень хорошо). Скажем, вы хотите добавить файл .ini в ваш документ Office (.docx, .xslx, .pptx), чтобы «переносить» его вместе с документом (т.е. вы отправляете свой .docx *). 1004 * кому-то по электронной почте и хотите, чтобы ваш файл .ini , который вы добавили, оставался с yourdoc .docx , даже если человек, открывающий DOCX, вносит некоторые изменения, а затем сохраняет их и отправляет обратно вам.

  1. Переименуйте расширение вашего документа в .zip . Распакуйте его.
  2. В корневой папке найдите [Content_Types] .xml файл и откройте его.
  3. Прямо под корнем <Type/> элемент, добавьте <Default Extension="ini" ContentType="custom/ini"/> (примечание - для другого файла, просто убедитесь, что расширение соответствует файлу, который вы собираюсь добавить и атрибут Extention соответствует этому. Для ContentType атрибут, который может быть вообще ничего).
  4. Теперь добавьте ваш имя файла .ini файл в пакет. Вы можете добавить его где угодно - корень, путь / word , новый папка типа / word / MyIniFiles .
  5. Далее установите связь между Ваш файл и документ. если ты нет, файл не будет нести с документ. Перейдите к \ word_rels \ document.xml.rels file, и добавить под <Relationships/> что-то вроде <Relationship Id="rd1" Type="http://schemas.microsoft.com/office/2007/relationships/ini" Target="abcpy.ini" /> где атрибут Id - это уникальное имя в вашем Type (лучше всего использовать rID X или что-то подобное), Type отражает URI (из почти все) и Target относительный путь к файлу, который вы добавлено. Я добавил abcpy.ini в / word папка, которая находится в том же root как document.xml , так что мой Относительный путь - это просто имя файла. Если бы я добавил его в папку под / слово , которое называлось myIniFiles , Target будет myIniFiles / abcpy.ini
  6. Сохраните все. Распакуйте ваш файл из корня и назовите документ обратно к вашему первоначальному имени и расширение обратно до .docx . Копировать / вставить поверх оригинального файла. Готово.

Если у вас есть редактор пакетов Open XML (входит в состав VSTO Power Tools для VS2008 или недавно выпущенный автономный для VS 2010), вы можете использовать VS для выполнения некоторых эта работа для вас, но по сути это то же самое. Другая терминология, например, Target равно Name и т. Д.

Обратите внимание, что это не какой-то хак. Сами Microsoft использует эту же технику в Office 2010 для изображений, измененных с помощью новых «художественных эффектов» - исходный файл изображения переносится в тип HDPhoto , а измененные изображения сохраняются в формате png или jpg (и это те, которые отображаются в клиенте). HD-фото (с расширением .wdp) перемещается вместе с документом, но фактически никогда не используется при отображении в Word, PowerPoint и т. Д.

3 голосов
/ 26 июня 2010

Да, это возможно. Word имеет функцию, которая позволяет встраивать произвольный документ XML в документ Word. Эта функция называется Пользовательский XML .

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

Обратите внимание, что Word требует, чтобы внедренный контент был XML, но это не ограничивает вас чисто XML-данными, поскольку вы можете использовать кодировку base64 для встраивания двоичного контента в XML.

В MSDN есть пример на C #, показывающий, как добавить пользовательскую часть XML в файл .docx:

Как: добавить пользовательские части XML в документы без запуска Microsoft Office

2 голосов
/ 29 октября 2013

Спасибо за все ответы.Я использовал пользовательские свойства для добавления некоторых данных UserID в сгенерированные документы, достаточно «проследить» документ и иметь возможность импортировать его позже.

2 голосов
/ 24 июля 2010

Для полноты можно также использовать поле DocVariable .На самом деле это закладка, аналогичная свойствам документа, но более открытая, по крайней мере, для именования.Это лучше всего для относительно небольших кусочков информации.Если вы хотите добавить полный файл, другие методы могут быть лучше.

См .:

Что такое DOCVARIABLE в слове

1 голос
/ 22 июня 2010

Нет, если вы добавите что-либо в этот zip-файл, Word начнет жаловаться на повреждение файла. Но не изобретай велосипед. Документы Word могут иметь несколько различных свойств документа. Просто используйте это. http://office.microsoft.com/en-gb/word-help/add-property-information-to-a-document-HA010163766.aspx

...