0

我想将数据从 mysql 表导出到 excel 表。我正在使用 excel 2007。一旦这段代码正常工作,但今天我遇到了问题。请指导我哪里做错了。我有大约 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

您将收到该消息,因为该文件不是 OfficeOpenXML xlsx 文件,而是包含扩展名为 .xlsx 的 HTML 标记的文件。您告诉 Excel 文件是扩展名的一种格式,而实际上它是另一种格式,它让您知道内容与扩展名不匹配。只要它可以干净地读取 HTML 标记,它应该仍然可以成功加载,但总是会发出此消息。

较新版本的 Excel 比早期版本对此更加挑剔。

如果您想删除该消息,则要么将 .xlsx 重命名为 .html 文件,以便扩展名与内容匹配(然后您需要导入 Excel,或者调整文件关联以便打开 html 文件使用 Excel);或者给它一个带有 csv 扩展名的制表符分隔值文件(可以通过双击打开),尽管您不能使用此选项添加任何格式;或者给它一个真正的 OfficeOpenXML .xlsx 文件

于 2012-09-21T09:39:41.733 回答
0

首先:告诉我们一些关于错误的事情!

我建议您执行以下两个步骤之一(或两者)。

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

首先,您应该将输出放在缓冲区变量中,而不是一直回显或打印。

之后你应该阅读你自己的评论 -> //set_time_limit(60); // 如果你有很多数据,你可以启用它

于 2012-09-21T08:01:14.237 回答
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 回答