Ошибка логической последовательности PHPExcel

#php #codeigniter #foreach #phpexcel

#php #codeigniter #foreach #phpexcel

Вопрос:

Я использую PHPExcel версии 1.8.0 вместе с CodeIgniter, и то, что я пытаюсь сделать, это клонировать и заполнить 3 разных листа:

  public function generateReport($obra, $todosEnsayes, $pNombre) {



    $this->load->library('PHPExcel/PHPExcel');


    $objPHPexcel = new PHPExcel();


    $objReader = PHPExcel_IOFactory::createReader('Excel2007');
    $objPHPexcel = $objReader->load('application/plantillas_excel/reporte_grafico2.xlsx');

    $objPHPexcel->getProperties()
                      ->setCreator('New system'                )
                      ->setLastModifiedBy('NewSystem'         )
                      ->setTitle('NewSystem'  )
                      ->setSubject('NewSystem')
                      ->setDescription('NewSystem')
                      ->setKeywords("Excel Office 2007 openxml php"    )
                      ->setCategory("NewSystem"       );  



    $hoja = 0;
    $inicial = 18;
    $arrayNumero = array();
    $arrayValor = array();
    $arrayNombre = array();
    $arrayValor2 = array();
    $arrayDesv = array();

    $tramo = 'TRAMO: KM '.$obra->km_inicial.' '.$obra->mt_inicial.' - '.$obra->km_final  .' '.$obra->mt_final;

    foreach($todosEnsayes as $key=>$ensaye) { 

          if (($key % 20) == 0)
          {
            $newSheet = clone $objPHPexcel->getSheetByName("PLANTILLA1");
            $newSheet->setTitle('GRAF SYC-LL');
            $objPHPexcel->setActiveSheetIndex($hoja);
            $objWorksheet = $objPHPexcel->getActiveSheet();
            $objWorksheet
            ->setCellValue('A6', "Obra:".$obra->objeto)
            ->setCellValue('A7', "Tramo:".$tramo);
            $objWorksheet
            ->setCellValue('A'.$inicial, $key)
            ->setCellValue('B'.$inicial, '35')
            ->setCellValue('C'.$inicial, 'SYC 2A CPA PRUEBA')
            ->setCellValue('D'.$inicial, '35')
            ->setCellValue('E'.$inicial, '1.72'); 
            array_push($arrayNumero, $key);
            array_push($arrayValor, '35');
            array_push($arrayNombre, 'SYC 2A CPA PRUEBA');
            array_push($arrayValor2, '35');
            array_push($arrayDesv, '1.72');



            $this->generarImagen($arrayNumero,$arrayValor,$arrayNombre,$arrayValor2,$arrayDesv);

            $objDrawing = new PHPExcel_Worksheet_Drawing();
            $objDrawing->setWorksheet($objWorksheet);
            $objDrawing->setName("name");
            $objDrawing->setDescription("Description");
            $objDrawing->setPath('imagefile.png');
            $objDrawing->setCoordinates('I8');
            $objDrawing->setOffsetX(1);
            $objDrawing->setOffsetY(5);


            $arrayNumero = array();
            $arrayValor = array();
            $arrayNombre = array();
            $arrayValor2 = array();
            $arrayDesv = array();
            $objPHPexcel->addSheet($newSheet, $hoja);

            $inicial = 18;
          }
          else
          {
            $newSheet = clone $objPHPexcel->getSheetByName("PLANTILLA1");
            //$newSheet->setTitle('GRAF SYC-LL');
            //$objPHPexcel->addSheet($newSheet, $hoja);
            $objPHPexcel->setActiveSheetIndex($hoja);
            $objWorksheet = $objPHPexcel->getActiveSheet();
            $objWorksheet
            ->setCellValue('A6', "Obra:".$obra->objeto)
            ->setCellValue('A7', "Tramo:".$tramo);
            $objWorksheet
            ->setCellValue('A'.$inicial, $key)
            ->setCellValue('B'.$inicial, '35')
            ->setCellValue('C'.$inicial, 'SYC 2A CPA PRUEBA')
            ->setCellValue('D'.$inicial, '35')
            ->setCellValue('E'.$inicial, '1.72'); 

            array_push($arrayNumero, $key);
            array_push($arrayValor, '35');
            array_push($arrayNombre, 'SYC 2A CPA PRUEBA');
            array_push($arrayValor2, '35');
            array_push($arrayDesv, '1.72');

            $inicial  ;
          }

    }

    $this->generarImagen($arrayNumero,$arrayValor,$arrayNombre,$arrayValor2,$arrayDesv);

            $objDrawing = new PHPExcel_Worksheet_Drawing();
            $objDrawing->setWorksheet($objWorksheet);
            $objDrawing->setName("name");
            $objDrawing->setDescription("Description");
            $objDrawing->setPath('imagefile.png');
            $objDrawing->setCoordinates('I8');
            $objDrawing->setOffsetX(1);
            $objDrawing->setOffsetY(5);


            $arrayNumero = array();
            $arrayValor = array();
            $arrayNombre = array();
            $arrayValor2 = array();
            $arrayDesv = array();

    $hoja  ;

    foreach($todosEnsayes as $key=>$ensaye) { //SE RECORREN LOS ENSAYES

          if (($key % 20) == 0)
          {
            $newSheet = clone $objPHPexcel->getSheetByName("PLANTILLA2");
            $newSheet->setTitle('GRAF SYC-CBR');
            $objPHPexcel->setActiveSheetIndex($hoja);
            $objWorksheet = $objPHPexcel->getActiveSheet();
            $objWorksheet
            ->setCellValue('A6', "Obra:".$obra->objeto)
            ->setCellValue('A7', "Tramo:".$tramo);
            $objWorksheet
            ->setCellValue('A'.$inicial, $key)
            ->setCellValue('B'.$inicial, '40')
            ->setCellValue('C'.$inicial, 'SYC 2A CPA PRUEBA')
            ->setCellValue('D'.$inicial, '40')
            ->setCellValue('E'.$inicial, '1.50');

            array_push($arrayNumero, $key);
            array_push($arrayValor, '35');
            array_push($arrayNombre, 'SYC 2A CPA PRUEBA');
            array_push($arrayValor2, '35');
            array_push($arrayDesv, '1.72');



            $this->generarImagen($arrayNumero,$arrayValor,$arrayNombre,$arrayValor2,$arrayDesv);

            $objDrawing = new PHPExcel_Worksheet_Drawing();
            $objDrawing->setWorksheet($objWorksheet);
            $objDrawing->setName("name");
            $objDrawing->setDescription("Description");
            $objDrawing->setPath('imagefile.png');
            $objDrawing->setCoordinates('I8');
            $objDrawing->setOffsetX(1);
            $objDrawing->setOffsetY(5);


            $arrayNumero = array();
            $arrayValor = array();
            $arrayNombre = array();
            $arrayValor2 = array();
            $arrayDesv = array(); 

            $objPHPexcel->addSheet($newSheet, $hoja);

            $inicial = 18;
          }
          else
          {
            $newSheet = clone $objPHPexcel->getSheetByName("PLANTILLA2");
            //$newSheet->setTitle('GRAF SYC-LL');
            //$objPHPexcel->addSheet($newSheet, $hoja);
            $objPHPexcel->setActiveSheetIndex($hoja);
            $objWorksheet = $objPHPexcel->getActiveSheet();
            $objWorksheet
            ->setCellValue('A6', "Obra:".$obra->objeto)
            ->setCellValue('A7', "Tramo:".$tramo);
            $objWorksheet
            ->setCellValue('A'.$inicial, $key)
            ->setCellValue('B'.$inicial, '40')
            ->setCellValue('C'.$inicial, 'SYC 2A CPA PRUEBA')
            ->setCellValue('D'.$inicial, '40')
            ->setCellValue('E'.$inicial, '1.50'); 

            array_push($arrayNumero, $key);
            array_push($arrayValor, '35');
            array_push($arrayNombre, 'SYC 2A CPA PRUEBA');
            array_push($arrayValor2, '35');
            array_push($arrayDesv, '1.72');

            $inicial  ;
          }

    }

    $this->generarImagen($arrayNumero,$arrayValor,$arrayNombre,$arrayValor2,$arrayDesv);

            $objDrawing = new PHPExcel_Worksheet_Drawing();
            $objDrawing->setWorksheet($objWorksheet);
            $objDrawing->setName("name");
            $objDrawing->setDescription("Description");
            $objDrawing->setPath('imagefile.png');
            $objDrawing->setCoordinates('I8');
            $objDrawing->setOffsetX(1);
            $objDrawing->setOffsetY(5);


            $arrayNumero = array();
            $arrayValor = array();
            $arrayNombre = array();
            $arrayValor2 = array();
            $arrayDesv = array();

    $hoja  ;

    foreach($todosEnsayes as $key=>$ensaye) { //SE RECORREN LOS ENSAYES

          if (($key % 20) == 0)
          {
            $newSheet = clone $objPHPexcel->getSheetByName("PLANTILLA3");
            $newSheet->setTitle('GRAF SYC-EXP');
            $objPHPexcel->setActiveSheetIndex($hoja);
            $objWorksheet = $objPHPexcel->getActiveSheet();
            $objWorksheet
            ->setCellValue('A6', "Obra:".$obra->objeto)
            ->setCellValue('A7', "Tramo:".$tramo);
            $objWorksheet
            ->setCellValue('A'.$inicial, $key)
            ->setCellValue('B'.$inicial, '35')
            ->setCellValue('C'.$inicial, 'SYC 2A CPA PRUEBA')
            ->setCellValue('D'.$inicial, '35')
            ->setCellValue('E'.$inicial, '1.72'); 

            $objPHPexcel->addSheet($newSheet, $hoja);

            array_push($arrayNumero, $key);
            array_push($arrayValor, '35');
            array_push($arrayNombre, 'SYC 2A CPA PRUEBA');
            array_push($arrayValor2, '35');
            array_push($arrayDesv, '1.72');



            $this->generarImagen($arrayNumero,$arrayValor,$arrayNombre,$arrayValor2,$arrayDesv);

            $objDrawing = new PHPExcel_Worksheet_Drawing();
            $objDrawing->setWorksheet($objWorksheet);
            $objDrawing->setName("name");
            $objDrawing->setDescription("Description");
            $objDrawing->setPath('imagefile.png');
            $objDrawing->setCoordinates('I8');
            $objDrawing->setOffsetX(1);
            $objDrawing->setOffsetY(5);


            $arrayNumero = array();
            $arrayValor = array();
            $arrayNombre = array();
            $arrayValor2 = array();
            $arrayDesv = array();

            $inicial = 18;
          }
          else
          {
            $newSheet = clone $objPHPexcel->getSheetByName("PLANTILLA3");
            //$newSheet->setTitle('GRAF SYC-LL');
            //$objPHPexcel->addSheet($newSheet, $hoja);
            $objPHPexcel->setActiveSheetIndex($hoja);
            $objWorksheet = $objPHPexcel->getActiveSheet();
            $objWorksheet
            ->setCellValue('A6', "Obra:".$obra->objeto)
            ->setCellValue('A7', "Tramo:".$tramo);
            $objWorksheet
            ->setCellValue('A'.$inicial, $key)
            ->setCellValue('B'.$inicial, '35')
            ->setCellValue('C'.$inicial, 'SYC 2A CPA PRUEBA')
            ->setCellValue('D'.$inicial, '35')
            ->setCellValue('E'.$inicial, '1.72'); 

            array_push($arrayNumero, $key);
            array_push($arrayValor, '35');
            array_push($arrayNombre, 'SYC 2A CPA PRUEBA');
            array_push($arrayValor2, '35');
            array_push($arrayDesv, '1.72');

            $inicial  ;
          }

    }

    $this->generarImagen($arrayNumero,$arrayValor,$arrayNombre,$arrayValor2,$arrayDesv);

            $objDrawing = new PHPExcel_Worksheet_Drawing();
            $objDrawing->setWorksheet($objWorksheet);
            $objDrawing->setName("name");
            $objDrawing->setDescription("Description");
            $objDrawing->setPath('imagefile.png');
            $objDrawing->setCoordinates('I8');
            $objDrawing->setOffsetX(1);
            $objDrawing->setOffsetY(5);


            $arrayNumero = array();
            $arrayValor = array();
            $arrayNombre = array();
            $arrayValor2 = array();
            $arrayDesv = array();

    //$objPHPexcel->removeSheetByIndex(0); /* SE ELIMINA LA PLANTILLA */
    //$objPHPexcel->setActiveSheetIndex(0);


    $objWriter = PHPExcel_IOFactory::createWriter($objPHPexcel, 'Excel5');
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="Reporte.xls"'); 
    header('Cache-Control: max-age=0');
    $objWriter->save('php://output');



 }
  

Я получаю результаты на 3 типах листов, которые у меня есть в моем файле Excel. Проблема с этим фрагментом кода заключается в том, что в некоторых частях документа появляется «0», особенно в ячейке 11 со значениями из других итераций foreach, за исключением третьей итерации foreach, которая имеет все правильные значения.

введите описание изображения здесь

введите описание изображения здесь

Каждый foreach заполняет один тип листа, поэтому я нахожу странным, что первый foreach смешивает значения второго foreach, когда он еще не достиг этого кода.

РЕДАКТИРОВАТЬ: я воссоздал последовательность, и, похоже, я обнаружил проблему, возможно, связанную, возможно, нет, в самый первый раз, когда код вводит первый «foreach», он также вводит первое предложение «if» и выводит значение, даже если первое значение в ($ key) равно 0:

 if (($key % 20) == 0)
 {
 }
  

Ответ №1:

Используйте новое имя переменной для каждого клонированного $newsheet, возможно, клон оставляет некоторую остаточную информацию по ссылке из предыдущего клона в $newssheet.

Комментарии:

1. Нет кубиков. У меня те же результаты. Попробовал использовать новый var для каждого «foreach» и объявлять их с самого начала (как глобальные).

Ответ №2:

Казалось бы, условие, которое я искал, не было

 if (($key % 20) == 0)
 {
 }
  

Я заменил его на счетчик таким образом, потому что он всегда вводился, когда значение было равно 0.

 counter = 0;
    if ($counter == 20)
     {
     }
    //Do stuff
    //Clear counter
    $counter = 0;