2015-03-13 4 views
5

Я хотел скачать файл excel, сгенерированный с помощью PHPExcel. Я следил за кодом от PHPExcel Force Download Issue и безрезультатно. После того, как я зарегистрирую полученные данные, моя консоль показывает только эти символы. Однако, когда я меняю $objWriter->save('php://output'); на $objWriter->save('filename.xlsx');, он просто загружает файл в мою корневую папку на моем веб-сервере без каких-либо указаний на загрузку файла. Ниже приведен фрагмент кода для моего PHP файлаPHPExcel скачать файл

<?php 
$con = mysqli_connect('localhost', 'root', '', 'test'); 
mysqli_select_db($con, 'test'); 

$qry = "SELECT * FROM lostitem"; 
$res = mysqli_query($con, $qry); 

require_once '/Classes/PHPExcel.php'; 
include '/Classes/PHPExcel/Writer/Excel2007.php'; 

// Create new PHPExcel object 
$objPHPExcel = new PHPExcel(); 
/** Determine filename **/ 
$filename = "report.xlsx"; 

/** Set header information **/ 
header('Content-Type: application/vnd.ms-excel'); 
header('Content-Disposition: attachment;filename="' . $filename . '"'); 
header('Cache-Control: max-age=0'); 
$F=$objPHPExcel->getActiveSheet(); 
$Line=1; 
$F->setCellValue('A'.$Line, 'Lost Item ID'); 
$F->setCellValue('B'.$Line, 'Lost Item Title'); 
$F->setCellValue('C'.$Line, 'Lost Item Description'); 
while($Trs=mysqli_fetch_assoc($res)){//extract each record 
    ++$Line; 
    $F->setCellValue('A'.$Line, $Trs['LostItemID']); 
    $F->setCellValue('B'.$Line, $Trs['LostItemTitle']); 
    $F->setCellValue('C'.$Line, $Trs['LostItemDescription']);//write in the sheet 
    //++$Line; 
} 
// Redirect output to a client’s web browser (Excel5) 
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
header('Content-Disposition: attachment;filename="'.$filename.'"'); 
header('Cache-Control: max-age=0'); 

$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007'); 
$objWriter->save('php://output'); 
exit; 

?> 

Вот мой angularjs фрагмент кода:

$scope.getReport = function(type){ 
     if(type == 'lost'){ 
      $http.post("getLostItemReport.php") 
       .success(function(data, status, headers, config){ 
        console.log("Get report data: " + data); 
       }) 
     } 
     } 

Примечание: Я использую AngularJS $ http.post для вызова файла PHP.

Браузер: Google Chrome

EDIT: Я попытался пример кода PHP из PHPExcel 01simple-загрузки-xlsx.php и результат также же.

UPDATE: Я нашел решение, ища о получении AngularJS, принимая Excel в качестве ответа, но после загрузки она, кажется, что файл поврежден с текстом тарабарском или символов, подобной той, которая записывает в мой консоль. Кроме того, имя файла представляет собой случайный текст и цифры вместо имени файла, которое я назначил в моем php-коде. Код, как показано ниже:

var blob = new Blob([data], {type: "application/vnd.ms-excel"}); 
        var objectUrl = URL.createObjectURL(blob); 
+0

Добавить заголовок: http://stackoverflow.com/questions/8566196/phpexcel-to-download –

+0

Уже пробовал это. Вы можете увидеть их в моем коде в вопросах. – imationyj

+1

Это «тарабарщина» ___is___ файла Excel .... Оба xls и xlsx являются двоичными форматами .... и угловой не имеет понятия, что делать с необработанным двоичным потоком с типом контента 'application/vnd.ms-excel 'или' application/vnd.openxmlformats-officedocument.spreadsheetml.sheet –

ответ

2

Я нашел решение для загрузки с помощью AngularJS с возможностью изменения имени файла на лету. Нам нужно будет загрузить FileSave.js и включить в заголовок index.html. Фрагмент кода, как показано ниже:

main.js

$scope.fetchReport = function(){ 
      $http({ 
       url: 'path_to_php_file', 
       method: 'POST', 
       responseType: 'arraybuffer', 
       headers: { 
        'Content-type': 'application/json', 
        'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
       } 
      }).success(function(data){ 
       var blob = new Blob([data], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"}); 
       saveAs(blob, file_name_to_be+'.xlsx'); 
      }).error(function(){ 
       //Some error log 
      }); 
     } 

индекс.HTML

<button class="btn btn-primary" ng-click="fetchReport()">Get Report</button> 

PHP файл такой же, как в вопросе, нужно просто добавить несколько строк, прежде чем exit;

header('Content-disposition: attachment; filename='.$filename); 
header('Content-Length: ' . filesize($filename)); 
header('Content-Transfer-Encoding: binary'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 

//Replace php://output with $filename and add code below after that(before exit;) 
readfile($filename); 

Примечание: Это только для HTML5 suppported браузер.

+0

Это сработало для меня, спасибо! Если я могу добавить, строка '$ objWriter-> save ($ filename);' должна вызываться перед 'header ('Content-Length:'. Filesize ($ filename));' –

1

У вас есть файл первенствовать в правой стороне папки корня?

Итак, я думаю, вы можете использовать header('Location: path to your excel file'); Это должно помочь вам скачать файл.


Существует еще один вариант после $objWriter->save('filename.xlsx');echo json_encode(readfile($file)); добавить

в угловом JS использования кода

$scope.getReport = function (type) { 
if (type == 'lost') { 
    $http({ 
     url: 'getLostItemReport.php', 
     method: 'POST', 
     responseType: 'arraybuffer', 
     headers: { 
      'Content-type': 'application/json', 
      'Accept': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
     } 
    }) 
    .success(function (data, status, headers, config) { 
     var blob = new Blob([data], { 
      type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
     }); 
     var objectUrl = URL.createObjectURL(blob); 
     window.open(objectUrl); 
    }) 
} 

и установить header('Content-Type: application/vnd.ms-excel'); в header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');

Попробуйте это.

+0

Могу ли я узнать, куда это следует положить? – imationyj

+0

после '$ objWriter-> save ('filename.xlsx');' – itssajan

+0

Пробовал. Консоль по-прежнему выводит текст и символы тарабарщины. Если я удалю заголовок, который вы упомянули, то не будет текста таблеток и символов, только что файл будет сохранен в корневой папке сервера. EDIT: Я задаюсь вопросом, является ли это проблемой AngularJS или нет. hmm ... – imationyj

1

У меня есть очень простое решение, которое я использую на своем веб-сайте. Надеюсь, это сработает.

Создайте гиперссылку и установите href в свой файл excel и используйте атрибут загрузки.

<a href='file to excel' download='download'>Download Excel File</a> 

При нажатии этой ссылки файл начнет загрузку.

+0

Ницца! Это было бы обходным путем для моего проекта, если я все еще не смогу найти какое-либо решение для него. Мне просто нужно сначала сгенерировать файл на моем сервере и щелкнуть ссылку, чтобы загрузить файл, а не генерировать «на лету» и загрузить потом (что является проблемой для моего вопроса сейчас). Во всяком случае, спасибо за советы. :) – imationyj

Смежные вопросы