Пользователь
0,0
рейтинг
1 апреля 2015 в 12:15

Разработка → Генератор документов docx и xlsx из песочницы

image

Год назад ко мне в очередной раз обратился постоянный заказчик. «Менеджеры — идиоты, — негодовал он. — Текучка кадров огромная, на обучение каждого уходят месяцы. А потом они делают ошибки».

Лишь после такой эмоциональной прелюдии последовало задание: «Необходимо, чтоб при заказе с сайта на почту приходил уже сформированный пакет документов в форматах MS Office: бланк заказа, счет к оплате, товарный чек, и спецификация».

Задача сама по себе близка к статье «PHP + Word». Но сервис LiveDocx нам не подошел. Во-первых, предполагалось, что большая часть документов должна быть в Excel. Во-вторых, оплата «на Запад» из России была и есть проблематичной. В-третьих, у заказчика была масса идей и хотелок, которые этот, или подобный сервис вряд ли реализовал бы. Например, сложную таблицу, с разбивкой товаров на категории.

Так как сайтов у заказчика несколько, решено было строить отдельную систему — свой собственный сервис генерации документов, к которому сайты обращались бы в момент заказа.

В основу будущего кода легли идеи из той же, приведенной выше, хабростатьи, а так же публикация «Разбираем xlsx в PHP без готовых библиотек».

В итоге за месяц работы «генератор документов» был создан и запущен.

Что он умеет:

  • генерировать по шаблону документ docx путем прямой замены шаблонного тега на данные;
  • то же самое делать с шаблонами в формате xlsx;
  • расширять таблицы в xlsx и заполнять их входящими данными из массива;
  • вставлять подзаголовки, разбивая таблицу на группы;
  • вставлять ссылки — единичные, или как содержимое таблицы;


Что генератор на данный момент не умеет:

  • работать с разными типами данных — все ячейки заполняются как строки. По этой причине невозможно использование формул excel в шаблоне, которые оперировали бы введенными данными;
  • вставлять изображения;
  • менять форматирование — оно полностью определяется в шаблоне.

В таком виде он проработал вот уже скоро год. Проблемы за этот период возникали в основном только с клиентской частью — со стороны магазина. Хотя, это не значит, что скрипт «генератора» идеален. На сегодняшний день он обкатан только в одной реальной задаче.

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

Сегодня я получила разрешение от заказчика выложить проект на Гитхабе и опубликовать эту статью, чем спешу воспользоваться.

Проверить работу скрипта можно на демо-примере.

Исходный код доступен в репозитории.
@floppox
карма
7,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (28)

  • +4
    Полезная наработка!

    Сможете отделить библиотеку генерации документа от сайта (index.php) и завернуть её в composer пакет?
    • 0
      На гитхабе лежит как раз отдельно только то, что связано с генерацией. Пока ничего, кроме исправления возможных багов, делать не планирую.
  • +1
    Так же писал в свое время подобный генератор отчетов в xlsx и так же оформление и прочее были зашиты в шаблон, но потом узнал про xslt и все встало на свои места. Теперь, код отдельно, оформление отдельно и в любой момент можно поправить шаблон. Чего и Вам желаю.
    • +1
      Зависит от задачи. В моем случае, например, трудно заставить клиентов осваивать xslt или платить за постоянную корректировку шаблонов по их хотелкам.
  • +2
    Давно, когда надо было написать подобную вещь…
    Я формировал документ в формате xml с тегами и заголовками (как их сохранял Excel), а потом при скачивании кидал в header соответствующий content-type (application/vnd.ms-excel) и все.
    Это позволяло не мучиться с внутренней структурой xlsx файла
  • 0
    нисколько не критикую, просто интересуюсь — а Google Spreadsheet/Document не рассматривались в качестве альтернативы? Хоть многие excel фичи там отсутствуют, но благодаря google apps script есть очень широкие возможности автоматизации. Генерацию по шаблону там можно сделать за считанные часы (с нуля, достаточно знать javascript). Если конечно, речь не идёт о сотнях документов в день (т.к. есть квоты и ограничения)
    • 0
      Был реальный заказчик. Ему нужна была реализация именно в том виде, как есть. Гуглдокс как раз в первую очередь был предложен, но у фирмы уже был налаженный документооборот, и требовалось вписаться в существующую систему.
  • 0
    А почему вы не использовали phoExcel какой-нибудь?
  • 0
    Среди разных вариантов ответа, рискну остановиться на следующем: чтоб получить инвайт на хабр. Можно так?
    На самом деле, конечно, мысли об этом 13 месяцев назад не было, были другие, которые уже сложно вспомнить так, чтоб не соврать.
  • 0
    А в генераторе docx можно вставлять новые строки в таблицы?
    • 0
      На данный момент нет.
    • 0
      это делается очень просто. Там практически html
  • 0
    как реализована подстановка переменных в документе? как обрамлять переменные?
    • 0
      Как обрамлять переменные.

      На счет реализации, я не уверенна, что поняла ваш вопрос на 100% правильно. Каждый вид переменных обрабатывается разным способом. Одиночные — прямой заменой всех вхождений на значение, табличные — создаются новые ячейки, по количеству входящих элементов, и уже в них производится замена на значения из массива.
      • 0
        переменные имею ввиду типа %firm_name% вставленные в шаблон docx, которые потом заменяются на значения. Причем вставленны именно в ворде не в xml. Как у вас это работает?
        • 0
          Простой заменой
          • 0
            но в xml переменные могут не храниться в строчку. Если вы ошибетесь в написани переменной и исправите ошибку, она будет разбита тегом history и обычной заменой в xml уже не прокатит.
            • 0
              Эта проблема решается с помощью регулярных выражений.
              github.com/floppox/f-document/blob/master/generator/docx_processor.class.php
              Функция search_filds()
              • 0
                В моём случае я решал это покороче, сначала грохал все теги между требуемыми ключевыми символами регуляркой, а после — обычной заменой.
                • 0
                  Перестановка мест слагаемых. Хотя, возможно, имеет смысл для оптимизации, но это не очевидно — нужны экперименты. Ну а мой выбор обоснован тем, что такой подход показался более контролируемым, чем «грохать все регуляркой».
  • 0
    Спасибо, сейчас буду пробовать (два дня потратил на поиск решения для server-side editing документов openoffice и все безрезультатно)
  • 0
    Эх, автор, что же вы даже строчки документации не написали?
    • 0
      Зачем вы преобразуете к объектам то, что по-определению является ассоциативными массивами? В рез-те себе же создаете проблемы, генеря десятки ошибок, или вы программируете в режиме сокрытия NOTICE? И зачем вы используете табы?
      • 0
        Спасибо за ваше мнение. Постараюсь учесть. Но чем табы не угодили?
        • 0
          А никогда не получается не «соскочить» на пробелы. В том числе и в вашем коде это встречается.
    • 0
      Нет резона далее вкладывать сюда время, к сожалению.
      • 0
        Нет резона потратить 15 минут своего времени, но пусть другие тратят часы, чтобы просто понять, как ваше изделие работает. Отличная логика.
        • 0
          Ну конечно, именно 15 минут пишется понятная документация, ни минутой больше.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.