tangwei666/php-excel-templator

PHP电子表格扩展,用于从模板生成Excel文件

v1.0.11 2020-06-12 17:39 UTC

This package is auto-updated.

Last update: 2024-09-29 05:43:04 UTC


README

Latest Stable Version Latest Unstable Version License Total Downloads Monthly Downloads Daily Downloads

俄语说明 (Russian)

这是一个PHP电子表格扩展,允许您从Excel模板导出Excel文件。使用此扩展,您无需从头开始使用代码创建Excel文件,设置样式等。

演示截图

Demo

简单示例

以下是一个简单示例,说明其可能的样子(使用更少的代码)。假设我们有一个包含以下模板变量的Excel文件

Template

代码如下所示

use tangwei666\PhpExcelTemplator\PhpExcelTemplator;
require_once('vendor/autoload.php'); // if you don't use framework

PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', [
	'{current_date}' => date('d-m-Y'),
	'{department}' => 'Sales department',
]);

因此,我们得到

Exported file

使用此扩展,我们只需创建一个包含所需样式的模板文件,并在其中指定模板变量。在代码中,我们只需将参数传递给模板变量。

特性

  • 我们可以在一个表格单元格中插入多个模板变量(如果数据类型为“字符串”)
  • 我们可以插入一个一维数组,在这种情况下,将在表格中创建额外的行
  • 我们可以插入一个二维数组,在这种情况下,将在表格中创建相应的列和行
  • 通过指定单元格中的值,您可以更改这些单元格的样式,即使是在插入数组时也是如此
  • 我们可以将相同的模板应用于表格的多个工作表

特性演示和用法示例在“samples”文件夹中。

限制

  • 在使用一维或二维数组时可能出现的所谓的副作用。特别是当它位于不对称的位置时。副作用的一个示例也已在“samples”文件夹中给出。

安装

$ composer require tangwei666/php-excel-templator

模板变量命名规则

规则可以是任意的,但我可以提供命名模板变量的建议

  • {var_name} - 用于字符串值
  • [var_name] - 用于一维数组
  • [[var_name]] - 用于二维数组

如何插入一维数组,以便在表格中创建列而不是行?

为此,您可以使用以下方法插入一个二维数组而不是一维数组

$param['[[var_name]]'] = [['text 1', 'text 2', 'text 3']];

使用设置器

在上面的示例中,使用了没有设置器的最少代码。此代码中的数据类型(例如:字符串、一维数组或二维数组)是自动识别的,并选择了必要的设置器。但是,如果我们想使用特定的设置器,相同的代码将如下所示

use tangwei666\PhpExcelTemplator\PhpExcelTemplator;
use tangwei666\PhpExcelTemplator\params\ExcelParam;
use tangwei666\PhpExcelTemplator\params\CallbackParam;
use tangwei666\PhpExcelTemplator\setters\CellSetterStringValue;

require_once('vendor/autoload.php'); // if you don't use framework

$params = [
	'{current_date}' => new ExcelParam(CellSetterStringValue::class, date('d-m-Y')),
	'{department}' => new ExcelParam(CellSetterStringValue::class, 'Sales department'),
];
PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', $params);

目前该扩展有3种设置器

  • CellSetterStringValue(用于字符串值)
  • CellSetterArrayValue(用于一维数组)
  • CellSetterArray2DValue(用于二维数组)

您可能想知道为什么需要明确指定设置器?

  • 首先,因为它很灵活:比如说,您想创建一个自己的设置器,使用自己的算法来消除我上面提到的副作用。
  • 其次,在每个设置器中,您可以传递一个回调函数,在回调函数中我们可以更改插入单元格的样式。例如,您可能需要突出显示在本月销售额最高的员工。

使用各种设置器的代码示例在“samples”文件夹中列出。

如何在不使用设置器的情况下设置样式?

在大多数情况下,显式使用设置器并不那么方便。我猜您想使用最少的代码。因此,我使其能够不使用设置器设置样式

use tangwei666\PhpExcelTemplator\PhpExcelTemplator;
use tangwei666\PhpExcelTemplator\params\CallbackParam;
require_once('vendor/autoload.php'); // if you don't use framework

$params = [
	'{current_date}' => date('d-m-Y'),
	'{department}' => 'Sales department',
	'[sales_amount]' => [
		'10230',
		'45100',
		'70500',
	],
];

$callbacks = [
	'[sales_amount]' => function(CallbackParam $param) {
		$amount = $param->param[$param->row_index];
		if ($amount > 50000) {
			$cell_coordinate = $param->coordinate;
			$param->sheet->getStyle($cell_coordinate)->getFont()->setBold(true);
		}
	},
];

PhpExcelTemplator::saveToFile('./template.xlsx', './exported_file.xlsx', $params, $callbacks);

特殊设置器用于特殊模板(CellSetterArrayValueSpecial)

存在一些特殊模板,需要插入整行,而不是通过向下移动单元格来插入单元格。此外,还需要合并单元格,以及包含模板变量的单元格。

Special template

对于这些模板,已创建了一个特殊设置器:CellSetterArrayValueSpecial。使用它的代码示例可以在文件夹中找到:samples/8_special_template。

事件

以下是一些可能的事件及其应用原因的说明

$events = [
    PhpExcelTemplator::BEFORE_INSERT_PARAMS => function(Worksheet $sheet, array $templateVarsArr) {
        // fires before inserting values into template variables        
    },
    PhpExcelTemplator::AFTER_INSERT_PARAMS => function(Worksheet $sheet, array $templateVarsArr) {
        // fires after inserting values into template variables.
        // It is used if you want to insert values​into a spreadsheet after columns and rows have been created. 
        // For example, when inserting an array of images.
        // If you insert images using $callbacks, then the images can shift to the right due to the fact that on the next line the template variable can create additional columns.
        // See an example: samples/10_images        
    },
    PhpExcelTemplator::BEFORE_SAVE => function(Spreadsheet $spreadsheet, IWriter $writer) {
        // fires before saving to a file. It is used when you need to modify the $writer or $spreadsheet object before saving, for example, $writer->setPreCalculateFormulas(false);        
    },
];
$callbacks = [];
$templateFile = './template.xlsx';
$fileName = './exported_file.xlsx';
$params = [
	// ...
];

PhpExcelTemplator::saveToFile($templateFile, $fileName, $params, $callbacks, $events);