xaamin / simple-excel
Excel 读取器和写入器
Requires
- php: >=8.0.0
- openspout/openspout: ^4.8
README
此包允许您轻松读取和写入简单的 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 文件相同。只需确保传递给 ExcelReader
的 create
方法的路径以 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 文件相同。只需确保传递给 ExcelWriter
的 create
方法的路径以 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)。有关更多信息,请参阅许可证文件。