2014-12-16 4 views
12

Я работаю над проектом в Symfony 2.1.PHPExcel версии 1.8.0. Я использую Doctrine для извлечения данных из Db и фильтра, если это необходимо.PHPExcel - Неправильная совокупность данных во время генерации отчета excel

$em = $this->getDoctrine()->getManager(); 
    $guardquery = $em->createQueryBuilder() 
      ->select('g.attendancePopupTime', 'd.atmName', 'd.region', 'd.zone', 'd.state') 
      ->from('ATMMonitorAPIBundle:GuardMonitor', 'g') 
      ->innerJoin('ATMMonitorAPIBundle:DeviceAtmInfo', 'd', Join::WITH, 'd.deviceId = g.deviceId'); 

    if ($userZones[0]['userZones'] != '0') { 
     $guardquery->innerJoin('ATMMonitorAPIBundle:RegisteredDevices', 'r', Join::WITH, 'r.deviceId = g.deviceId') 
       ->where('r.deviceZone IN (:devicezone)') 
       ->setParameter('devicezone', $zone_array); 
    } 

    if (isset($dateLow)) { 
     $guardquery->andWhere('g.attendancePopupTime BETWEEN :date_low and :date_high') 
       ->setParameter('date_low', $dateLow) 
       ->setParameter('date_high', $dateHigh); 
    } 

    $finalAttendanceQuery = $guardquery->getQuery(); 
    $attendanceResult = $finalAttendanceQuery->getArrayResult(); 

Это мой запрос и давать переменные 2014-12-1 как $ dateLow и 2014-12-8 как $ dateHigh, запрос возвращает 122 строк. В базе данных имеется 579 строк. Данные, возвращаемые после фильтрации, являются правильными, и я могу вставить их в Excel, используя следующий код.

$phpExcelObject = $this->get('phpexcel')->createPHPExcelObject(); 
     $phpExcelObject->getProperties()->setCreator("") 
     ->setLastModifiedBy("Administrator") 
     ->setTitle("ATTENDANCE DETAILS XLSX") 
     ->setSubject("ATTENDANCE DETAILS XLSX") 
     ->setDescription("EXCEL document for Attendance Details"); 
     $phpExcelObject->setActiveSheetIndex(0); 
     $phpExcelObject->getActiveSheet()->setTitle('GUARD_ATTENDANCE - DETAILS'); 
     $phpExcelObject->getActiveSheet() 
     ->SetCellValue('A3', "STATE") 
     ->SetCellValue('B3', "ZONE") 
     ->SetCellValue('C3', "REGION") 
    ->SetCellValue('D3', "DATE") 

    ->SetCellValue('A1', "GUARD ATTENDANCE RECORDS"); 
    $count = count($attendanceResult); 
    $rowCount = 4; 

    for ($i = 0; $i < $count; $i++) { 
    $phpExcelObject->getActiveSheet()->SetCellValue('A' . $rowCount, $attendanceResult[$i]['state']); 
    $phpExcelObject->getActiveSheet()->SetCellValue('B' . $rowCount, $attendanceResult[$i]['zone']); 
    $phpExcelObject->getActiveSheet()->SetCellValue('C' . $rowCount, $attendanceResult[$i]['region']); 
    if ($attendanceResult[$i]['attendancePopupTime'] instanceof \DateTime) { 
      $attendanceDate = $attendanceResult[$i]['attendancePopupTime']->format('d-m-Y'); 
     } 
    $phpExcelObject->getActiveSheet()->SetCellValue('D' . $rowCount, $punchTime);     
    $phpExcelObject->getActiveSheet()->SetCellValue('E' . $rowCount, count($attendanceResult)); 
    $rowCount++ 
    } 

    $writer = $this->get('phpexcel')->createWriter($phpExcelObject, 'Excel5'); 
    $response = $this->get('phpexcel')->createStreamedResponse($writer); 

    $response->headers->set('Content-Type', 'text/vnd.ms-excel; charset=utf-8'); 
    $response->headers->set('Content-Disposition', 'attachment;filename=AttendanceDetails.xls'); 

    $response->headers->set('Pragma', 'public'); 
    $response->headers->set('Cache-Control', 'maxage=1'); 
    return $response; 

Переменная $ count имеет значение 122 перед входом в цикл for. В генерируемом excel имеется 579 строк (всего данных, доступных в БД) данных вместо 122 строк, полученных после фильтрации. Столбец E excel также показывает значения 579 вместо 122. Цикл for также выполняется в 579 раз вместо 122 раз. Некоторые, как, массив $ attendanceResult изменяется при вставке данных в phpExcel.

Я попытался сохранить содержимое $ attendanceResult в другой массив и использовать этот массив для вставки данных в excel. Та же проблема существует и там. Пожалуйста, помогите, как я не мог найти ничего плохого с code.Thanks в Advance

+0

Попробуйте сделать foreach ($ attendanceResult как $ row). – Belac

+0

@Belac: Сделал это. Цикл все еще выполняется 579 раз. – Basher51

+0

Нечетный. Вы уверены, что запрос исключает строки на основе даты? Вы можете посмотреть http://stackoverflow.com/questions/11553183/select-entries-between-dates-in-doctrine-2 – Belac

ответ

0

«Данные фильтруется должным образом, и я получил отфильтрованный массив, но массив меняется, когда он экспортируется в PHPExcel -»

Не допускайте, чтобы фильтр был отфильтрован до отладки или var_dump. Выполнение предположений не поможет вам или нам, просто невозможно, что вы говорите. PS: На этот вопрос уже ответил владелец сообщения.

0
$phpExcelObject->getActiveSheet()->setCellValueExplicit('A'.$row_count,$row['Value'], PHPExcel_Cell_DataType::TYPE_STRING); 

Попробуйте ввести код в неверную строку популяции, а также измените формат excel на .xlsx. Вы можете сделать это с помощью phpExcel.

Смежные вопросы