0

PHP で Excel ファイルを読み取り、その内容をクライアントに送信したいと考えています。私が本当にやりたいことは、コンテンツ タイプを変更することです。他の html ヘッダーは、コンテンツを表示する代わりに、ブラウザにファイルをダウンロードさせます。すべて問題なく、ユーザーはファイルをダウンロードできますが、ファイルを開こうとすると、コンテンツが正しい形式と形状で表示されません。私の頭に浮かぶのは、ユニコード文字列で応答を送信するべきではなく、Excelがそれを認識できるバイナリ形式で送信する必要があるということです。これは私の現在のコードです:

$filename = $_GET['file'];
        $ext = $_GET['type'];
        $filename .= '.' . $ext;
        $path = "../generatedReports/" . $filename;
        header('Content-type: application/vnd.ms-excel;');
        header('Content-Disposition: attachment; filename=' . $filename);
        header("Pragma: public");
        header("Expires: 0");
        header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
        header("Cache-Control: public", false);
        header("Content-Description: File Transfer");
        header("Accept-Ranges: bytes");
        header("Content-Transfer-Encoding: binary");
        header("Content-Length: " . filesize($path));
        $size = filesize($path);
        $f = fopen($path, 'r');
        $content = fread($f, $size);
        echo $content;

解決策はありますか?

4

2 に答える 2

0

以下のコードで試してみてください。

echo unicode2utf8(hexdec("00CE")); // Result: Î

// Or the function that will recognize U+ in front of string, and will skip it to show the character
function unicodeCodePointToChar($str) {
    if (substr($str,0,2) != "U+") return $str;
    $str = substr($str,2); // Skip U+
    return unicode_to_utf8(array(hexdec($str)));
}
echo unicodeCodePointToChar("U+00CE"); // Result: Î
于 2013-02-06T05:39:09.187 に答える
0

私の問題はこの回答で解決されました。コードを次のように変更しました。

$filename = $_GET['file'];
            $ext = $_GET['type'];
            $filename .= '.' . $ext;
            $path = "../generatedReports/" . $filename;
            header('Content-type: application/vnd.ms-excel;');
            header('Content-Disposition: attachment; filename=' . $filename);
            header("Pragma: public");
            header("Expires: 0");
            header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
            header("Cache-Control: public", false);
            header("Content-Description: File Transfer");
            header("Accept-Ranges: bytes");
            header("Content-Transfer-Encoding: binary");
            ob_clean();   // discard any data in the output buffer (if possible)
            flush();      // flush headers (if pos
            readfile($path);

そしてすべてがうまくいきました。

于 2013-02-06T13:03:40.277 に答える