我想将数据从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> </td>';
else
$output .= "<td>$row[$j]</td>";
}
print(trim($output))."</tr>\t\n";
}
echo('</table>');
?>
非常重要的请指导我。提前谢谢。
答案 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> </td>';
else
$output .= "<td>".htmlentities($row[$j],ENT_COMPAT,"UTF-8")."</td>";
请注意,我假设您的编码为UTF-8。