За последние 24 часа нас посетили 30699 программистов и 1479 роботов. Сейчас ищут 865 программистов ...

Замена в DOCX средствами PHP

Тема в разделе "PHP для профи", создана пользователем NerdRage, 28 дек 2016.

  1. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Нужно сделать замену одной строки в DOCX-документе. Например, __test_value__ на "тестовое значение". Как это проще реализовать?

    Я почитал про DOCX, понял что это архив с XML. И вроде бы, текст самого документа всегда лежит в файлике "word/document.xml". Вроде бы. Думаю вот теперь, может проще сделать так?
    1. Разорхивировать
    2. file_get_contents
    3. str_replace
    4. file_put_contents
    5. Заархивировать всё обратно
    Или тут могут быть подводные камни из-за которых документ потом просто не откроется?
     
    #1 NerdRage, 28 дек 2016
    Последнее редактирование: 28 дек 2016
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Вот попробуй и расскажи.
    --- Добавлено ---
    А с нас лайки
     
  3. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Ну вот ссыкотно. Было бы неплохо услышать мнение кого-то, кто уже бился лбом об это.
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Всё нормально, делай.
     
  5. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Короче это работает, но нельзя использовать никакие символы в переменных. Я сначала хотел сделать как-нибудь так: %SimpleValue% или [[SimpleValue]]. Но в XML эти символы пропадают, непонятно куда. Пробовал также нижнее подчёркивание, типа rrrSimple_Value - в итоге фраза разбивается:

    [​IMG]

    Так что придётся использовать CamelCase и какой-нибудь буквенный префикс одинаковый для всех переменных. А вот после вставки спец.символов в XML и зипования в DOCX, Word 2013 открыл этот файл без ошибок и корректно отобразил всю }[_@#!.

    Ссыкотно всё-таки. Ссыкотно из-за того, что Word может разбить твоё ключевое слово при сохранении, и пока не факт что слитные слова не будут разбиваться. Это будет ясно после откатке на тыще файлах через пару месяцев.
     
    #5 NerdRage, 28 дек 2016
    Последнее редактирование: 28 дек 2016
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я делал именно так. столкнулся с одной откровенной хуетой, про которую расскажу потом. или [vs] может быть отпишется раньше меня, т.к. он с ней тоже потрахался. Пусть это будет сюрприз.

    плейсхолдеры я вроде юзал на фигурных скобках.
     
    denis01 нравится это.
  7. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Отличный у вас форум, ребят. Пусть будет сюрприз, чтобы другой человек потрахался, а мы потом поржем. Может вы тут ещё и спойлеры из Игры Престолов постите и читы для CS раздаёте?
     
  8. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Всех убьют.
     
  9. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    Ну тут есть шайка пидерастов, да. Я не из их числа, но они есть, это факт. Даже среди модеров.

    Спорное утверждение. Последним достижением был апдейт форума. Nuff said.
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Педераст пишется через е.
     
  11. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    а как же интрига?
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @NerdRage, используй встроенные средства работы с xml.
    Вот тебе отличная статья
     
  13. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    Вот я и вступил в какашку. Я не могу генерировать строки таблиц, а у меня тут есть таблица где их разное количество. Пока вставил в воблу на место строк текст "заполняется вручную" и ссылку на php-скрипт, где эта таблица генерируется и выводится.
     
  14. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    почему? может надо сравнить два файла, в котором разные таблицы и выяснить по какому принципу их надо добавлять
     
  15. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Если юзать эксель, то задача резко упрощается с помощью PHPExcel, ну и +четкая адресация по ячейке.
     
  17. NerdRage

    NerdRage Активный пользователь

    С нами с:
    6 июл 2016
    Сообщения:
    439
    Симпатии:
    42
    [vs], да есть и PHPWord, но я с ней не разобрался, мудрёная штука. Работу надо было сделать по быстрому, к 4 числу. PHPWord умеет добавлять таблицы (сцылко), но я не понял как вообще открыть какой-то файл для изменения.
    --- Добавлено ---
    Хотя, что-то нагуглилось. Походу loadTemplate это то что мне надо. Надо будет перевести всё на PHPWord и разобраться с таблицами.
     
  18. applicab

    applicab Активный пользователь

    С нами с:
    14 июл 2014
    Сообщения:
    73
    Симпатии:
    18
    скорее всего да и вот эта функция потом может помочь https://github.com/PHPOffice/PHPWor...ef6d49bf96f453c/src/PhpWord/Template.php#L131