2017-05-29 3 views
0

私は、以下の機能をいくつかのmysqlデータを取得し、CSV/Excelとしてダウンロードするはずの場所にオンラインで見つけました。それは仕事の一種ですが、ユーザーのブラウザでファイルをダウンロードする代わりに、データを応答ストリームの最後にダンプし、他のすべてのページの内容がブラウザウィンドウの一番下に表示されます。私は間違って何をしていますか?ダウンロードCSVは単にページレスポンスでCSVコンテンツを出力します

重要:ExcelのコンテンツタイプをCSVに変更しても、それは違いはなく、技術的には実際にはExcelコンテンツではありませんが、同じ結果が得られます。

function DownloadQueryToCSV($sql, $filename){ 
    $result = mysql_query($sql) or die("Couldn't execute query:<br>" . mysql_error(). "<br>" . mysql_errno()); 
    $file_ending = "xls"; 
    header("Content-Type: application/xls");  
    header("Content-Disposition: attachment; filename=$filename.xls"); 
    header("Pragma: no-cache"); 
    header("Expires: 0"); 
    $sep = "\t"; //tabbed character 

    for ($i = 0; $i < mysql_num_fields($result); $i++) { 
     echo mysql_field_name($result,$i) . "\t"; 
    } 
    print("\n");  

    while($row = mysql_fetch_row($result)) 
    { 
     $schema_insert = ""; 
     for($j=0; $j<mysql_num_fields($result);$j++) 
     { 
      if(!isset($row[$j])) 
       $schema_insert .= "NULL".$sep; 
      elseif ($row[$j] != "") 
       $schema_insert .= "$row[$j]".$sep; 
      else 
       $schema_insert .= "".$sep; 
     } 
     $schema_insert = str_replace($sep."$", "", $schema_insert); 
     $schema_insert = preg_replace("/\r\n|\n\r|\n|\r/", " ", $schema_insert); 
     $schema_insert .= "\t"; 
     print(trim($schema_insert)); 
     print "\n"; 
    } 
    die(); // WARNING: Must die at end of function, else other page contents will end up in spreadsheet!! 
} 

司会:これは、Excelとは何の関係もない、とmysql to excel formatting issues

+0

'mysql'は廃止予定です。 PHPのバージョン5.5から削除する –

+0

[mysqlをフォーマットする問題を解決するためにmysqlを複製する](https://stackoverflow.com/questions/22580848/mysql-to-excel-formatting-issues) –

+0

rtfmと "ヘッダー呼び出しを書き込む "?ありがとう。 – HerrimanCoder

答えて

0

の重複していないExcelのコンテンツタイプは、ここに記載されている使用してみてください:What is a correct mime type for docx, pptx etc?

.xls  application/vnd.ms-excel 

それがない場合には十分に、これを追加してみてください(CSVはテキストです)。

Content-Transfer-Encoding: binary 
+0

ありがとうございます。私が持っていたもう一つの問題は、他のページコンテンツがロードされた後にファイルをストリーミングすることでした。ページコンテンツの前にファイルをストリーミングすると、うまくいきました。 – HerrimanCoder

関連する問題