2
<?php
    // DB Connection here
    mysql_connect("localhost","root","");
    mysql_select_db("hitnrunf_db");

    $select = "SELECT * FROM jos_users ";
    $export = mysql_query ( $select ) or die ( "Sql error : " . mysql_error( ) );
    $fields = mysql_num_fields ( $export );

    for ( $i = 0; $i < $fields; $i++ )
    {
        $header .= mysql_field_name( $export , $i ) . "\t";
    }

    while( $row = mysql_fetch_row( $export ) )
    {
        $line = '';
        foreach( $row as $value )
        {
            if ( ( !isset( $value ) ) || ( $value == "" ) )
            {
                $value = "\t";
            }
            else
            {
                $value = str_replace( '"' , '""' , $value );
                $value = '"' . $value . '"' . "\t";
            }
            $line .= $value;
        }
        $data .= trim( $line ) . "\n";
    }
    $data = str_replace( "\r" , "" , $data );

    if ( $data == "" )
    {
        $data = "\n(0) Records Found!\n";
    }

    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=your_desired_name.xls");
    header("Pragma: no-cache");
    header("Expires: 0");
    print "$header\n$data";
?>

上面的代码用于从 MySQL 数据库生成 Excel 电子表格,但我们收到以下错误:

您尝试打开的文件“users.xls”的格式与文件扩展名指定的格式不同。在打开文件之前,请确认文件没有损坏并且来自受信任的来源。您现在要打开文件吗?

问题是什么,我们该如何解决?

4

7 回答 7

5

您并没有真正生成 Excel 文件。您正在使用制表符作为分隔符生成相当于 .csv 文件的内容。

要生成“真正的”Excel 文件,请使用PHPExcel

于 2010-04-26T16:01:31.643 回答
1

问题是当 Excel 看到以 .xls 结尾的文件时,它希望该文件符合其 BIFF 标准。您的代码不会生成符合 BIFF 的文件。如果您愿意,我可以为您提供生成符合 BIFF 的文件的 PHP 函数,但是在这里发布太长了。

于 2010-04-26T13:28:31.997 回答
1

您似乎正在生成一个带有制表符分隔字段的文件,并且在您的标题中声称这与二进制 Excel 电子表格使用的格式相同。它不是 Excel 使用的格式。加载电子表格的程序让你知道你在误导别人——可能只是你自己。

您可能应该考虑使用 CSV 文件等导出格式;从制表符分隔转换为逗号分隔并不难。

于 2010-04-26T13:29:27.603 回答
0

尝试 PEAR 的(PHP 扩展和应用程序存储库)Spreadsheet_Excel_Writer。我用它来生成 BIFF 格式的 Excel 文件。

于 2010-05-03T04:25:26.873 回答
0

您的程序正在寻找与.xls您输出的完全不同的标准文档。您的程序输出一个制表符分隔的工作表,它是一个.txt文件。尝试将程序从制表符切换为逗号作为分隔符并保存为.csv(逗号分隔值)。

于 2010-05-03T04:33:52.927 回答
0

如果你只是要创建一个制表符分隔的文件,为什么不跳过 PHP 让 MySQL 为你做SELECT INTO OUTFILE呢?

PHP 可以处理下载部分。将 Content-type 标头设置为 text/plain。Excel 知道如何打开它。

于 2010-04-26T16:05:48.553 回答
0

修改代码以使用纯 CSV,然后将文件作为以 .csv 结尾的文件名和内容类型 text/csv 返回到浏览器。

我以前见过有人尝试这样做,但它只适用于某些特定版本的 Office Excel。它不适用于具有其他电子表格程序或每个版本的 Excel 的其他平台。使用标准文件格式,或者至少以 Excel 期望的方式生成包含 XLS 数据的正确 OLE2 复合文档文件,如果您要将文件作为该文件类型发送到浏览器。

于 2010-04-26T16:12:11.397 回答