xaamin/simple-excel

Excel 读取器和写入器

v2.0.1 2023-11-12 12:36 UTC

This package is auto-updated.

Last update: 2024-09-25 01:52:49 UTC


README

Latest Version on Packagist GitHub Workflow Status Total Downloads

此包允许您轻松读取和写入简单的 Excel 和 CSV 文件。在幕后,使用生成器确保低内存使用,即使在处理大文件时也是如此。

以下是一个读取 Excel 或 CSV 的示例。

$reader = ExcelReader::create($pathToFile)

foreach ($reader->rows() as $row) {
    // Process the row
}

如果 $pathToFile.csv.txt 结尾,则假定是 CSV 文件。如果以 .xlsx 结尾,则假定是 Excel 文件。

支持我们

安装

您可以通过 composer 安装此包

composer require xaamin/simple-excel

用法

读取 CSV

假设您有一个包含以下内容的 CSV 文件。

email,first_name
john@example.com,john
jane@example.com,jane
$rows = ExcelReader::create($pathToCsv);

foreach ($reader->rows() as $row) {
   // In the first pass $row will contain
   // ['email' => 'john@example.com', 'first_name' => 'john']
});

foreach ($reader->chunk(2) as $chunk) {
   // Each chunk contains 2 rows
});

读取 Excel 文件

读取 Excel 文件与读取 CSV 文件相同。只需确保传递给 ExcelReadercreate 方法的路径以 xlsx 结尾。

读取不带标题的文件

如果您正在读取的文件不包含标题行,则应使用 noHeaderRow 方法。

// $rows is an instance of Illuminate\Support\LazyCollection
$rows = ExcelReader::create($pathToCsv)
    ->withHeader(false);

foreach ($reader->rows() as $row) {
    // in the first pass $rowProperties will contain
    // [0 => 'john@example', 1 => 'john']
}

手动处理读取器对象

此包底层使用 box/spout 包。您可以通过调用 getReader 方法来获取实现 \Box\Spout\Reader\ReaderInterface 的底层读取器。

$reader = ExcelReader::create($pathToCsv)->getReader();

写入文件

以下是写入 CSV 文件的示例

$writer = ExcelWriter::create($pathToCsv)
     ->addRow([
        'first_name' => 'John',
        'last_name' => 'Doe',
    ])
    ->addRow([
        'first_name' => 'Jane',
        'last_name' => 'Doe',
    ]);

pathToCsv 中的文件将包含

first_name,last_name
John,Doe
Jane,Doe

写入 Excel 文件

写入 Excel 文件与写入 CSV 文件相同。只需确保传递给 ExcelWritercreate 方法的路径以 xlsx 结尾。

将 Excel 文件流式传输到浏览器

您可以直接将文件流式传输到浏览器,而不是将其写入磁盘。

$writer = ExcelWriter::downloadAs('your-export.xlsx')
     ->addRow([
        'first_name' => 'John',
        'last_name' => 'Doe',
    ])
    ->addRow([
        'first_name' => 'Jane',
        'last_name' => 'Doe',
    ])
    ->sendToBrowser();

一次性写入多行

您可以使用 addRows 而不是 addRow 一次性添加多行。

$writer = ExcelWriter::downloadAs('your-export.xlsx')
     ->addRows([
        [
            'first_name' => 'John',
            'last_name' => 'Doe',
        ],
        [
            'first_name' => 'Jane',
            'last_name' => 'Doe',
        ],
    ])->sendToBrowser();

写入不带标题的文件

如果写入的文件不应自动添加标题行,则应使用 noHeaderRow 方法。

$writer = ExcelWriter::create($pathToCsv)
    ->withHeader(false)
    ->addRow([
        'first_name' => 'Jane',
        'last_name' => 'Doe',
    ]);
});

这将输出

Jane,Doe

添加布局

此包底层使用 box/spout 包。该包包含一个 StyleBuilder,您可以使用它来格式化行。样式只能在 Excel 文档中使用。

use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;

$style = (new StyleBuilder())
   ->setFontBold()
   ->setFontSize(15)
   ->setFontColor(Color::BLUE)
   ->setShouldWrapText()
   ->setBackgroundColor(Color::YELLOW)
   ->build();

$writer->addRow(['values, 'of', 'the', 'row'], $style)

有关样式的更多信息,请参阅 Spout 文档

使用替代分隔符

默认情况下,ExcelReader 假定分隔符是 ,

以下是使用替代分隔符的方法

ExcelWriter::create($pathToCsv)->useDelimiter(';');

获取写入的行数

您可以得到写入的行数。这个数字包括自动添加的标题行。

$writerWithAutomaticHeader = ExcelWriter::create($this->pathToCsv)
    ->addRow([
        'first_name' => 'John',
        'last_name' => 'Doe',
    ]);

$writerWithoutAutomaticHeader->getNumberOfRows() // returns 2

手动处理写入器对象

此包底层使用 box/spout 包。您可以通过调用 getWriter 方法来获取实现 \Box\Spout\Writer\WriterInterface 的底层写入器。

$writer = ExcelWriter::create($pathToCsv)->getWriter();

测试

即将推出

贡献

有关详细信息,请参阅 CONTRIBUTING

安全

如果您发现任何与安全相关的问题,请通过免费邮箱freek@spatie.be联系,而不是使用问题跟踪器。

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件