fastbolt / excel-writer
用于简单创建Excel文件的库
v0.7.2
2024-09-17 13:59 UTC
Requires
- php: ^8.2
- phpoffice/phpspreadsheet: ^2.1
Requires (Dev)
- fig-r/psr2r-sniffer: ^1.3
- phpstan/phpstan: ^1.11
- phpunit/phpunit: ^9.5
- slevomat/coding-standard: ^7.0
- spryker/code-sniffer: ^0.17.4
- squizlabs/php_codesniffer: ^3.0
- vimeo/psalm: ^5.25
README
此组件用于在Symfony中简单生成Excel文件。您可以将数组数组的数组或实体数组的数组传递给生成器类。如果实体将其属性引用为另一个实体,则需要传递一个可调用来从该实体检索特定值。
安装
此软件包通过Composer/Packagist提供
$ composer require fastbolt/excel-writer
表格大小
表格的宽度由标题数量设置。行数由数据量设置。
列
列的顺序由传递给ExcelGenerator::setColumns()的ColumnSetting实例的顺序确定。您至少需要定义一个列。如果传递数组到setContent(),则内容的顺序将不会改变。
如果您正在将对象传递到setContent(),则需要提供返回要显示的值的方法的名称(如"getName")。
$columns = [ new ColumnSetting('Name', ColumnSetting::FORMAT_STRING, 'getName'), new ColumnSetting('ID', ColumnSetting::FORMAT_INTEGER, 'getId'), ]; $generator = new ExcelGenerator(); $file = $generator ->setContent($data) ->setColumns($columns) ->generateSpreadsheet('../var/temp/excelwriter');
您也可以传递闭包而不是获取器。
$columns = [ new ColumnSetting('Loginname', ColumnSetting::FORMAT_STRING, static function($user) { return $user->getLoginname(); }) ];
##样式 创建一个TableStyle类的实例并设置标题行和内容的样式。将TableStyle传递给生成器。
$headerStyle = [ 'fill' => [ 'fillType' => Fill::FILL_SOLID, 'color' => array('rgb' => 'FF9933') ] ]; $dataRowStyle = [ 'fill' => array( 'fillType' => Fill::FILL_SOLID, 'color' => array('rgb' => '66FF66') ) ]; $style = new TableStyle(); $style ->setHeaderRowHeight(2) ->setHeaderStyle($headerStyle) ->setDataRowStyle($dataRowStyle); $file = $generator ->setContent($data) ->setColumns($columns) ->setStyle($style) ->generateSpreadsheet('../var/temp/filename');
要应用样式到单个列,您可以将样式数组作为构造函数的第5个(标题样式)和第6个(数据样式)参数传递,或者使用ColumnSettings类的setter。
$headerStyle = [ 'fill' => [ 'fillType' => Fill::FILL_SOLID, 'color' => array('rgb' => 'FF6622') ] ]; $dataStyle = [ 'fill' => array( 'fillType' => Fill::FILL_SOLID, 'color' => array('rgb' => '22DD33') ) ]; //using the constructor $column = new ColumnSetting("By Constructor", ColumnSetting::FORMAT_STRING, '', 0, $headerStyle, $dataStyle); //using the setters $column = new ColumnSetting("Styled Column", ColumnSetting::FORMAT_STRING); $column->setHeaderStyle($headerStyle) ->setDataStyle($dataStyle);
自动筛选
可以通过调用生成器的setter方法并传递一个范围来设置自动筛选。
$generator->setAutoFilterRange("A1:R14");
样式预设
以下样式是预设,但可以在TableStyle类中重写
header
- borders: medium
- vertical-alignment: center
- horizontal-alignment: center
- color: FF366092 (blue)
合并单元格
您可以通过传递坐标范围数组到生成器的'mergeCells'方法来合并单元格。合并单元格的内容将居中。多次调用该方法不会覆盖之前合并的内容。
$generator->mergeCells(['A1:B4']) ->mergeCells(['P4:T4', 'S1:T1'])
提示
- 浮点数有预设的小数长度为2(0.12),但这可以通过ColumnSetting构造函数的第四个参数或其setDecimalLength()方法进行配置。
- PHP和Excel在处理大数时有问题。将16+位数字作为字符串传递到字符串列中,以正确显示它们。
示例用法
使用数组
$data = [ [ $users[0], //instance of a user entity 'Italy', new DateTime('NOW') ], [ $users[1], //instance of a user entity 'France', new DateTime('NOW') ] ]; //define columns matching the order of the data $columns = [ new ColumnSetting('Login', ColumnSetting::FORMAT_INTEGER, static function($user) { return $user->getLoginname(); }), new ColumnSetting('Country', ColumnSetting::FORMAT_STRING), new ColumnSetting('Date', ColumnSetting::FORMAT_DATE) ]; //generate $generator = new ExcelGenerator(); $file = $generator ->setContent($data) ->setColumns($columns) ->generateSpreadsheet('../var/temp/filename');
使用对象
$repo = $this->getDoctrine()->getRepository(User::class); $users = $repo->findBy(['client' => 5]); //define columns matching the order of the data $columns = [ new ColumnSetting('Login', ColumnSetting::FORMAT_INTEGER, 'getLoginName'), new ColumnSetting('Country', ColumnSetting::FORMAT_STRING, static function($user) { return $user->getCountry()->getName(); }), new ColumnSetting('Created', ColumnSetting::FORMAT_DATE, 'getCreated') ]; //generate $generator = new ExcelGenerator(); $file = $generator ->setContent($users) ->setColumns($columns) ->generateSpreadsheet('../var/temp/filename');
多工作表
foreach ($userGroups as $userGroup) { $excelGenerator ->setTitle($userGroup->getName()) ->setContent($userGroup) ->setColumns($columns) ->nextWorksheet(); } $excelGenerator->generateSpreadsheet('../var/temp/filename');
使用对象添加样式并完整示例
$repo = $this->getDoctrine()->getRepository(User::class); $users = $repo->findBy(['client' => 5]); //define columns $columns = [ new ColumnSetting('Login', ColumnSetting::FORMAT_INTEGER, 'getLoginName'), new ColumnSetting('Country', ColumnSetting::FORMAT_STRING, static function($user) { return $user->getCountry()->getName(); }), new ColumnSetting('Created', ColumnSetting::FORMAT_DATE, 'getCreated'), new ColumnSetting('Weight', ColumnSetting::FORMAT_FLOAT, 'getWeight', 2) ]; //set style $headerStyle = [ 'fill' => [ 'fillType' => Fill::FILL_SOLID, 'color' => array('rgb' => 'FF9933') ] ]; $dataRowStyle = [ 'fill' => array( 'fillType' => Fill::FILL_SOLID, 'color' => array('rgb' => '66FF66') ) ]; $style = new TableStyle(); $style ->setHeaderRowHeight(2) ->setHeaderStyle($headerStyle) ->setDataRowStyle($dataRowStyle); //generate $generator = new ExcelGenerator(); $file = $generator ->setContent($users) ->setColumns($columns) ->setStyle($style) ->generateSpreadsheet('../var/temp/filename'); //download $response = new BinaryFileResponse($file->getPathname()); $response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT); return $response;