Как создать файл Word с php в Symfony 3

Многие приложения PHP требуют экспорта документов в форматы Microsoft Word, эта задача может быть легко решена с помощью PHPWord. PHPWord — это библиотека, написанная на чистом PHP, которая предоставляет набор классов для записи и чтения из различных форматов файлов документов. Текущая версия PHPWord поддерживает Microsoft Office Open XML (OOXML или OpenXML), ОАЗИС Открытый формат документа для офисных приложений (OpenDocument или ODF), Rich Text Format (RTF), HTML и PDF. PHPWord — проект с открытым исходным кодом, лицензированный на условиях LGPL версия 3. PHPWord стремится быть высококачественным программным продуктом, объединяя непрерывная интеграция а также модульное тестирование. Вы можете узнать больше о PHPWord, прочитав Документация для разработчиков и Документация по API.

С PHPWord вы можете создавать красивые документы Word и PDF с нуля. Создавайте шаблоны и редактируйте только некоторые переменные, чтобы упростить создание текстовых документов. В этой статье вы узнаете, как реализовать PHPWord в проекте Symfony 3.

Требования

Для создания файлов Word с PHP, как уже упоминалось ранее, мы собираемся зависит от библиотеки PHPWord. Чтобы установить эту библиотеку в качестве зависимости в вашем проекте Symfony, выполните следующую команду в терминале:

composer install phpoffice/phpword

Или измените composer.json файл вашего проекта и добавьте библиотеку вручную, а затем выполните composer install:

{
"require": {
"phpoffice/phpword": "v0.13.*"
}
}

После загрузки ваш проект должен иметь PhpWord, доступный для его использования. Если вы хотите больше информации об этой библиотеке, пожалуйста, посетите официальный Github хранилище.

Примеры

В этой статье мы расскажем о 4 наиболее часто используемых функциях разработчиков при работе с PHPWord. Если вам нужно больше примеров, мы рекомендуем вам проверить все примеры PHPWord здесь (хотя они не основаны на Symfony, я уверен, что вы поймете, как их использовать).

Заметка

В примерах мы используем средство записи Word2007 (файл OOXML) для повышения совместимости нашего документа. Кроме того, в качестве хорошей практики в Symfony вы, возможно, захотите сохранить свой контроллер настолько тонким, насколько это возможно, поэтому мы рекомендуем вам создавать службы

1. Потоковый динамически сгенерированный файл

К сожалению, автор Phpword не предоставляет никакого метода для потоковой передачи документа, кроме того, если бы он существовал, он не был бы полезен, так как мы работаем с Symfony. Чтобы вернуть сгенерированный файл в качестве ответа, вам необходимо создать его и затем отправить его с помощью класса BinaryFileResponse, однако мы не позаботимся о создании файла где-то на вашем сервере и затем удалим его. Чтобы сделать это легко, вы можете создать временный файл в системе, используя tempnam(sys_get_temp_dir(), "filename.extension"),

Следующий контроллер создает файл слова, и он сразу же возвращается в качестве вложения:

addSection();
// Adding Text element to the Section having font styled by default...
$section->addText(
'"Learn from yesterday, live for today, hope for tomorrow. '
. 'The important thing is not to stop questioning." '
. '(Albert Einstein)'
);
// Saving the document as OOXML file...
$objWriter = IOFactory::createWriter($phpWord, 'Word2007');
// Create a temporal file in the system
$fileName = 'hello_world_download_file.docx';
$temp_file = tempnam(sys_get_temp_dir(), $fileName);
// Write in the temporal filepath
$objWriter->save($temp_file);
// Send the temporal file as response (as an attachment)
$response = new BinaryFileResponse($temp_file);
$response->setContentDisposition(
ResponseHeaderBag::DISPOSITION_ATTACHMENT,
$fileName
);
return $response;
}
}

2. Сохраните файл на сервере

По умолчанию вы можете написать сгенерированный файл слова в локальном пути, используя save метод писателя и предоставление пути назначения с именем файла в качестве первого аргумента:

addSection();
// Adding Text element to the Section having font styled by default...
$section->addText(
'"Learn from yesterday, live for today, hope for tomorrow. '
. 'The important thing is not to stop questioning." '
. '(Albert Einstein)'
);
// Saving the document as OOXML file...
$objWriter = IOFactory::createWriter($phpWord, 'Word2007');
$filePath = 'hello_world_serverfile.docx';
// Write file into path
$objWriter->save($filePath);
return new Response("File succesfully written at $filePath");
}
}

3. Вставка изображения в текстовый документ

Чтобы добавить изображение, вы можете использовать addImage метод, доступный в классе PhpWord:

Заметка

В примере мы используем следующее демонстрационное изображение (earth.jpg) доступно в официальном репозитории для тестовых целей.

get('kernel')->getRootDir() . '/../web/images/';
$_local_image_path = $imagesFolder.'earth.jpg';
// Begin code
$section = $phpWord->addSection();
$section->addText('Local image without any styles:');
$section->addImage($_local_image_path);
$section->addTextBreak(2);
$section->addText('Local image with styles:');
$section->addImage($_local_image_path, array('width' => 210, 'height' => 210, 'alignment' => Jc::CENTER));
$section->addTextBreak(2);
// 1) Add a remote image
$source = 'http://php.net/images/logos/php-med-trans-light.gif';
$section->addText("Remote image from: {$source}");
$section->addImage($source);
// Wrapping style
$text = str_repeat('Hello World! ', 15);
$wrappingStyles = array('inline', 'behind', 'infront', 'square', 'tight');
foreach ($wrappingStyles as $wrappingStyle) {
$section->addTextBreak(5);
$section->addText("Wrapping style {$wrappingStyle}");
$section->addImage(
$_local_image_path,
array(
'positioning'   => 'relative',
'marginTop'     => -1,
'marginLeft'    => 1,
'width'         => 80,
'height'        => 80,
'wrappingStyle' => $wrappingStyle,
)
);
$section->addText($text);
}
//Absolute positioning
$section->addTextBreak(3);
$section->addText('Absolute positioning: see top right corner of page');
$section->addImage(
$_local_image_path,
array(
'width'            => Converter::cmToPixel(3),
'height'           => Converter::cmToPixel(3),
'positioning'      => Image::POSITION_ABSOLUTE,
'posHorizontal'    => Image::POSITION_HORIZONTAL_RIGHT,
'posHorizontalRel' => Image::POSITION_RELATIVE_TO_PAGE,
'posVerticalRel'   => Image::POSITION_RELATIVE_TO_PAGE,
'marginLeft'       => Converter::cmToPixel(15.5),
'marginTop'        => Converter::cmToPixel(1.55),
)
);
//Relative positioning
$section->addTextBreak(3);
$section->addText('Relative positioning: Horizontal position center relative to column,');
$section->addText('Vertical position top relative to line');
$section->addImage(
$_local_image_path,
array(
'width'            => Converter::cmToPixel(3),
'height'           => Converter::cmToPixel(3),
'positioning'      => Image::POSITION_RELATIVE,
'posHorizontal'    => Image::POSITION_HORIZONTAL_CENTER,
'posHorizontalRel' => Image::POSITION_RELATIVE_TO_COLUMN,
'posVertical'      => Image::POSITION_VERTICAL_TOP,
'posVerticalRel'   => Image::POSITION_RELATIVE_TO_LINE,
)
);
// Saving the document as OOXML file...
$objWriter = IOFactory::createWriter($phpWord, 'Word2007');
$filePath = 'hello_world_images.docx';
// Write file into path
$objWriter->save($filePath);
return new Response("File succesfully written at $filePath");
}
}

4. Вставка диаграмм в текстовый файл

В Word диаграммы идеальны для графического представления информации, и их довольно просто добавить с помощью PHPWord (EMU используются для координат на векторных рисунках и встроенных рисунках):

addTitleStyle(1, array('size' => 14, 'bold' => true), array('keepNext' => true, 'spaceBefore' => 240));
$phpWord->addTitleStyle(2, array('size' => 14, 'bold' => true), array('keepNext' => true, 'spaceBefore' => 240));
// 2D charts
$section = $phpWord->addSection();
$section->addTitle('2D charts', 1);
$section = $phpWord->addSection(array('colsNum' => 2, 'breakType' => 'continuous'));
$chartTypes = array('pie', 'doughnut', 'bar', 'column', 'line', 'area', 'scatter', 'radar');
$twoSeries = array('bar', 'column', 'line', 'area', 'scatter', 'radar');
$threeSeries = array('bar', 'line');
$categories = array('A', 'B', 'C', 'D', 'E');
$series1 = array(1, 3, 2, 5, 4);
$series2 = array(3, 1, 7, 2, 6);
$series3 = array(8, 3, 2, 5, 4);
foreach ($chartTypes as $chartType) {
$section->addTitle(ucfirst($chartType), 2);
$chart = $section->addChart($chartType, $categories, $series1);
$chart->getStyle()->setWidth(Converter::inchToEmu(2.5))->setHeight(Converter::inchToEmu(2));
if (in_array($chartType, $twoSeries)) {
$chart->addSeries($categories, $series2);
}
if (in_array($chartType, $threeSeries)) {
$chart->addSeries($categories, $series3);
}
$section->addTextBreak();
}
// 3D charts
$section = $phpWord->addSection(array('breakType' => 'continuous'));
$section->addTitle('3D charts', 1);
$section = $phpWord->addSection(array('colsNum' => 2, 'breakType' => 'continuous'));
$chartTypes = array('pie', 'bar', 'column', 'line', 'area');
$multiSeries = array('bar', 'column', 'line', 'area');
$style = array('width' => Converter::cmToEmu(5), 'height' => Converter::cmToEmu(4), '3d' => true);
foreach ($chartTypes as $chartType) {
$section->addTitle(ucfirst($chartType), 2);
$chart = $section->addChart($chartType, $categories, $series1, $style);
if (in_array($chartType, $multiSeries)) {
$chart->addSeries($categories, $series2);
$chart->addSeries($categories, $series3);
}
$section->addTextBreak();
}
// Saving the document as OOXML file...
$objWriter = IOFactory::createWriter($phpWord, 'Word2007');
$filePath = 'hello_world_charts.docx';
// Write file into path
$objWriter->save($filePath);
return new Response("File succesfully written at $filePath");
}
}

Мы рекомендуем вам прочитать документацию, чтобы увидеть все удивительные вещи, которые вы можете сделать с помощью PHPWord.

Ссылка на основную публикацию
Adblock
detector