在PHP中打印Excel文件

时间:2012-10-25 21:09:43

标签: php excel xls

所以我有一个应用程序运行的多个实例,一个用于2008,2009,2010 ... 2012.所有这些都有一个功能,您可以下载一堆数据的.XLS报告。出于某种原因,通过应用程序下载时,XLS文件正在被破坏。你可以将pdf移动到webroot,下载它,它会打开就好了,但当你试图通过download.php?file=29320f9je下载它时,Excel表示它没有识别文件' s格式,并喷出垃圾(我们的数据应该是什么,只是在unicode垃圾中)

除了应用程序和标题之外,还有其他任何人遇到此问题并提出其他建议吗?因为2010年和2012年之间的代码应该没问题。

使用示例:

用户生成报告。可以通过上述方法正确查看。实际方法如下:

用户点击链接到"下载文件" (report.retrieve.download.htm?file=2390jsf

report.retrieve.download.htm

$file = $_GET['file'];

$tempfile = new tempfile(''); // open tempfile class, argument is name of report

if ($tempfile->set_filename($file) === false)
        $tempfile->error_report('4026','',"Filename: $file",'Y');

if ($tempfile->send_file() === false)
        $tempfile->error_report('4027','',"Filename: $file",'Y');

相关功能

public function send_file() {
            $file = $this->get_full_filename();
            if (file_exists($file)===FALSE)
                    return FALSE;
            if ($this->send_headers($file)===FALSE)
                    return FALSE;
            $this->output_file($file);
            return TRUE;
    }

并且所有重要的标题都起作用..

public function send_headers($filename) {
            if (headers_sent()===TRUE)
                    return FALSE;
            if (isset($_SERVER['HTTP_USER_AGENT']) && preg_match("/MSIE/", $_SERVER['HTTP_USER_AGENT'])) {
                    // IE Bug in download name workaround
                    ini_set( 'zlib.output_compression','Off' );
            }
            /*
            $fInfo = new finfo(FILEINFO_MIME);
            $type = $fInfo->file($filename);
            $stats = stat($filename);
            $size = $stats['size'];
            */
            $output_filename = $this->get_output_filename();

            if (eregi('csv$', $this->get_output_filename())) {
                    header("Content-type: text/csv");
                    //header("Content-Size: $size");
                    header("Pragma: public");
                    header("Content-Disposition: attachment; filename=$output_filename");
            }
            elseif (eregi('htm$', $this->get_output_filename()))
                    header("Content-type: text/html");
            else {
                    header("Content-type: application/vnd.ms-excel");
                    //header("Content-Size: $size");
                    header("Pragma: public");
                    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
                    header("Content-Disposition: attachment; filename=$output_filename");
            }
            return TRUE;
    }

1 个答案:

答案 0 :(得分:0)

另一个文件有一个尾随换行符;一个包括一个包含的。我没有写这个应用程序,但是那些选择使用关闭PHP标记(?>)并最终得到其中一个愚蠢错误的人。

zipp@zeratul htdocs]# echo '<?php foreach (glob("*.php") as $file){if (preg_match( "/\\?".">\\s\\s+\\Z/m", file_get_contents($file))) echo("$file\n");} ?>' | php
config.class.php