Почему Office OpenXML разделяет текст между тегами и как этого избежать?

В настоящее время я пытаюсь работать с файлами docx, используя библиотеку PHPWord и ее систему шаблонов. Я нашел и обновил чей-то (не помню имя, но это не важно) путь к этой библиотеке, которая может работать с таблицами (реплицировать ее строки, а затем использовать стандартную функцию setValue() из PHPWord для каждой строки).

Если я создаю свой собственный документ, данные в xml имеют нормальную структуру, поэтому заменяемая переменная ${variable} находится в собственном теге, например:

<w:tbl>
    <w:tr>
        ...
         ${variable}
    </w:tr>
</w:tbl>

Я упростил код, в реальном коде есть ряд других тегов, описывающих размеры, стили и т. д.

Моя проблема в том, что мне приходится обрабатывать документы от других людей, где мне запрещено вносить большие изменения, я получаю документ, где в какой-то момент это таблица с одной пустой строкой. Я добавляю переменные ${variable} и запускаю их через PHPWord. Проблема в том, что он терпит неудачу. Проведя небольшое исследование, я обнаружил, что исходный XML выглядит так:

    ....
        ...
         ${va

        ...
         riab

        ...
         le}
    ....

(опять же сильно упрощено, но вы поняли)

Эта структура является проблемой для меня, потому что функция клонирования строк использует для работы strpos(), substr() и регулярные выражения и не работает с этой структурой (и я не могу представить себе элегантный способ сделать это так).

Итак, вопрос: кто-нибудь знает, почему docx это делает и как его предотвратить? Я ищу решение через слово, а не PHP (мне нужны текущие функции, чтобы они работали без особого редактирования)


person j0hny    schedule 17.07.2013    source источник


Ответы (2)


Я много работал с этой проблемой:

Словом, документ можно сохранить так

  <w:t>{</w:t>...
  <w:t>variable</w:t>
  <w:t>}</w:t>

Поэтому я создал библиотеку JS, которая работает, даже если имена переменных разделены: Docxtemplater ( работает и на стороне сервера). Во время разработки я обнаружил, что имена переменных не разбиваются, если:

  • Текст для поиска состоит только из символов a-zA-Z (без {, $ или })
  • Текст может быть разделен, если текст не был написан одним штрихом: например, если вы допустили орфографическую ошибку и написали ${переменная} , а затем внесли правку -> ${переменная}, текст внутри xml будет весьма вероятно, что они будут разделены. По сути, вам нужно написать имена переменных одним махом, и если вы хотите отредактировать их, полностью перепишите имя переменной.

Я не думаю, что есть способ исправить документ docx с помощью одной команды в Word, но переписывание переменных, чтобы записать их в один ход, должно работать.

person edi9999    schedule 18.07.2013
comment
Отлично, это работает. Это точно так, как вы сказали. Сначала я написал ${tab1_var#1}, а затем переписал его на ${tab1_var1}. Никогда бы не подумал, что это будет проблемой. Большое спасибо, чувак, ты избавил меня от многих проблем. (обязательно загляну и в вашу библиотеку) - person j0hny; 18.07.2013

Основной причиной этого является элемент proofErr. При этом Word идентифицирует то, что считает написанным неправильно, и заключает его в элемент <w:proofErr>, неизбежно разделяя исходный текст.

Если это произойдет с вами, я рекомендую следующий, утомительный, но единственный верный способ:

  1. Переименуйте .docx в .zip.
  2. Извлечь содержимое архива.
  3. Откройте word\document.xml.
  4. Внесите исправления (т.е. соедините разделенный текст) и сохраните.
  5. Переименуйте .zip в .docx.

РЕДАКТИРОВАТЬ

Это расширение Visual Studio позволяет напрямую редактировать содержимое пакета OpenXML. Это позволяет пропустить шаги 1 и 2.

person pim    schedule 17.07.2018
comment
Я подозреваю, что отключение проверки также может сработать, но я не пробовал. - person pim; 17.07.2018