0

mysqlテーブルからExcelシートにデータをエクスポートしたい。私はExcel2007を使用しています。このコードが正しく機能していたのですが、今日は問題が発生しています。私が間違っているところを教えてください。私は約60,000行の膨大なデータを持っています。

<?php
/* 
Export MySQL to Excel using PHP & HTML tables
Author: Vlatko Zdrale, http://blog.zemoon.com

Look but don't touch :)
*/
    include "mysql_connection.php";
    //$dbTable = 'info';            // table name
    $con=open_db_connection();


    $sql = "select info_id, name, category_list.category, company_name, company_address, company_phone, date from info, city_list, category_list where city=cid and info.category=id";
    $result = @mysql_query($sql)    or die("Couldn't execute query:<br>".mysql_error().'<br>'.mysql_errno());

    header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');   //define header info for browser
    header('Content-Disposition:attachment; filename=information-'.date('Ymd').'.xlsx');
    header('Pragma: no-cache');
    header('Expires: 0');

    echo '<table><tr>';
    for ($i = 0; $i < mysql_num_fields($result); $i++)   // show column names as names of MySQL fields
        echo '<th>'.mysql_field_name($result, $i).'</th>';
    print('</tr>');

    while($row = mysql_fetch_row($result))
    {
        //set_time_limit(60); // you can enable this if you have lot of data
        $output = '<tr >';
        for($j=0; $j<mysql_num_fields($result); $j++)
        {
            if(!isset($row[$j]))
                $output .= '<td>&nbsp;</td>';
            else
                $output .= "<td>$row[$j]</td>";
        }
        print(trim($output))."</tr>\t\n";
    }
    echo('</table>');
?>

その非常に重要な私を導いてください。前もって感謝します。

4

5 に答える 5

1

ファイルはOfficeOpenXMLxlsxファイルではなく、拡張子が.xlsxのHTMLマークアップを含むファイルであるため、このメッセージが表示されます。ファイルが実際には別の形式であるのに、拡張子が1つの形式であることをExcelに伝えているので、内容が拡張子と一致しないことがわかります。HTMLマークアップをきれいに読み取ることができる限り、正常に読み込まれるはずですが、常にこのメッセージが発行されます。

最近のバージョンのExcelは、以前のバージョンよりもこれについて厄介です。

メッセージを削除したい場合は、拡張子がコンテンツと一致するように.xlsxの名前を.htmlファイルに変更するか(Excelにインポートする必要があります)、またはファイルの関連付けを変更してhtmlファイルを開きます。 Excelを使用); または、csv拡張子の付いたタブ区切りの値ファイル(ダブルクリックで開くことができます)を指定しますが、このオプションを使用してフォーマットを追加することはできません。または、実際のOfficeOpenXML.xlsxファイルを指定します

于 2012-09-21T09:39:41.733 に答える
0

まず、出力をバッファ変数に入れて、エコーや出力を完全に行わないようにする必要があります。

その後、あなたはあなた自身のコメントを読むべきです-> // set_time_limit(60); //データがたくさんある場合は、これを有効にできます

于 2012-09-21T08:01:14.237 に答える
0

まず第一に:エラーについて何か教えてください!

次の2つの手順のいずれか(または両方)を実行することをお勧めします。

set_time_limit(60); 
// increase this value to 300 (means the server doesn't timeout for 5 minutes)

ini_set('memory_limit','512M');
// increases the memory limit to 512 MB
于 2012-09-21T08:02:02.457 に答える
0

行ではなく列の間に「\t」を使用してみてください。Excelでネイティブのオフセット/マージンが作成されます。また、自分自身を混乱させないためのより良い標準として、中括弧付きのforループを使用することをお勧めします。

于 2012-09-21T08:03:09.457 に答える
0

あなたのコメントから、何かがマークアップを台無しにしていると思います。

<th></th>との間のすべてで<tr></tr>、使用してみてくださいhtmlentities

for ($i = 0; $i < mysql_num_fields($result); $i++)   // show column names as names of MySQL fields
    echo '<th>'.htmlentities(mysql_field_name($result, $i),ENT_COMPAT,"UTF-8").'</th>';

if(is_null($row[$j]))
     $output .= '<td>&nbsp;</td>';
else
     $output .= "<td>".htmlentities($row[$j],ENT_COMPAT,"UTF-8")."</td>";

エンコーディングはUTF-8であると想定していることに注意してください。

于 2012-09-21T09:33:01.153 に答える