Как вставить условные пробелы в docx с помощью opentbs (только если определенные поля не являются пустыми)
Я использую opentbs для создания отчетов в формате .docx из данных, введенных пользователями в форму, и хотел бы иметь возможность условно добавлять пробелы между полями. Вот пример парадигмы проблемы: пользователь должен ввести адрес улицы (адрес1), но поля непосредственно перед и после поля адреса (бизнес и адрес2 соответственно) являются необязательными. Есть ли способ настроить поля слияния в шаблоне так, чтобы, если пользователь что-то вкладывает в бизнес поле, документ, полученный в результате слияния, будет иметь значение бизнес-поля, за которым следует пробел, но если пользователь оставит поле пустым, в документе, полученном в результате слияния, не будет ни поля, ни пробела? Я вижу два возможных способа достижения этой цели: 1. использование отдельного поля слияния, которое печатает пробел, только если поле "бизнес" не является пустым; или 2. использование поля слияния в шаблоне, которое печатает как значение поля, так и пробел, но только если поле не пустой.
Вот мой psuedocode для этих двух решений: 1. [onshow.business][onshow;если [бизнес]!=пустой; тогда "';иначе"][onshow.адрес1] 2. [onshow.бизнес И ''][onshow.адрес1]
Похоже, что это должно быть возможно, и все же я не смог найти способ превратить любой псевдокод в реальные, функционирующие поля слияния в моем docx. шаблон. Я просмотрел все записи на этом форуме и на форуме tbs, а также документацию, но проблема не решена прямо был поднят, и то, что я пробовал, не сработало. Любая помощь будет очень признательна.
3 answers
Это вставит неразрывный пробел после значения business
, если это не так ''
:
[onshow.business; if [val] != ''; then [val] ]
Проблема, с которой вы можете столкнуться, заключается в том, как слово представляет пробел... Я бы предложил начать с вставки менее проблемного символа, чтобы убедиться, что ваш тег работает правильно (например, ^
или и a
, возможно), а затем поработать над поиском правильной комбинации символов/параметров, чтобы пространство работало.
Когда вы начнете смотреть на это, я бы попробовал \s
: http://www.tinybutstrong.com/forum.php?thr=3234
Тогда я бы посмотрел на xml:space="preserve"
: http://www.tinybutstrong.com/forum.php?thr=3263
Похоже, что это отображается на теге <w:t>
вот так: <w:t xml:space="preserve">
так что вы можете попробовать что-то вроде:
PHP:
$f = 'preserve';
ШАБЛОН:
[onshow.business; if [val] != ''; then '[val] ';][onshow.p;att='xml:space']
Вероятно, есть лучший способ справиться с att
, но это должно помочь вам, по крайней мере, начать.
На всякий случай, если кому-то это нужно, вот что я собрал для своего документа, основываясь на ответах Сары и Skrol29:
PHP:
никаких изменений
ШАБЛОН:
[onshow.firstName] [onshow.lastName],[onshow.businessName; if [val] != '; then ' [val],'] [onshow.address1][onshow.address2; if [val] != '' then ' [val]'], [onshow.city], [onshow.state] [onshow.zip]; [onshow.phone]; [onshow.email]
ОБЪЕДИНЕННЫЙ DOCX: С именем компании и адресом 2, оставленными пустыми:
Joe Bloggs, 123 Main Street, Los Angeles, CA 90066; 310-555-1212; [email protected]
С заполненным именем компании, но адресом 2, оставленным пустым:
Joe Bloggs, Smith Co., 123 Main Street, Los Angeles, CA 90066; 310-555-1212; [email protected]
С именем организации, оставленным пустым, но заполненным адресом 2:
Joe Bloggs, 123 Main Street Suite 42, Los Angeles, CA 90066; 310-555-1212; [email protected]
С обоими:
Joe Bloggs, Smith Co., 123 Main Street Suite 42, Los Angeles, CA 90066; 310-555-1212; [email protected]
Два следующих решения предполагают, что [onshow.business]
и [onshow.adress1]
находятся в одном и том же абзаце Ms Word.
Вы должны:
1) было пространство после поля [onshow.business]
, которое имеет формат текста, отличный от поля. Например, вы можете просто увеличить на единицу сторону шрифта символа пробела.
Примечание: Ms Word разбивает текст на несколько фрагментов в зависимости от формата, применяемого к тексту. Каждый фрагмент определяется в своем собственном элементе <w:r>
.
2) Затем добавьте параметр магнит на поле [onshow.business]
для того, чтобы удалить пространство с ним, когда поле пустое.
Пример:
Hello [onload.business;magnet=w:r+w:r] [onload.address1]
Тот же пример с |
, показывающим разделители фрагментов:
Hello |[onload.business;magnet=w:r+w:r]| |[onload.address1]
Обратите внимание, что поле [onshow.business]
должно быть в отдельном фрагменте текста перед ним, в противном случае оно удалит текст перед тем, как таким же образом удалить пробел.