phpexcel删除列占用太多时间

时间:2013-12-04 13:35:07

标签: phpexcel

我将编写我的要求以及如何编写代码来实现它。

我必须使用特定的样式和公式在服务器上生成并保存excel文件。哪个用户稍后会下载。用户必须在生成excel时选择他想要的列。

enter image description here

我写的

逻辑

我在服务器上放置了一个类似样式的excel文件,但是我将在稍后填充空单元格。这样我就可以避免为所有必需的单元格设置样式代码。

然后我用数据库中的数据填充所有列。现在我读取了需要在已发布数组中删除的列的列表,并以相反的顺序删除以确保删除右列。这有效,但删除每列需要太多时间。如果列数增加,则删除单列至少需要4到5分钟,删除时间会呈指数级增长。

代码

    $objReader = PHPExcel_IOFactory::createReader('Excel5');
    $objPHPExcel = $objReader->load($inputFileName);
    $objPHPExcel->getProperties()->setCreator(user_data('name'))
            ->setLastModifiedBy(user_data('name'))
            ->setTitle("Grid file")
            ->setSubject("Grid file")
            ->setDescription("Grid file")
            ->setKeywords("Grid file")
            ->setCategory("Grids");
    $col = 0;
    $worksheet = $objPHPExcel->getActiveSheet();
    for ($i = 19; $i < count($grid_items) + 19; $i++) {
        $col = 0;
        foreach ($grid_items[$i - 19] as $columnname => $value) {
            $coval = PHPExcel_Cell::stringFromColumnIndex($col) . ($i);
            $worksheet->setCellValue($coval, $value);
            $col++;
        }
    }
    $worksheet->removeColumnByIndex(11);
    $worksheet->removeColumnByIndex(12);
    $worksheet->removeColumnByIndex(13);
    $worksheet->removeColumnByIndex(14);

    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $finalFilename = 'Master_Grid_excel_' . $this->job_id . '-' . date('Y-m-d-H-i-s') . '.xls';
    $objWriter->save(SITE_ROOT . 'uploads/rfp/' . $finalFilename);

    return ;

2 个答案:

答案 0 :(得分:1)

无论如何,removeColumn()是计算密集型的;但是当你只需要调用一次时,你就称之为 4 次。 removeColumn()和removeColumnByIndex()方法接受一个可选的第二个参数,指定要删除的列数,默认为1;但如果你想删除多个连续的列(例如11,12,13和14),那么你可以这样做:

$worksheet->removeColumnByIndex(11, 4);

并且1次通话将比4次个人通话快4倍。

请注意,相同的附加参数适用于删除行和列;以及插入列和行。

但是:如果你修改了

的逻辑
foreach ($grid_items[$i - 19] as $columnname => $value) {

循环,以便它不会首先写入这些列,并删除任何不必要的列以消除循环之前的标题行条目;那么你就不会对完全填充的电子表格执行removeColumn()。

答案 1 :(得分:0)

当您运行$worksheet->removeColumnByIndex(11)并且下一列是12时,更改为=&gt; 11
所以你可以尝试使用..php函数array_reverse()big =&gt; small

$d= array_reverse(sort($chk)); 
foreach ($d as $v){ 
     $worksheet->removeColumnByIndex($v);  
}