【问题标题】:Laravel PHPExcel - Row Length Limitation Issue (xls)Laravel PHPExcel - 行长度限制问题(xls)
【发布时间】:2018-02-26 21:22:40
【问题描述】:

在 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");

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

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

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

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

【问题讨论】:

    标签: php excel laravel phpexcel xls


    【解决方案1】:

    MS Excel 对 BIFF 格式的 xls 文件有 256 列(第 IV 列)的限制,因此使用 xls 编写器应该无法生成 257 列的工作表

    【讨论】:

    • 我就是这么想的。我查看了最大列数,并没有在任何地方看到 256,但我可能正在查看 .xlsx 规格。此外,257 只是 256 的一个示例;我实际使用的数据中有大约 351 列,所以我可能会将其分成多张表来解决这个问题。谢谢你。
    【解决方案2】:

    所以我必须通过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-&gt;sheet() 函数处理>= 256 列并不理想,但满足.xls 文件和显示所有关联数据的要求。使用for($i = 0; $i &lt;= 1000; $i++) 的循环进行测试会产生最多 256 列的 4 张工作表;所有数据都完好无损。

    【讨论】:

      【解决方案3】:

      请尝试此修复,它将开始工作。避免在 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");
      

      【讨论】:

      • 这不会解决它;在函数中有几个循环不是问题,抱歉。
      猜你喜欢
      • 1970-01-01
      • 2015-12-20
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      相关资源
      最近更新 更多