是否可以直接setCellValue而无需多维数组?

时间:2016-04-13 18:48:01

标签: php xml multidimensional-array phpexcel

我目前开始处理已经完成的脚本。它运作得很好,但它需要太长时间,我相信我知道原因,但我没有成功改进它。

案例如下,该脚本读取一个XML文件,其中包含大量有关温度的信息,所有这些信息都在xml内的各种<Previsao>标记内。

$l = 3;

$q = $CON->Query("SELECT 
                            cod_cidade, 
                            cidade, 
                            cidcompleta 
                      FROM 
                            listabrasil 
                      WHERE 
                            cidade LIKE '%Aj%' 
                      ORDER BY 
                            cidade ASC");

    while ($x = $CON->Fetch ($q))
    {
        $XML = simplexml_load_file('http://ws.somarmeteorologia.com.br/previsao.php?Cidade='.$x['cidade'].'&DiasPrevisao=15');
        print $x['cidade']."\n";    
        foreach ($XML->Previsao as $P)
        {   
            $Previsao[$x['cidade']]['data'][] = (string)$P->Data;
            $Previsao[$x['cidade']]['tmin'][] = (float) $P->Tmin;
            $Previsao[$x['cidade']]['tmax'][] = (float) $P->Tmax;
            $Previsao[$x['cidade']]['prec'][] = (float) $P->Prec;
            $Previsao[$x['cidade']]['velvento'][] = (float) $P->VelVento;
            $Previsao[$x['cidade']]['dirvento'][] = (string)$P->DirVento;
        }
    }

    foreach ($Previsao as $Cid => $Dados) 
    {
        $col = 1;
        for($dias = 0; $dias < 15 ; $dias++)
        {
            $PlanilhaBloomberg->setCellValue($colunas[$col+0].'2', $Dados['data'][$dias]);
            $PlanilhaBloomberg->setCellValue($colunas[$col+0].$l, $Dados['tmin'][$dias].'C');
            $PlanilhaBloomberg->setCellValue($colunas[$col+1].$l, $Dados['tmax'][$dias].'C');
            $PlanilhaBloomberg->setCellValue($colunas[$col+2].$l, $Dados['prec'][$dias].'mm');
            $PlanilhaBloomberg->setCellValue($colunas[$col+3].$l, $Dados['velvento'][$dias].'km/h');
            $PlanilhaBloomberg->setCellValue($colunas[$col+4].$l, $Dados['dirvento'][$dias]);

            print $Dados['data'][$dias]."\n";
            print $Dados['tmin'][$dias]."\n";
            print $Dados['tmax'][$dias]."\n";
            print $Dados['prec'][$dias]."\n";
            print $Dados['velcento'][$dias]."\n";
            print $Dados['dirvento'][$dias]."\n";

            $col = $col + 5;
        }
        $l++;
    }

不要担心setCellValue,它只是来自PHPExcel库。因此,从我可以收集到的内容来看,由于它从XML收集的大量数据显然需要花费很长时间才能执行,而且因为它不断填充多维数组$ Previsao ..我希望实现的目标(没有成功,我可以添加)是直接填充setCellValue,而不需要多维数组。你们认为它是否可能,如果是的话,会减少脚本的exec_time吗?

先谢谢大家的帮助,如果这个问题过于集中,也请原谅我,不确定这是否会引起问题。

2 个答案:

答案 0 :(得分:0)

PHPExcel通常需要很长时间来设置CeCellValues。它们可能是更好地解决代码的最佳解决方案,但我不认为它会在运行时产生过大的差异。在保存文件之前尝试setPreCalculateFormulas(False),以便PHPExcel不会在保存时计算值。这可能会节省一些时间。第二,假设$ PlanilhaBloomberg是$ object-&gt; getActiveSheet(),你可以这样称呼它

SELECT CONCAT(first_name,middle_name,last_name),COUNT(*)-1 AS duplicatedusernameid 
FROM users HAVING COUNT(*) > 1

这可能会有所帮助。

答案 1 :(得分:0)

你正在迭代数据库结果,为每个数据库结果迭代xml,以便在内存中构建一个大数组;然后迭代该数组以构建Excel工作表....当然应该可以避免构建大数组;数组的内存很昂贵,并且为该数组分配内存也花费了大量的时间开销。

应该可以直接从XML循环填充Excel,避免整个数组构建(这节省了内存和内存分配时间)并保存了整个循环。

实际上只是确定哪个单元格需要从哪个XML值填充;但我无法设想阵列结构可以解决这个问题