Laravel PHPExcel - 行长度限制问题 (xls)

Laravel PHPExcel - Row Length Limitation Issue (xls)

发现 Laravel 和 PHPExcel 的一个有趣问题。给定以下代码:

\Excel::create("TestingXLS", function($excel){
    $excel->sheet("TestingSheet1", function($sheet){
        $values = [];
        for($i = 1; $i <= 257; $i++){
            $values[] = $i;
        }

        for($j = 1; $j <= 5; $j++){
            $sheet->row($j, $values);
        }
    });
})->download("xls");

这应该做的是生成一个 .xls 文档,其中包含 5 行 257 列 ,但实际发生的是我最终得到 一行 256 列 。实际上,第 256 列之后的所有内容(Excel 中的 IW 列索引)和第一行之后的任何其他行都被截断了,但我不明白为什么。

注意我已经用 $i <= 256; 作为第一个条件进行了测试,它生成了 5 行 256 列(IV 列索引)没有问题。

我知道这可以通过使用 ->download("xlsx") 来缓解,但我生成的文档中的其他要求要求它是一个 .xls 文件。另外由于客户要求,我无法将布局从列翻转到行,反之亦然。

有人对解决此问题有任何想法吗?

请尝试此修复,它将开始工作。避免在 excel 函数中使用两个循环,它有时会产生问题。

$values = [];
for($i = 1; $i <= 257; $i++){
   $values[] = $i;
}
\Excel::create("TestingXLS", function($excel)use($values){
    $excel->sheet("TestingSheet1", function($sheet)use($values){
        for($j = 1; $j <= 5; $j++){
            $sheet->row($j, $values);
        }
    });
})->download("xls");

MS Excel 对于 BIFF-format xls 文件有 256 列(第 IV 列)的限制,因此使用 xls 编写器[=10] 应该不可能生成 257 列的工作表=]

所以我不得不通过 chunk 将列最多设置为 256 列来解决这个问题,然后根据需要创建额外的工作表:

$valuesArray = [1, 2, 3, 4, 5, 6];

$valueChunks = collect($valuesArray)->chunk(3); // Using `3` for demo

\Excel::create("TestingXLS", function($excel) use($valueChunks){
    foreach($valueChunks AS $chunkKey => $chunkArray){
        $excel->sheet("TestingSheet".($chunkKey == 0 ? "" : "_".($chunkKey + 1)), function($sheet) use($chunkArray){

            $values = [];
            foreach($chunkArray AS $key => $value){
                $values[] = $value;
            }

            for($j = 1; $j <= 5; $j++){
                $sheet->row($j, $values);
            }
        });
    }
})->download("xls");

使用上面的代码,我得到:

===========================================
|     | TestingSheet    | TestingSheet2   |
===========================================
|     |  A  |  B  |  C  |  A  |  B  |  C  |
-------------------------------------------
|  1  |  1  |  2  |  3  |  4  |  5  |  6  |
|  2  |  1  |  2  |  3  |  4  |  5  |  6  |
|  3  |  1  |  2  |  3  |  4  |  5  |  6  |
|  4  |  1  |  2  |  3  |  4  |  5  |  6  |
|  5  |  1  |  2  |  3  |  4  |  5  |  6  |
===========================================

使用多个 $excel->sheet() 函数来处理 >= 256 列并不理想,但可以满足 .xls 文件和显示所有关联数据的要求。使用 for($i = 0; $i <= 1000; $i++) 的循环进行测试会导致 4 个工作表最多包含 256 列;所有数据完好无损。