非法者 / 电子表格列生成器
生成用于电子表格的列名
Requires
- php: >=7.1
Requires (Dev)
- phpunit/phpunit: ~6.0
This package is auto-updated.
Last update: 2024-08-29 05:37:12 UTC
README
当你需要为动态数量的列生成电子表格时,生成它们可能会变成一项真正的负担。特别是如果你还想为这些列设置样式信息,比如在Excel中。
这个库是为PhpOffice\PhpSpreadsheet (https://github.com/PHPOffice/PhpSpreadsheet) 编写的。一个用于生成CSV或xlsx文件的优秀库。
每次调用生成器时,它都会生成下一个列/单元格名称。所以是A-Z,然后是AA-ZZ等。可选地带有行号。
$columnGenerator = new ColumnGenerator();
$columnGenerator->getColumn(); // A
$columnGenerator->getColumn(); // B
$columnGenerator->getColumn(); // C
...
$columnGenerator->getColumn(); // Z
$columnGenerator->getColumn(); // AA
一个现实世界的例子如下
$spreadsheet = new Spreadsheet();
$productsSheet = $spreadsheet->createSheet();
$productsSheet->setTitle("Products");
$columnGenerator = new ColumnGenerator(1);
$productsSheet->setCellValue($columnGenerator->getColumn(), 'name'); // A1
$productsSheet->setCellValue($columnGenerator->getColumn(), 'sku'); // B1
$properties = $this->getBigListOfProperties();
foreach ($properties as $property) {
$productsSheet->setCellValue($columnGenerator->getColumn(), $property->getName());
}
遍历之前生成的列
例如,为了在单元格上设置自动调整大小,你当然可以在for循环的每个单元格中添加另一行。但更不分散注意力的是遍历所有生成的单元格,并对每个生成的列执行回调。
$columnGenerator->walk(function ($columnName) use ($productsSheet) {
$productsSheet->getColumnDimension(substr($columnName, 0, -1))->setAutoSize(true);
});
也可以在不先生成单元格的情况下这样做
$columnGenerator->walkTo('ZZ1', function ($columnName) use ($productsSheet) {
...
});
你不必对给定的列名过于严格,这将同样有效(小写并省略行号)
$columnGenerator->walkTo('zz', function ($columnName) use ($productsSheet) {
...
});
walk和walkTo之间的区别在于walk将重置生成器,然后再次遍历所有列,直到生成器之前停止的位置。walkTo将从当前位置开始,走到你指定的任何地方。
跳过前n列
你可能已经添加了多个列,但只想让其余的列是动态的。你可以从给定的列数开始
$columnGenerator = new ColumnGenerator(null, 10);
$columnGenerator->getColumn(); // K
你也可以稍后转发,尽管walk方法仍会遍历这些
$columnGenerator = new ColumnGenerator(null, 10);
$columnGenerator->getColumn(); // A
$columnGenerator->getColumn(); // B
$columnGenerator->forward(5);
$columnGenerator->getColumn(); // H
获取正确的值
并非所有值都是相同的。根据你想如何使用生成的列名以及何时有不同选项。首先,getColumn()方法有一个可选的$movePointerForward参数。它默认为true。这意味着在从生成器接收值后,内部指针将向前移动。
$columnGenerator = new ColumnGenerator();
$columnGenerator->getColumn(); // A, internally moves to B
$columnGenerator->getColumn(false); // B
$columnGenerator->getColumn(false); // B
$columnGenerator->getColumn(true); // B, internally moves to C
$columnGenerator->getColumn(false); // C
因此,在调用$columnGenerator->getColumn(true)之后,由于内部状态已经移动到下一个列,因此很难再次获取返回的值。因此,你可以调用getCurrentColumn()方法,它将返回之前调用getColumn(true)之前最后一次返回的值。
$columnGenerator = new ColumnGenerator();
$columnGenerator->getCurrentColumn(); // A, this is for convenience, in reality getColumn(true) has not yet been called
$columnGenerator->getColumn(); // A, internally moves to B
$columnGenerator->getCurrentColumn(); // A
$columnGenerator->getColumn(false); // B
$columnGenerator->getCurrentColumn(); // A
这个的某些实际用途可以是
$spreadsheet = new Spreadsheet();
$productsSheet = $spreadsheet->createSheet();
$properties = $this->getBigListOfProperties();
$columnGenerator = new ColumnGenerator(1);
foreach ($properties as $property) {
$productsSheet->setCellValue($columnGenerator->getColumn(), $property->getName());
}
// set bold on each generated column
$productsSheet->getStyle("A1:" . $columnGenerator->getCurrentColumn())->getFont()->setBold(true);
重置
你可以重置生成器,它将从头开始
$columnGenerator->getColumn(); // ZX
$columnGenerator->getColumn(); // ZY
$columnGenerator->reset();
$columnGenerator->getColumn(); // A
永远
由于它是一个生成器,理论上你可以永远继续下去。当然,Excel实际支持的有限。