PHPExcel - неправильное заполнение данных во время создания отчета Excel

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

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

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

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


person Basher51    schedule 16.12.2014    source источник
comment
Возможно, попробуйте выполнить foreach($attendanceResult as $row).   -  person Belac    schedule 16.12.2014
comment
@Belac: Сделал это. Цикл по-прежнему выполняется 579 раз.   -  person Basher51    schedule 16.12.2014
comment
Странный. Вы уверены, что запрос исключает строки на основе даты? Вы можете посмотреть stackoverflow. ком/вопросы/11553183/   -  person Belac    schedule 16.12.2014
comment
@Belac: данные отфильтрованы правильно, и я получил отфильтрованный массив, но массив изменяется при экспорте в phpexcel.   -  person Basher51    schedule 16.12.2014
comment
@Belac: Иногда нас дергают за волосы из-за глупых вещей. Обнаружил ошибку. phpExcel работал правильно, но формы для фильтра даты на веб-сайте отправляли нулевые значения, поэтому фильтр не работал должным образом, поэтому отчет генерировался для всех строк в таблице..ааа!   -  person Basher51    schedule 17.12.2014
comment
Тогда было бы неплохо удалить или ответить на свой вопрос. Эта тема по-прежнему отображается в списке неотвеченных.   -  person C4d    schedule 17.01.2015


Ответы (3)


«Данные отфильтрованы правильно, и я получил отфильтрованный массив, но массив изменяется при экспорте в phpexcel —»

Не думайте, что он правильно отфильтрован, пока вы не отладите его или не выполните var_dump. Предположения не помогут ни вам, ни нам, то, о чем вы говорите, просто невозможно. P.S. На этот вопрос уже ответил автор поста.

person Nawfal Serrar    schedule 16.03.2015

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

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

person Hasitha    schedule 13.12.2017

Для вас и тех, кто ищет реализацию экспорта Excel в PHP

Вы можете использовать его наиболее рекомендуемую альтернативу — электронные таблицы Php (документация по таблицам Php).

person Jhon Martin    schedule 20.08.2019