2017-06-30 53 views
0

phpexcelで生成されたExcelファイルをダウンロードしようとしています。私はphpexcelの例 "Simple download xlsx"を使用しています。phpexcel - ダウンロードファイルが破損する

私はthis SO questionと同じ概念を使用しています。

私はphpファイルをPOSTクライアントから呼び出しています。ヘッダーを一切渡しません。コードの下に使用する:

MessageService.invokePostRequest( 
      "/rest/testphpexcel1.php", 
      function(returnedResponse){ 

       var data_type  = 'application/vnd.ms-excel'; 
       var excelDoc = new Blob([returnedResponse], { 
        type: data_type 
       }); 
       var url = window.URL.createObjectURL(excelDoc); 
       var exportLink = new core.Element('a'); 
       exportLink.setAttribute('href', url); 
       exportLink.setAttribute('download', this.filename + '.xlsx'); 
       exportLink.trigger('click'); 
       //adding some delay in removing the dynamically created link solved the problem in FireFox 
       setTimeout(function() { 
        window.URL.revokeObjectURL(url); 
       }, 0); 


      }.bind(this),{data: JSON.stringify(postData)} 
ここ

MessageService.invokePostRequestはアヤックスのラッパーです。サーバー側では

私はphpコードの下にきた:

// Create new PHPExcel object 
    $objPHPExcel = new PHPExcel(); 

    // Set document properties 
    $objPHPExcel->getProperties()->setCreator("Maarten Balliauw") 
           ->setLastModifiedBy("Maarten Balliauw") 
           ->setTitle("Office 2007 XLSX Test Document") 
           ->setSubject("Office 2007 XLSX Test Document") 
           ->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.") 
           ->setKeywords("office 2007 openxml php") 
           ->setCategory("Test result file"); 


    // Add some data 
    $objPHPExcel->setActiveSheetIndex(0) 
       ->setCellValue('A1', 'Hello') 
       ->setCellValue('B2', 'world!') 
       ->setCellValue('C1', 'Hello') 
       ->setCellValue('D2', 'world!'); 

    // Miscellaneous glyphs, UTF-8 
    $objPHPExcel->setActiveSheetIndex(0) 
       ->setCellValue('A4', 'Miscellaneous glyphs'); 

    // Rename worksheet 
    $objPHPExcel->getActiveSheet()->setTitle('Simple'); 


    // 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-Disposition: attachment;filename="01simple.xlsx"'); 
    header('Content-Transfer-Encoding: binary'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 

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

は、ここで私は、クライアントとサーバーの両方の側に Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheetてみました。

私は(Chromeの開発ツールからの)レスポンスヘッダの下に取得しています:

cache-control:must-revalidate 
connection:Keep-Alive 
content-disposition:attachment;filename="01simple.xlsx" 
content-length:6309 
content-transfer-encoding:binary 
content-type:text/html; charset=UTF-8 
date:Fri, 30 Jun 2017 13:51:40 GMT 
keep-alive:timeout=5, max=100 
pragma:public 
server:Apache/2.4.6 (CentOS) PHP/5.4.16 
x-powered-by:PHP/5.4.16 

content-lengthから、私はそこにいくつかのデータがあると応答]タブで、私はいくつかのちんぷんかんぷんのテキストを見ることができると仮定します。しかし、その応答はExcelファイルに正しく変換されていないと私は思う。

ファイルは常にダウンロードされています。ファイルを開くと、「予期しないトークンPがJSONの位置0にあります」というテキストが表示されます。

私はここで何が間違っているのか分かりません。 phpexcelによって生成された適切なExcelファイルをダウンロードするにはどうすればよいですか?

+0

は、なぜあなたは( 'namee.xls')セーブ・' $ objWriter->を使用して、サーバー上のExcelファイルを保存していけませんか? –

+0

@ HuyTrhnh私はサーバーへの書き込み権限がありません。この作業を '$ objWriter-> save( 'php:// output');'? – Valay

答えて

1

追加のヘッダーを使用してください。それは私のために機能します。そしてjsなしでphpで開こうとする。 phpが正しければ、jsスクリプトでエラーを見つけてみてください。その後、URLからそれをダウンロード `;

header('Content-Type: application/vnd.ms-excel'); 
header('Content-Disposition:attachment;filename="01simple.xls"'); 
header('Cache-Control: max-age=0'); 
header('Cache-Control: max-age=1'); 

header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); 
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); 
header ('Cache-Control: cache, must-revalidate'); 
header ('Pragma: public'); 
関連する問題