【问题标题】:How to export mysql table data to excel 2007如何将mysql表数据导出到excel 2007
【发布时间】:2012-09-21 07:52:07
【问题描述】:

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

这很重要,请指导我。提前致谢。

【问题讨论】:

  • 你也有 Microsoft Access 吗?
  • 你遇到了什么问题?
  • @JMK 是的,我有 Microsoft Access 2007
  • @Passerby 它正在创建 .xlsx 文件并要求下载,但是当我在下载后打开文件时出现错误“无法打开文件文件格式或扩展名无效”

标签: php mysql excel


【解决方案1】:

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

较新版本的 Excel 在这方面比早期版本更挑剔。

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

【讨论】:

  • 是的,你是对的。但我只想要一个 OfficeOpenXML xlsx 我怎么能通过上面代码的简单修改来实现呢??
  • 你不能通过简单的代码修改来实现它,你需要使用 PHPExcel 之类的库来创建真正的 OfficeOpenXML 文件
  • 哦,谢谢,但现在我已经厌倦了代码,所以我只是使用 odbc 连接器将 excel 表与 mysql 连接起来。现在,当我在 mysql 表中一次又一次地更新数据时,不需要总是导出。 :)
【解决方案2】:

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

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

【讨论】:

  • 我是 php 新手,所以不知道如何将输出放入缓冲区变量中,请给我一个简单的例子
  • 只需在开头添加一个$output = '';,然后将echoprint 替换为$output .=,然后在末尾添加一个print $output;
【解决方案3】:

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

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

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

【讨论】:

  • 感谢您的建议,但我仍然遇到同样的错误。我已经添加了你推荐的两条线,但得到了同样的错误
【解决方案4】:

尝试在列而不是行之间使用 "\t",它会在 Excel 中生成本机偏移/边距。 最好使用 for 循环和花括号 作为一个更好的标准,以免自己混淆。

【讨论】:

    【解决方案5】:

    根据您的评论,我猜有些东西弄乱了标记。

    &lt;th&gt;&lt;/th&gt;&lt;tr&gt;&lt;/tr&gt; 之间的所有内容中,尝试使用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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2014-04-08
      • 2013-09-09
      • 2012-05-10
      • 2014-12-20
      • 1970-01-01
      相关资源
      最近更新 更多