Я пытался экспортировать свои данные для распространения листа, и он отлично работал в моем локальном хосте, но когда я загружал его на сервер, он всегда загружал файлы с нечитаемым контентом. Написание кода здесь.
На моем сервере уже установлены php_xml, php_zip и gd. Загруженный файл только для чтения.
error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); date_default_timezone_set('Europe/London'); if (PHP_SAPI == 'cli') die('This example should only be run from a Web Browser'); /** Include PHPExcel */ require_once dirname(__FILE__) . '/lib/PHPExcel.php'; // Create new PHPExcel object $objPHPExcel = new PHPExcel(); // Set document properties $objPHPExcel->getProperties()->setCreator("test") ->setLastModifiedBy("test") ->setTitle("test Report") ->setSubject("test Report") ->setDescription("test Report") ->setKeywords("test Report") ->setCategory("test Report"); //Title $objPHPExcel->getActiveSheet()->mergeCells('A1:J1'); $objPHPExcel->getActiveSheet()->getStyle('A1:J1')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $objPHPExcel->getActiveSheet()->getStyle("A1:J1")->getFont()->setSize(20); $styleArray = array( 'font' => array( 'bold' => true ) ); $objPHPExcel->getActiveSheet()->getStyle('A1:J1')->applyFromArray($styleArray); $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A1', 'test Report'); $objPHPExcel->getActiveSheet()->getRowDimension(1)->setRowHeight(30); // //Set Column headlines $objPHPExcel->setActiveSheetIndex(0) ->setCellValue('A2', 'First Name') ->setCellValue('B2', 'Last name') ->setCellValue('C2', 'State') ->setCellValue('D2', 'Email') ->setCellValue('E2', 'Mob') ->setCellValue('F2', 'address') ->setCellValue('G2', 'PIN') ->setCellValue('H2', 'status') ->setCellValue('I2', 'condition') ->setCellValue('J2', 'log'); $objPHPExcel->getActiveSheet()->getStyle("A2:J2")->getFont()->setSize(10); $objPHPExcel->getActiveSheet()->getStyle('A2:J2')->applyFromArray($styleArray); $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(15); $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(15); $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15); $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(18); $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(5); $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(7); $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(15); $objPHPExcel->getActiveSheet()->getColumnDimension('H')->setWidth(15); $objPHPExcel->getActiveSheet()->getColumnDimension('I')->setWidth(18); $objPHPExcel->getActiveSheet()->getColumnDimension('J')->setWidth(15); $colArray=array("A","B","C","D","E","F","G","H","I","J"); $rowNumber = 3; while ($row = mysqli_fetch_row($result)) { $col = 0; foreach($row as $cell) { $objPHPExcel->getActiveSheet()->setCellValue($colArray[$col].$rowNumber,$cell); $objPHPExcel->getActiveSheet()->getStyle($colArray[$col].$rowNumber)->getFont()->setSize(10); $col++; } $rowNumber++; } // Rename worksheet $objPHPExcel->getActiveSheet()->setTitle('test Report'); // Set active sheet index to the first sheet, so Excel opens this as the first sheet $objPHPExcel->setActiveSheetIndex(0); // Redirect output to a client's web browser (Excel2007) header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="testreport.xlsx"'); header('Cache-Control: max-age=0'); // If you're serving to IE 9, then the following may be needed header('Cache-Control: max-age=1'); // If you're serving to IE over SSL, then the following may be needed header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past header ('Last-Modified: '.gmdate('D, d MYH:i:s').' GMT'); // always modified header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1 header ('Pragma: public'); // HTTP/1.0 $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('php://output'); exit;
Я действительно не вижу проблемы с вашей основной логикой. Мне удалось сгенерировать файл xlsx с моей linux box с небольшими изменениями
require_once dirname ( FILE ). '/../Classes/PHPExcel/IOFactory.php';
Поскольку у меня нет Mysqli, соответствующего этому примеру, я изменил его на ..
$ row = array (1,2,3,4,5,6,7,8,9);
// while ($ row = mysqli_fetch_row ($ result)) {
В целом, я думаю, вам нужно убедиться, что данные mysqli действительны и вы правильно инициируете PHPExcel. Кроме этого, здесь я не вижу никаких проблем.
Я использовал ob_start () перед началом генерации документа, а затем закончил с ob_end_clean (), который разрешил мою проблему.