Я работаю над проектом в 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;
Переменная $ count имеет значение 122 перед входом в цикл for. В сгенерированном Excel содержится 579 строк (все данные доступны в БД) данных вместо 122 строк, полученных после фильтрации. Столбец E Excel также показывает значения 579 вместо 122. Цикл for также выполняется 579 раз вместо 122 раз. Как-то так, массив $ serveanceResult изменяется при вставке данных в phpExcel.
Я попытался сохранить содержимое $ ParticipanceResult в другой массив и использовать этот массив для вставки данных в Excel. Та же проблема существует и там.
Пожалуйста, помогите, так как я не могу найти что-то не так с кодом. Спасибо заранее
«Данные отфильтрованы правильно, и я получил отфильтрованный массив, но массив изменяется, когда он экспортируется в phpexcel -»
Не думайте, что он правильно отфильтрован, пока вы не отладите или не отредактируете его. Делать предположения не поможет ни вам, ни нам, просто невозможно сказать, что вы говорите.
PS: На этот вопрос уже ответил владелец поста.
$phpExcelObject->getActiveSheet()->setCellValueExplicit('A'.$row_count,$row['Value'], PHPExcel_Cell_DataType::TYPE_STRING);
Попробуйте приведенный выше код для неправильной строки населения, а также измените формат Excel на .xlsx. Вы можете сделать это с помощью phpExcel.