?>

Einige nützliche Tricks und Snippets für die Arbeit mit phpoffice.

Einige nützliche Tricks und Snippets für die Arbeit mit phpoffice.

Im Laufe der Arbeit muss man sich häufig mit Aufgaben befassen, die durch das Lesen der Dokumentation einer Bibliothek gelöst werden.

Insbesondere musste ich diesmal auf https://github.com/PHPOffice stoßen . Dies ist eine großartige Bibliothek zum Arbeiten mit Office-Dokumenten. Mit seiner Hilfe können Sie diese Dokumente in PHP lesen und gestalten.

https://phpspreadsheet.readthedocs.io/en/latest/ - полная документация.

Сформировать файл несложно по документации. Но иногда нужно соблюсти абсолютно все стили этого файла по ТЗ. И конечно же можно задачу реализовать по разному. Можно с нуля создать файл и используя api библиотеки просто начать оформление каждой ячейки новогосозданного файла. Трудозатраты такого решения конечно же зависят от стилизации требуемого файла. Стилей дейтсвительно может оказаться очень много.

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

Вот пример моего кода.

Открыть шаблонный файл и отдать клиенту в браузер.

$file = \Yii::getAlias("@common/data/base-template.xlsx");
$resultFile = \Yii::getAlias("@runtime/result.xlsx");
//Открываем базовый шаблон
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("$file");

/**
 * @var $worksheet Worksheet
 */
$worksheet = $spreadsheet->getActiveSheet();

/**
 * @var Xlsx
 */
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save($resultFile);

//Отдаем в браузер
return \Yii::$app->response->sendFile($resultFile);

В этом примере мы просто открыли шаблон, сохранили его во временный файл и отдали в браузер на скачивание клиенту.

Копирование стилей ячеек.

$file = \Yii::getAlias("@common/data/base-template.xlsx");
$resultFile = \Yii::getAlias("@runtime/result.xlsx");
//Открываем базовый шаблон
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("$file");

/**
 * @var $worksheet Worksheet
 */
$worksheet = $spreadsheet->getActiveSheet();

$counter = 2;
/**
 * @var Model $model
 */
foreach (Model::find()->orderBy(['sort' => SORT_ASC])->each(10) as $model)
{
    $baseStyle = $worksheet->getCell('A2')->getStyle(); //Нужный стиль из шаблона, он уже храниться в ячейке A2
    $worksheet->duplicateStyle($baseStyle, 'A' . $counter); //Копируем этот стиль на следующею ячейку
    $worksheet->getCell('A' . $counter)->setValue("new value"); //Вставляем в ячейку новое значение

    $counter++;
}

/**
 * @var Xlsx
 */
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save($resultFile);

//Отдаем в браузер
return \Yii::$app->response->sendFile($resultFile);

 

Вставка html в ячейку.

$file = \Yii::getAlias("@common/data/base-template.xlsx");
$resultFile = \Yii::getAlias("@runtime/result.xlsx");
//Открываем базовый шаблон
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load("$file");

/**
 * @var $worksheet Worksheet
 */
$worksheet = $spreadsheet->getActiveSheet();

$counter = 2;
/**
 * @var Model $model
 */
foreach (Model::find()->orderBy(['sort' => SORT_ASC])->each(10) as $model)
{

    $wizard = new \PhpOffice\PhpSpreadsheet\Helper\Html();
    $cellValue = $wizard->toRichTextObject("test <b>value</b> test");
    $rgb = $worksheet->getCell('A2')->getStyle()->getFont()->getColor()->getRGB();

    foreach ($cellValue->getRichTextElements() as $element)
    {
        $element->getFont()->getColor()->setRGB($rgb);
    }

    $baseStyle = $worksheet->getCell('A2')->getStyle(); //Нужный стиль из шаблона, он уже храниться в ячейке A2
    $worksheet->duplicateStyle($baseStyle, 'A' . $counter); //Копируем этот стиль на следующею ячейку
    $worksheet->getCell('A' . $counter)->setValue($cellValue); //Вставляем в ячейку новое значение

    $counter++;
}

/**
 * @var Xlsx
 */
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save($resultFile);

//Отдаем в браузер
return \Yii::$app->response->sendFile($resultFile);

 

Alle Kommentare (0)
Keine Kommentare