nealyip/spreadsheet

box/spout 和 phpexcel 的电子表格读写抽象层

v1.1.2 2018-07-04 08:32 UTC

This package is auto-updated.

Last update: 2024-09-22 02:52:10 UTC


README

box/spout 和 phpexcel 的电子表格读写抽象层,支持 Laravel

更新

v1.1.2 修复下载 xlsx 的头部问题,在 boxspout 写入函数上抛出通用异常
v1.1.0 添加 PHPSpreadsheet。PHPExcel 已弃用。允许从 .env 使用带命名空间的类来使用 SPREADSHEET_WRITER 和 SPREADSHEET_READER

安装

composer require nealyip/spreadsheet

将此提供者添加到 config/app.php

\Nealyip\Spreadsheet\SpreadsheetServiceProvider::class,

配置

发布配置

php artisan vendor:publish --provider="Nealyip\Spreadsheet\SpreadsheetServiceProvider"

只需更改 config/spreadsheet.php 以选择一个电子表格数据提供者
默认使用 PHPSpreadsheet

或在 .env 文件中配置

SPREADSHEET_WRITER=PHPSpreadsheet  
SPREADSHEET_READER=BoxSpout  

如果您实现了自己的 Writer 或 Reader,您可以使用完整的类名。

SPREADSHEET_WRITER=App\Spreadsheet\CustomerWriter

请记住实现

Nealyip\Spreadsheet\Writer

如何使用

依赖注入

读取器

use Nealyip\Spreadsheet\Reader;
class Sth{
    protected $_reader;

    public function __construct(Reader $reader) {
        $this->_reader = $reader;
    }

    public function readFile($filename){
        $data = $this->_reader->toKeyValueArray($filename);

    }

使用生成器的读取器

use Nealyip\Spreadsheet\Reader;
class Sth{
    protected $_reader;

    public function __construct(Reader $reader) {
        $this->_reader = $reader;
    }

    public function readFile($filename){
        $data = $this->_reader->toKeyValueArray($filename);
        foreach ($this->_reader->read($filename) as $item){
            // $item is a row in array form        
        } 
    }

写入器

use Nealyip\Spreadsheet\Writer;
class Sth{
    protected $_writer;

    public function __construct(Writer $writer) {
        $this->_writer = $writer;
    }

    public function writeFile($filename){

        $headers = ['Name', 'Gender', 'Age'];

        $this->_writer
            ->setup("report.xlsx")
            ->useSheet('Report')
            ->writeArray([['Tom','M','20'], ['Ann','F','24']], $headers)
            ->save();

    }

使用生成器的写入器

use Nealyip\Spreadsheet\Writer;
class Sth{
    protected $_writer;

    public function __construct(Writer $writer) {
        $this->_writer = $writer;
    }
    
    /**    
     * Data source from DB/API etc
     * 
     * @return \Generator
     */
    protected function _data(){
        $data = [['Tom','M','20'], ['Ann','F','24']];
        foreach ($data as $d) {
            yield $d;
        }
    }


    public function writeFile($filename){

        $headers = ['Name', 'Gender', 'Age'];

        $this->_writer
            ->setup("report.xlsx")
            ->useSheet('Report')
            ->write($this->_data(), $headers)
            ->save();
    }

写入到本地文件

use Nealyip\Spreadsheet\Writer;
class Sth{
    protected $_writer;

    public function __construct(Writer $writer) {
        $this->_writer = $writer;
    }
    
    /**    
     * Data source from DB/API etc
     * 
     * @return \Generator
     */
    protected function _data(){
        $data = [['Tom','M','20'], ['Ann','F','24']];
        foreach ($data as $d) {
            yield $d;
        }
    }


    public function writeFile($filename){

        $headers = ['Name', 'Gender', 'Age'];

        $this->_writer
            ->setup("report.xlsx", false)
            ->useSheet('Report')
            ->write($this->_data(), $headers)
            ->save();
    }

内存限制和执行超时

如果您遇到内存耗尽问题,您可以通过以下方式调整内存限制

ini_set('memory_limit', '1000M');

或对于执行超时

ini_set('max_execution_time', 300);