soluti/excel-generator

提供生成 Excel 文件的方法。

dev-master 2018-10-04 13:22 UTC

This package is auto-updated.

Last update: 2021-10-04 19:41:27 UTC


README

一个库,提供了一种简单的方法将数据导出为 XLSX 格式,包括格式化、公式、关系。

安装

要安装 SolutiExcelGenerator,请运行以下命令

$ php composer.phar require soluti/excel-generator

基本用法

  1. 创建一个 Worksheet 对象,它需要实现 `Soluti\ExcelGenerator\WorksheetInterface`,为了方便,您可以扩展基础Soluti\ExcelGenerator\Worksheet` 类。它提供了一个良好的起点。有关创建工作表的更多详细信息,请参阅下一节。

  2. 创建一个工作簿对象并添加一个或多个工作表

     $workbook = new Workbook();
     $workbook->addWorksheet(
      new CustomWorksheet(
          ...
      )
     );
    
  3. 调用 generate 方法,传递保存 xls 的文件路径(例如:`$workbook->generate(DIR . '/test.xlsx')`

创建您的 Worksheet

为了创建一个新的 Worksheet,您有两种选择

  1. 实现 `Soluti\ExcelGenerator\WorksheetInterface`,在这种情况下,您需要做的唯一一件事是返回一个将输出工作表原始 XML 的 Generator。`getName()` 方法返回工作表名称。

  2. 扩展 `Soluti\ExcelGenerator\Worksheet` 并实现 `getName()` 和 `getSheetData()`,后者返回表体每一行的 Generator。您还可以覆盖标题或页脚部分。

工作表的主体由行组成,在 `getSheetData()` 中,您最好使用 `yield` 逐行生成,构建行时可以使用行辅助函数

  • 
    
  • 
    
  • 
    
  • 
    
  • 
    

开始行后,您需要向其中添加单元格。以下存在以下辅助静态方法

  • 
    
  • 
    
  • 
    
  • 
    
  • 
    

对于所有方法,`$column` 应该是 Excel 中的字母列名 - 您可以使用


### Example of custom worksheet:

```

<?php

namespace App\Excel;

use Soluti\ExcelGenerator\Worksheet\Helper\CellWriter;
use Soluti\ExcelGenerator\Worksheet\Worksheet as BaseWorksheet;

class Worksheet extends BaseWorksheet
{
    const START_COLUMN = 1;

    const FORMAT_NORMAL = 1;
    const FORMAT_HEADER = 2;
    const FORMAT_DATE = 3;

    /** @var string */
    private $name = 'Sheet';

    /** @var $data */
    private $data;

    /**
     * @inheritdoc
     */
    public function getName(): string
    {
        return $this->name;
    }

    /**
     * @return \Generator
     * @throws \Soluti\ExcelGenerator\Exception\ExcelWriterException
     */
    public function getSheetData()
    {
        yield '<sheetData>';
        foreach ($this->data as $row) {
            yield from $this->getDataRow($row);
        }
        yield '</sheetData>';
    }

    /**
     * @return mixed
     */
    public function getData()
    {
        return $this->data;
    }

    /**
     * @param mixed $data
     */
    public function setData($data): void
    {
        $this->data = $data;
    }

    /**
     * @param array $row
     *
     * @return \Generator
     * @throws \Soluti\ExcelGenerator\Exception\ExcelWriterException
     */
    private function getDataRow(array $row)
    {
        $this->rowStart();
        $columnIndex = self::START_COLUMN;
        foreach ($row as $key => $value) {
            $this->rowAddCell(
                $this->getCell(
                    CellWriter::getColumnIndex($columnIndex),
                    $this->rowIndex(),
                    $value
                )
            );
            $columnIndex++;
        }

        yield $this->rowEnd();
    }

    /**
     * @param string $column
     * @param int $row
     * @param $value
     * @return string
     */
    protected function getCell(string $column, int $row, $value)
    {
        if (is_numeric($value)) {
            return CellWriter::getNumericCell($column, $row, $value, self::FORMAT_NORMAL);
        }

        if ($value instanceof \DateTime) {
            return CellWriter::getDateCell($column, $row, $value, self::FORMAT_DATE);
        }

        if (is_string($value)) {
            return CellWriter::getInlineCell($column, $row, $value, self::FORMAT_NORMAL);
        }

        throw new \LogicException('Unknown type passed to proxy method');
    }
}


```

## To Do:

- Create a style manager + integrate with Worksheet
- Create a shared string manager + helper methods