非法者/电子表格列生成器

生成用于电子表格的列名

v1.1.1 2020-10-23 20:14 UTC

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实际支持的有限。