#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;