如何将mysql表数据导出到excel 2007

时间:2012-09-21 07:52:07

标签: php mysql excel

我想将数据从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>');
?>

非常重要的请指导我。提前谢谢。

5 个答案:

答案 0 :(得分:1)

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

与早期版本相比,更新版本的Excel对此更加挑剔。

如果你想要删除邮件,那么你要么将.xlsx重命名为.html文件,以便扩展名与内容匹配(那么你需要导入到Excel中,或者将文件关联模式化,以便html使用Excel打开文件);或者给它一个带有csv扩展名的标签分隔值文件(可以通过双击打开),但是你不能使用这个选项添加任何格式;或者给它一个真正的OfficeOpenXML .xlsx文件

答案 1 :(得分:0)

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

之后你应该阅读自己的评论 - &gt; //参数或者set_time_limit(60); //如果您有大量数据,可以启用此功能

答案 2 :(得分: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

答案 3 :(得分:0)

尝试在列之间使用“\ t”而不是行,它会在Excel中生成本机偏移/边距。 也可以更好地使用 for ring-braces 作为更好的标准,以免混淆自己。

答案 4 :(得分: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。