Я использую PHPExcel, чтобы прочитать шаблон excel, заполнить данные и попросить пользователя загрузить файл.
generate_excel.php
$objPHPExcel = PHPExcel_IOFactory::load("./template.xlsx"); //populate data ... header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="01simple.xlsx"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); $objWriter->save('php://output');
Когда я открываю файл generate_excel.php непосредственно из браузера, загружается файл результатов. Но если я сделаю ajax-вызов для generate_excel.php, я не получаю приглашение загрузки. Используя инструменты разработчика Chrome, я вижу на вкладке «Сеть», что вызов ajax был успешно завершен, и в данных ответа видна куча случайных символов. Я предполагаю, что это объект excel.
Кто-нибудь знает, как я могу достичь функции excel для загрузки с помощью ajax? Я не хочу обновлять страницу. Когда пользователь нажимает кнопку «Экспорт», должен быть вызов ajax в php-файл и запрашивать загрузку пользователя.
Благодаря!
Я искал способы передать данные JSON с помощью ajax для PHP и вернуть файл excel (MySQL и PHPExcel) для сохранения пользователя. Я оглянулся и собрал несколько штук, надеюсь, что это может помочь кому-то:
JQuery:
$("#exportBotton").on("click",function(event) { event.preventDefault(); // create json object; str_json = JSON.stringify({"key01":val01, "key02":val02, "key03":val03}); $.ajax({ type: "post", data: str_json, url: "../../includes/dbSelect_agentFormExport.php", dataType: "json", success: function(output){ // output returned value from PHP t document.location.href =(output.url); } }); });
PHP:
$str_json = file_get_contents('php://input'); $objPHPExcel = new PHPExcel(); // here i populated objPHPExcel with mysql query result..... function saveExcelToLocalFile($objWriter){ // make sure you have permission to write to directory $filePath = '../tmp/saved_File.xlsx'; $objWriter->save($filePath); return $filePath; } $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); $response = array( 'success' => true, 'url' => saveExcelToLocalFile($objWriter) ); echo json_encode($response); exit();
Не все должно быть сделано с AJAX. Иногда простой старый HTML больше подходит для работы. Думаю, у вашей кнопки есть тег? Почему бы вам не сделать что-то подобное?
<a href="generate_excel.php" target="_blank">Export to Excel</a>
в вашем HTML? Обратите внимание на target="_blank"
. Он должен убедиться, что ваша страница не перезагружена.
Для input
вы можете использовать конструкцию
<form action="generate_excel.php" target="_blank"><input type="button">...whatever</form>
Я не думаю, что вы можете скачать что-либо по вызову ajax. Вместо того, чтобы вы могли генерировать и сохранять excel на сервере (временно) и показывать ссылку для загрузки пользователю.
Нашел способ сделать это, хотя я не уверен, что это идеальный подход.
Я добавил скрытый iframe на странице. Когда вызов ajax возвращается, он возвращает URL-адрес созданных данных. Я использовал javascript для перенаправления iframe на этот URL-адрес, который автоматически запускает действие загрузки.