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 列;所有数据完好无损。
发现 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 列;所有数据完好无损。