Повторное использование бизнес-логики с помощью PHPExcel

Во многих компаниях принято размещать бизнес-логику в файле Excel. Её создают аналитики и пользователи, которые хотят автоматизировать хотя бы часть их работы с Excel. Эта же бизнес-логика в Excel зачастую дублируется в приложении (на сайте) и ее надо поддерживать уже сразу в двух местах: в фале Excel и на сайте. Тут есть неплохой выход - использовать PHPExcel для выполнения скриптов из Excel-файла, без дублирования их в коде сайта.

Итак, сценарий: вы работаете в компании, которая продает "автомобили мечты". Для каждой модели, компания создает лист в Excel, который использует для расчета стоимости автомобиля, в зависимости от предпочтений покупателя. Эти листы обновляются достаточно часто, отражая цены изготовителя деталей.

Ваш менеджер просит вас создать небольшой сайт, на котором можно ввести параметры автомобиля (Автоматическая коробка передач или нет? Цвет машины? Кожаные сиденья? Спортивная подвеска? и т.д.) На основе ответов на эти вопросы вычисляется цена автомобиля. И цены на сайте должны быть синхронизированы с листом Excel!

Скачать исходный код примера

Демо

1. Создаем файл Excel содержащий бизнес-логику

Во-первых создадим табличку Excel, содержащую бизнес-логику. Если вам лень - скачайте мою, к примеру. Чтобы облегчить себе написание скриптов, присвойте ячейкам, используемым для ввода и вывода данных, уникальные имена. Конечно можно работать и с координатами ячеек, но если вы потом захотите изменить положение ячеек, их имена придутся очень к стати!

2. Скачиваем последнюю версию PHPExcel

Вы можете скачать PHPExcel с сайта phpexcsel.net. Если вам нужна стабильная версия - качайте официальный релиз. Из Subversion можно получить последнюю текущую сборку.

3. Создаем пользовательский интерфейс.

Следующий шаг - создать страницу на которой можно ввести все параметры, которыми будет заполнен файл Excel.

4. Немного PHP!

Теперь то, ради чего все делалось! Загружаем файл Excel, передаем ему наши параметры и полученный результат отображаем на странице. Итак, подключаем нужные классы:

  1. set_include_path(get_include_path() . PATH_SEPARATOR . './PHPExcel/Classes/');
  2. // подключаем нужные классы
  3. require_once('PHPExcel.php');
  4. require_once('PHPExcel/Reader/Excel2007.php');

Т.е. сама библиотека PHPExcel и класс для чтения формата Excel2007.

Теперь загрузим файл Excel в объект PHPExcel:

  1. $objReader = new PHPExcel_Reader_Excel2007();
  2. $objPHPExcel = $objReader->load("price_calculation.xlsx");

Получаем все данные переданные пользователем через массив $_REQUEST. И передаем их в таблицу. Я назвал поля в файле и в форме одинаково, что довольно удобно:

  1. // устанавливаем активную страницу
  2. $objPHPExcel->setActiveSheetIndex(0);
  3. // присваиваем значения
  4. $objPHPExcel->getActiveSheet()->setCellValue('automaticTransmission', $_REQUEST['automaticTransmission']);
  5. $objPHPExcel->getActiveSheet()->setCellValue('carColor', $_REQUEST['carColor']);
  6. $objPHPExcel->getActiveSheet()->setCellValue('leatherSeats', $_REQUEST['leatherSeats']);
  7. $objPHPExcel->getActiveSheet()->setCellValue('sportsSeats', $_REQUEST['sportsSeats']);

Вот и все, теперь надо только извлечь результат вычислений.

  1. // выполняем вычисления
  2. $_VIEWDATA['totalPrice'] = $objPHPExcel->getActiveSheet()->getCell('totalPrice')->getCalculatedValue();
  3. $_VIEWDATA['discount'] = $objPHPExcel->getActiveSheet()->getCell('discount')->getCalculatedValue();
  4. $_VIEWDATA['grandTotal'] = $objPHPExcel->getActiveSheet()->getCell('grandTotal')->getCalculatedValue();

Мы можем использовать эти значения для вывода на странице:

На основе введенных вами данных, цена автомобиля:

  1. <?php echo number_format($_VIEWDATA['grandTotal'], 2); ?> EUR.

5. Итоги

В использовании внедренной в Excel бизнес-логики нет ничего сложного. Библиотека PHPExcel поможет вам в разработке: в результате логика приложения и бизнес-логика разделены. Бизнес-логику могут менять аналитики или пользователи в Excel. А разработчику нужно только закинуть файл на сервер.

2 Responses to Повторное использование бизнес-логики с помощью PHPExcel

  1. gravatar

    Отличный пост. Давно хотел узнать, возможно ли такое. Спасибо!

  2. gravatar

    А как быть, если надо допустим несколько строк вставить? Я что-то не нашел как в phpexcel это делается.

Leave a Reply