fastbolt/excel-writer

用于简单创建Excel文件的库

v0.7.2 2024-09-17 13:59 UTC

This package is auto-updated.

Last update: 2024-09-19 07:11:35 UTC


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;

e x c e l - w r i t e r