¿Cómo se puede insertar la fórmula en la hoja de Excel usando phpexcel?

Revisé muchos sitios para encontrar la solución a mi problema pero no encontré la solución adecuada. Quiero insertar una fórmula que calculará el total de calificaciones obtenidas por los estudiantes. Las marcas serán ingresadas por los maestros. Escribí el código php que está descargando el archivo Excel después de insertar los nombres de los estudiantes de la base de datos y maxmarks. Mi archivo de Excel se ve así. Vea amablemente la imagen, ya que no tengo 10 reputación. No tengo permiso para insertar una imagen en una publicación, por favor, siga este enlace http://img.rephp.com/php/Capture.JPG La columna de Marks está en blanco, donde el docente las marcas de otros datos se obtienen de la base de datos y la columna Porcentaje necesita una fórmula que calculará las marcas automáticamente cuando el maestro ingrese las marcas. La columna llena y la columna Porcentaje están protegidas. Yo usando PHPExcel. Aquí está el código php que está generando este archivo de Excel

='2014-04-01' AND `pre_todate` array( 'outline' => array( 'style' => PHPExcel_Style_Border::BORDER_THIN, 'color' => array('argb' => '000000'), ), ), 'fill' => array( 'type' => PHPExcel_Style_Fill::FILL_SOLID, 'color' => array('rgb' => '686868') ) ); $F=$objPHPExcel->getActiveSheet(); $G=$objPHPExcel->setActiveSheetIndex(0); $G->getProtection()->setSheet(true); // for 1st row heading subject heading setting $objPHPExcel->getActiveSheet()->mergeCells("A1:B1")->setCellValueByColumnAndRow(0,1, "Subject"); $objPHPExcel->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('A1:B1')->applyFromArray($styleArray); $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(40); // for 2nd row heading subject heading setting $objPHPExcel->getActiveSheet()->mergeCells("A2:B2")->setCellValueByColumnAndRow(0,2, "Term"); $objPHPExcel->getActiveSheet()->getStyle('A2')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('A2:B2')->applyFromArray($styleArray); $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(40); // for 3rd row heading subject heading setting $objPHPExcel->getActiveSheet()->mergeCells("A3:B3")->setCellValueByColumnAndRow(0,3, "Exam"); $objPHPExcel->getActiveSheet()->getStyle('A3')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('A3:B3')->applyFromArray($styleArray); $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(40); // for 4th row heading subject heading setting $objPHPExcel->getActiveSheet()->setCellValue('A4', "ROLL"); $objPHPExcel->getActiveSheet()->getStyle('A4')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('A4')->applyFromArray($styleArray); $objPHPExcel->getActiveSheet()->setCellValue('B4', "NAME"); $objPHPExcel->getActiveSheet()->getStyle('B4')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle('B4')->applyFromArray($styleArray); //subject list setting $row=1; $coumnStart=1; $subjectCtr=0; foreach($subjects as $subject) { $coumnStart++; $StartcolumnIndex=PHPExcel_Cell::stringFromColumnIndex($coumnStart); $EndcolumnIndex = PHPExcel_Cell::stringFromColumnIndex(($coumnStart-1) + 13); // 1st row $objPHPExcel->getActiveSheet()->mergeCells($StartcolumnIndex.$row.':'.$EndcolumnIndex.$row)->setCellValueByColumnAndRow($coumnStart,1, $subject); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.$row)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.$row.':'.$EndcolumnIndex.$row)->applyFromArray($styleArray); // 2nd row for Term1 $EndcolumnIndex2 = PHPExcel_Cell::stringFromColumnIndex(($coumnStart-1) + 6); $objPHPExcel->getActiveSheet()->mergeCells($StartcolumnIndex.($row+1).':'.$EndcolumnIndex2.($row+1))->setCellValueByColumnAndRow($coumnStart,2, 'TERM 1'); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+1).':'.$EndcolumnIndex2.($row+1))->applyFromArray($styleArray); //for FA1 Sem setting param $semIndex=$coumnStart; $EndcolumnIndex2 = PHPExcel_Cell::stringFromColumnIndex(($semIndex-1) + 2); $objPHPExcel->getActiveSheet()->mergeCells($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->setCellValueByColumnAndRow($semIndex,3, 'FA1'); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->applyFromArray($styleArray); $semIndex=$semIndex+2; //for FA2 $StartcolumnIndex = PHPExcel_Cell::stringFromColumnIndex($semIndex); $EndcolumnIndex2 = PHPExcel_Cell::stringFromColumnIndex(($semIndex-1) + 2); $objPHPExcel->getActiveSheet()->mergeCells($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->setCellValueByColumnAndRow($semIndex,3, 'FA2'); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->applyFromArray($styleArray); $semIndex=$semIndex+2; //for SA1 $StartcolumnIndex = PHPExcel_Cell::stringFromColumnIndex($semIndex); $EndcolumnIndex2 = PHPExcel_Cell::stringFromColumnIndex(($semIndex-1) + 2); $objPHPExcel->getActiveSheet()->mergeCells($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->setCellValueByColumnAndRow($semIndex,3, 'SA1'); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->applyFromArray($styleArray); $semIndex=$semIndex+2; // for Term2 $StartcolumnIndex2=PHPExcel_Cell::stringFromColumnIndex(($coumnStart) + 6); $EndcolumnIndex2 = PHPExcel_Cell::stringFromColumnIndex($coumnStart + 12); $objPHPExcel->getActiveSheet()->mergeCells($StartcolumnIndex2.($row+1).':'.$EndcolumnIndex2.($row+1))->setCellValueByColumnAndRow($coumnStart+6,2, 'TERM 2'); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex2.($row+1))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex2.($row+1).':'.$EndcolumnIndex2.($row+1))->applyFromArray($styleArray); //FA3 $StartcolumnIndex = PHPExcel_Cell::stringFromColumnIndex($semIndex); $EndcolumnIndex2 = PHPExcel_Cell::stringFromColumnIndex(($semIndex-1) + 2); $objPHPExcel->getActiveSheet()->mergeCells($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->setCellValueByColumnAndRow($semIndex,3, 'FA3'); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->applyFromArray($styleArray); $semIndex=$semIndex+2; //FA4 $StartcolumnIndex = PHPExcel_Cell::stringFromColumnIndex($semIndex); $EndcolumnIndex2 = PHPExcel_Cell::stringFromColumnIndex(($semIndex-1) + 2); $objPHPExcel->getActiveSheet()->mergeCells($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->setCellValueByColumnAndRow($semIndex,3, 'FA4'); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->applyFromArray($styleArray); $semIndex=$semIndex+2; //SA2 $StartcolumnIndex = PHPExcel_Cell::stringFromColumnIndex($semIndex); $EndcolumnIndex2 = PHPExcel_Cell::stringFromColumnIndex(($semIndex-1) + 2); $objPHPExcel->getActiveSheet()->mergeCells($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->setCellValueByColumnAndRow($semIndex,3, 'SA2'); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($StartcolumnIndex.($row+2).':'.$EndcolumnIndex2.($row+2))->applyFromArray($styleArray); $semIndex=$semIndex+2; // every 13th column total marks & precentage $totalMarksColumIndex=PHPExcel_Cell::stringFromColumnIndex($coumnStart + 12); $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($coumnStart+12,3, 'TOTAL MARKS'); $objPHPExcel->getActiveSheet()->getStyle($totalMarksColumIndex.($row+2))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($totalMarksColumIndex.($row+2))->applyFromArray($styleArray); $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($coumnStart+12,4, 'PERCENTAGE'); $objPHPExcel->getActiveSheet()->getStyle($totalMarksColumIndex.($row+3))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($totalMarksColumIndex.($row+3))->applyFromArray($styleArray); $objPHPExcel->getActiveSheet()->getColumnDimension($totalMarksColumIndex)->setWidth(20); // putting marks column heading $flag=1; for($i=$coumnStart;$igetActiveSheet()->setCellValueByColumnAndRow($i,4, 'MARKS'); $objPHPExcel->getActiveSheet()->getStyle($MarksheadingIndex)->getProtection()->setLocked(PHPExcel_Style_Protection::PROTECTION_UNPROTECTED); } else { $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($i,4, 'MAXMARKS'); // setting the max marks for($j=5;$jgetActiveSheet()->setCellValueByColumnAndRow($i,$j, $Sa1Sa2marks); } else if($flag==2 || $flag==8) { $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($i,$j, 40); } else { $objPHPExcel->getActiveSheet()->setCellValueByColumnAndRow($i,$j, 20); } } } $objPHPExcel->getActiveSheet()->getStyle($MarksheadingIndex.($row+3))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle($MarksheadingIndex.($row+3))->applyFromArray($styleArray); $objPHPExcel->getActiveSheet()->getColumnDimension($MarksheadingIndex)->setWidth(15); $flag++; } $coumnStart=($coumnStart-1)+13; $subjectCtr++; } // putting students name with rollno $Line=5; foreach($totalStudents as $student){//extract each record $studentName= $student['pre_name']; if($student['pre_fathersoccupation']!=''){$studentName.=' '.$student['pre_fathersoccupation'];} if($student['pre_motheroccupation']!=''){$studentName.=' '.$student['pre_motheroccupation'];} $objPHPExcel->getActiveSheet()->setCellValue('A'.$Line, $student['admissionnumber']); $objPHPExcel->getActiveSheet()->setCellValue('B'.$Line, $studentName); ++$Line; } header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="newFile.xlsx"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('php://output'); ?> 

Si algún experto me guía cómo puedo hacerlo, estaré agradecido con todos ellos

Lea la sección 4.6.4 de la documentación del desarrollador y ejemplos como 03formulas.php .

Puedes escribir una fórmula como la escribirías en Excel, simplemente almacena la fórmula con el prefijo = en la celda

p.ej

 $objPHPExcel->getActiveSheet() ->setCellValue( 'E10', '=SUM(A10:E9)' ); 

Escribirá la fórmula =SUM(A10:E9) en la celda E10

Al escribir una fórmula en una celda, recuerda que:

  • El separador decimal es (período)
  • El separador de argumento de función es , (coma)
  • El separador de filas Matrix es ; (punto y coma)
  • Se deben usar nombres de funciones en inglés

EDITAR

 for ($row = 1; $row < = 10; $row++) { $objPHPExcel->getActiveSheet() ->setCellValue( 'J' . $row, '=SUM(A'.$row.':C'.$row.')/10 + SUM(D'.$row.':F'.$row.')/20 + SUM (G'.$row.':I'.$row.')/60' ); } 

@Mark Baker Gracias por mostrar la forma en que lo intenté y lo hice así:

 $calculatRow=''; for($ctr=0;$ctr < count($marksColumnArr);$ctr++) { $calculatRow.='(($'.$marksColumnArr[$ctr].'##/$'.$maXmarksColumnArr[$ctr].'$##)*'.$divisionVal[$ctr].')+'; } $calculateArrbyRow=substr($calculatRow,0,-1); // Replicate formula by row for($j=5;$jgetActiveSheet()->setCellValue($cell.$j, '='.$formula); } $coumnStart=($coumnStart-1)+13; $subjectCtr++; }