[PHP 开源类库]simple-Excel — 兼具优雅与性能的Excel和CSV文件读写工具
该扩展包可让你轻松读取和写入简单的 excel 和 csv 文件。在后台使用生成器来确保低内存使用,即使在处理大型文件时也是如此。
这是有关如何读取 excel 或 csv 的示例。
simpleexcelreader::create($pathtofile)->getrows()
->each(function(array $rowproperties) {
// process the row
});
如果 $ pathtofile
以 .csv
结尾。则假定为 csv 文件。如果以 .xlsx
结尾,则假定为 excel 文件。
安装
你可以通过 composer 安装该软件包:
$ composer require spatie/simple-excel
用法
读取 csv
想象你有一个包含如下内容的 csv 文件
email,first_name
john@example.com,john
jane@example.com,jane
// $rows是 illuminate\support\lazycollection 的一个实例
$rows = simpleexcelreader::create($pathtocsv)->getrows();
$rows->each(function(array $rowproperties) {
// 循环的第一个 $rowproperties 应该是下面这样的
// ['email' => 'john@example', 'first_name' => 'john']
});
读取 excel 文件
读取 excel 文件与读取 csv 文件相同。只需确保提供给 simpleexcelreader
的 create
方法的路径以 xlsx
结尾。
使用懒集合
getrows
将返回 lazycollection
实例,该实例是 laravel 框架的一部分。因为在后台使用了生成器,即使是大文件内存使用量也会较低。
你可以在这里. 找到关于 lazycollection
的方法
这是一个简单的愚蠢的例子,我们只想处理 first_name
长度大于 5 的行。
simpleexcelreader::create($pathtocsv)->getrows()
->filter(function(array $rowproperties) {
return strlen($rowproperties['first_name']) > 5
})
->each(function(array $rowproperties) {
// processing rows
});
读取一个没有标题的文件
如果你要读取一个没有标题的文件,你应该使用 noheaderrow()
// $rows是 illuminate\support\lazycollection 的一个实例
$rows = simpleexcelreader::create($pathtocsv)
->noheaderrow()
->getrows()
->each(function(array $rowproperties) {
// 第一次循环的 $rowproperties 会是下面这样
// [0 => 'john@example', 1 => 'john']
});
自己创建一个阅读器
首先我们已经引入了 box/spout 这个包。 你可以通过 getreader
方法获取一个阅读器的接口 \box\spout\reader\readerinterface
$reader = simpleexcelreader::create($pathtocsv)->getreader();
写入文件
这里将展示如何写入一个 csv 文件:
$writer = simpleexcelwriter::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 相同。只需确保提供给 simpleexcelwriter
的 create
方法的路径以 xlsx
结尾。
将 excel 文件流式传输到浏览器
无需将文件写入磁盘,您可以将其直接流式传输到浏览器。
$writer = simpleexcelwriter::streamdownload('your-export.xlsx')
->addrow([
'first_name' => 'john',
'last_name' => 'doe',
])
->addrow([
'first_name' => 'jane',
'last_name' => 'doe',
])
->tobrowser();
写入没有标题的文件
如果正在写入的文件没有标题行,则应使用 noheaderrow()
方法。
$writer = simpleexcelwriter::create($pathtocsv)
->noheaderrow()
->addrow([
'first_name' => 'jane',
'last_name' => 'doe',
]);
});
这将输出:
jane,doe
添加布局
这个包底层使用了 box/spout 包。该软件包包含一个 stylebuilder
,可用于格式化行。请注意样式只能在 excel 文档上使用。
use box\spout\writer\common\creator\style\stylebuilder;
use box\spout\common\entity\style\color;
$style = (new stylebuilder())
->setfontbold()
->setfontsize(15)
->setfontcolor(color::blue)
->setshouldwraptext()
->setbackgroundcolor(color::yellow)
->build();
$writer->addrow(['values, 'of', 'the', 'row'], $style)
有关样式的更多信息,请查阅 spout 文档.
使用替代定界符
默认情况下, simpleexcelreader
将假定分隔符为 ,
。
使用其他分隔符的方法:
simpleexcelwriter::create($pathtocsv)->usedelimiter(';');
获取写入的行数
您可以获取写入的行数。该数字包括自动添加的标题行。
$writerwithautomaticheader = simpleexcelwriter::create($this->pathtocsv)
->addrow([
'first_name' => 'john',
'last_name' => 'doe',
]);
$writerwithoutautomaticheader->getnumberofrows() // returns 2
手动使用 writer 对象
因基于 box/spout 包,所以你可以通过 getwriter
来获取到底层的 \box\spout\reader\writerinterface
实现:
$writer = simpleexcelwriter::create($pathtocsv)->getwriter();
更多学习内容请访问:
腾讯t3-t4标准精品php架构师教程目录大全,只要你看完保证薪资上升一个台阶(持续更新)
上一篇: list()和each()