Код (Text): Response Headers Cache-Control post-check=0, pre-check=0 Connection keep-alive Content-Encoding gzip Content-Length 3550 Content-Type text/html; charset=utf-8 Date Sat, 10 Mar 2018 14:50:17 GMT Expires Mon, 1 Jan 2001 00:00:00 GMT Last-Modified Sat, 10 Mar 2018 14:50:17 GMT P3P CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM" Pragma no-cache Server nginx Vary Accept-Encoding --- Добавлено --- на всякий случай и вот это ещё Код (Text): Request Headers Accept text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Accept-Encoding gzip, deflate Accept-Language ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,uk;q=0.6
Ну что, по ходу, где-то твои заголовки почему-то перезаписываются, и браузер думает, что ему дали HTML. Теперь надо найти где.
Вот что даёт, если использую mysql соединение, тут всё чётко. Код (Text): Cache-Control must-revalidate Connection keep-alive Content-Description File Transfer Content-Disposition attachment; filename=AvtoPro.xlsx Content-Length 14232 Content-Transfer-Encoding binary Content-Type application/octet-stream Date Sat, 10 Mar 2018 17:00:45 GMT Expires 0 Pragma public Server nginx
так, эксперименты продолжаются дальше... построил я подключение через PDO..... такая же фигня. Ну реально меняется только драйвер подключения!!!! вот попробуем так. Приведу части кода которые я меняю. Это через mysql. Работает идеально! PHP: mysql_connect($host, $user, $password); if (!mysql_connect($host, $user, $password)){ echo "<h2>MySQL Error!</h2>"; exit; } mysql_select_db($db); $price_a = mysql_query("SELECT DISTINCT `BRAND` , `NUMBER` , `NAME` , `KOLVO` , `PRICE_EURO` , `jpg` FROM `price` JOIN `amortizators` ON `SIMPLE_NUMBER` = `search`"); $array = array(); for($i = 0; $row = mysql_fetch_assoc($price_a); $i++){ $array[$i] = $row; } Это через PDO. Не работает скачивание файла, он открывается! Но файл создаётся с данными из БД как надо. PHP: $array = array(); try { $dbh = new PDO("mysql:host=$host;dbname=$db",$user,$password); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "SELECT DISTINCT `BRAND` , `NUMBER` , `NAME` , `KOLVO` , `PRICE_EURO` , `jpg` FROM `price` JOIN `amortizators` ON `SIMPLE_NUMBER` = `search`"; $i = 0; foreach ($dbh->query($sql) as $row){ $array[$i] = $row; $i++; } $dbh = null; }catch(PDOException $e){ echo $e->getMessage(); } Это через mysqli. Не работает скачивание файла, он открывается! Но файл создаётся с данными из БД как надо. PHP: $link = mysqli_connect($host, $user, $password, $db); /* проверка соединения */ if (mysqli_connect_errno()) { printf("Не удалось подключиться: %s\n", mysqli_connect_error()); exit(); } /* изменение набора символов на utf8 */ if (!mysqli_set_charset($link, "utf8")) { printf("Ошибка при загрузке набора символов utf8: %s\n", mysqli_error($link)); } else { //printf("Текущий набор символов: %s\n", mysqli_character_set_name($link)); } $price_avtopro = "SELECT DISTINCT `BRAND` , `NUMBER` , `NAME` , `KOLVO` , `PRICE_EURO` , `jpg` FROM `price` JOIN `amortizators` ON `SIMPLE_NUMBER` = `search`"; $price_a = $link->query($price_avtopro); $array = array(); for($i = 0; $row = $price_a->fetch_assoc(); $i++){ $array[$i] = $row; } Может я что-то упускаю? Даже пробовал обнулить header - безрезультатно! PHP: header('Content-Type:', true);
Не знаю, такую задачу я решал миллион раз, а библиотекой mysql не пользовался ни разу в жизни, поскольку она была устаревшей, когда я только начал. Приводите не полные тексты
Да, я знаю что она устаревшая, но этому коду 8 лет. Вот решил апгрейд провести и столкнулся с проблемой. Хорошо, чуть позже напишу полностью код файлов, которые участвуют в исполнении
С этого файла я нажимаю на ссылку и дальше идёт переход на файл формирования файла PHP: header('Content-type: text/html; charset=utf-8'); echo '<link rel="stylesheet" type="text/css" href="css/main.css" />'; echo '<script src="js/scripts.js"></script>'; date_default_timezone_set ( 'Europe/Kiev' ); //установка временной зоны require_once "db/connect_db_load_mysqli.php"; //Подключаем БД require_once "functions.php"; //Подключаем файл функций <a href="download_test.php?test=KONI.xlsx"><img src="img/test.jpg"></a> Это коннектор к БД PHP: $link = mysqli_connect($host, $user, $password, $db); /* проверка соединения */ if (mysqli_connect_errno()) { printf("Не удалось подключиться: %s\n", mysqli_connect_error()); exit(); } /* изменение набора символов на utf8 */ if (!mysqli_set_charset($link, "utf8")) { printf("Ошибка при загрузке набора символов utf8: %s\n", mysqli_error($link)); } else { //printf("Текущий набор символов: %s\n", mysqli_character_set_name($link)); } В этом файле идёт формирование xlsx файла PHP: header('Content-Type:', true); require_once "db/connect_db_load_mysqli.php"; //Подключаем БД //require_once "db/connect_db_load_pdo.php"; //Подключаем БД require_once 'PHPExcel.php'; //require_once "functions.php"; //Подключаем файл с функциями setlocale(LC_ALL, 'ru_RU'); /*получение наценки*/ //$margin = margin('specopt'); $price_avtopro = "SELECT DISTINCT `BRAND` , `NUMBER` , `NAME` , `KOLVO` , `PRICE_EURO` , `jpg` FROM `price` JOIN `amortizators` ON `SIMPLE_NUMBER` = `search`"; $price_a = $link->query($price_avtopro); $array = array(); for($lichnik = 0; $row = $price_a->fetch_assoc(); $lichnik++){ $array[$lichnik] = $row; } $priceFromDB = $array; $catList = $priceFromDB; echo "<pre>"; print_r($catList); echo "</pre>"; $inputFileName = 'template/template.xlsx'; //загружаем шаблон $document = PHPExcel_IOFactory::load($inputFileName); $sheet = $document->setActiveSheetIndex(0); // Выбираем первый лист в документе $first_string = 9; //начальная строка вставки данных $sheet->setCellValue('A'.$first_string, 'Производитель'); $sheet->setCellValue('B'.$first_string, 'Артикул'); $sheet->setCellValue('C'.$first_string, 'Товар'); $sheet->setCellValue('D'.$first_string, 'Спецдилерская цена за шт.'); $sheet->setCellValue('E'.$first_string, 'Кол-во в наличии'); $sheet->getStyle('A9:E9')->getFont()->setName('Arial'); $sheet->getStyle('A9:E9')->getFont()->setSize(10); $sheet->getStyle('A9:E9')->getFill()->setFillType(PHPExcel_Style_Fill::FILL_SOLID); //заливка шапки таблицы $sheet->getStyle('A9:E9')->getFill()->getStartColor()->setRGB('aed2a9'); //цвет ячеек в шапке таблицы $sheet->getStyle('A9:E9')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); //выравнивание по горизонтали $sheet->getStyle('A9:E9')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); //выравнивание по вертикали $sheet->getStyle('D9:E9')->getAlignment()->setWrapText(true); //перенос текста $i = 10; //начальная строка вставки данных foreach ($catList as $catItem) { $proc = 10; // количество процентов наценки для S-Car //$proc = $margin; // количество процентов наценки для S-Car $number = $catItem['PRICE_EURO']; // число к которому надо добавить проценты $proc = $number/100*$proc; // высчитываем процент от числа $result = $number + $proc; // суммируем число с процентами от этого числа $sheet->setCellValue('A'.$i, 'Амортизатор KONI'); $sheet->setCellValue('B'.$i, $catItem['NUMBER']); $sheet->setCellValue('C'.$i, $catItem['NAME']); $sheet->setCellValueExplicit('D'.$i, round($result, 2),PHPExcel_Cell_DataType::TYPE_STRING); $sheet->setCellValue('E'.$i, '2'); $sheet->getStyle('D'.$i.':E'.$i)->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $sheet->getStyle('D'.$i.':E'.$i)->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER); $sheet->getStyle('C'.$i)->getAlignment()->setWrapText(true); $i++; } $sheet->getStyle('A9:E'.--$i)->getBorders()->getAllBorders()->setBorderStyle(PHPExcel_Style_Border::BORDER_THIN); //рамка $objWriter = PHPExcel_IOFactory::createWriter($document, 'Excel2007'); $objWriter->save("KONI.xlsx"); //$objWriter->save("ТЕСТ прайс KONI.xlsx"); $file = $_GET['test']; if (ob_get_level()) { ob_end_clean(); } header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); //header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); header('Content-Disposition: attachment; filename=' . basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); readfile($file); exit;