php 下载数据到excel表格 及编码问题

本文详细阐述了在使用PHP导出Excel文件时遇到的乱码问题,并提供了针对性的解决方案,包括解决文件名乱码和Excel内数据乱码的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自网络

PHP导出Excel文件时有两个主要的过程:

1、定义文件名

2、填充Excel数据

这两个过程中可能会出现一些PHP导出Excel乱码问题,下面我来说一下解决办法:

解决文件名的PHP导出Excel乱码:

乱码原因:客户使用的中文版Windows系统平台,而Windows平台的文件名编码为gb2312(gbk),而我们网页编码为了跟进现存潮流一般都采用utf-8(国际化)编码,这时当我们:header("Content-Disposition: inline; filename=\"" . $filename . ".xls\"")时就会出现乱码,假如你的网页编码就是gb2312那就不用考虑编码问题了。

解决办法:对$filename转码,执行:iconv('utf-8", "gb2312", $filename)。假如你的环境不支持iconv函数可以换别的函数,只要能将$filename的编码转为gbk就行。
但是这样问题又会来了,linux用户又会出现文件名乱码(因为linux平台文件名不是gbk编码)。

考虑到这个问题我采用两个办法:第一:放弃一部分客户,毕竟windows系统用户占绝大部分。第二:像gmail一样,提供两个下载地址。一个文件名gbk编码,一个文件名utf-8编码。

解决Excel内数据的PHP导出Excel乱码:

PHP导出Excel乱码原因:网页编码与Excel编码不一致。

解决办法:既然编码不一致,那让其一致了就OK了。定义Excel的字符集:header("Content-Type: application/vnd.ms-excel; charset=UTF-8"),看到charset=UTF-8了吧,让其与您网页编码一致即可解决Excel内数据乱码的问题了,这个比较简单!


经过简单测试  可用
第一种方式:

<?php
$DB_Server = "localhost"; 
$DB_Username = "username"; //用户名
$DB_Password = "password"; //用户密码
$DB_DBName = "dbname"; //数据库名
$DB_TBLName = "tablename"; //表名
$Connect = @mysql_connect($DB_Server, $DB_Username, $DB_Password) or die("Couldn't connect."); 
mysql_query('set names utf8'); //最好添加此处 否则汉字会乱码
$sql = "Select * from $DB_TBLName"; 
$ALT_Db = @mysql_select_db($DB_DBName, $Connect)or die("Couldn't select database"); 
$result = @mysql_query($sql,$Connect) or die(mysql_error()); 

$now_date = date('Y-m-d H:i');
$file_type = "vnd.ms-excel";
$file_ending = "xls";
header("Content-Type: application/$file_type");
header("Content-Disposition: attachment; filename=$now_date.$file_ending");
header("Pragma: no-cache");
header("Expires: 0");

$now_date = date('Y-m-d H:i');
$title = "数据库名:$DB_DBName,数据表:$DB_TBLName,备份日期:$now_date";
echo("$title\n"); 
$sep = "\t"; 
for ($i = 0; $i < mysql_num_fields($result); $i++) { 
	echo mysql_field_name($result,$i) . "\t";   //列名 字段名
} 
print("\n"); 
$i = 0; 
while($row = mysql_fetch_row($result)){
	$schema_insert = ""; 
	for($j=0; $j<mysql_num_fields($result);$j++){
		if(!isset($row[$j])) 
			$schema_insert .= "NULL".$sep; 
		elseif ($row[$j] != "") 
			$schema_insert .= "$row[$j]".$sep; 
		else 
			$schema_insert .= "".$sep; 
	} 
	$schema_insert = str_replace($sep."$", "", $schema_insert); 
	$schema_insert .= "\t"; 
	print(trim($schema_insert)); 
	print "\n"; 
	$i++; 
}
return (true); 
?>




第二种方式:



function down_list() {
		if (!isset($_COOKIE['sys'])) {
			header("Location: admin.php");
		}
	    $user = new user();
	    $db = new mysql_db();
	    $userinfos = $user->query_users_sum($db);
	    header("Content-type:application/vnd.ms-excel; charset=UTF-8"); // 打印出的字符编码  根据表内容的编码
            header("Content-Disposition:filename=" . time() . ".xls");
            $result =" <table width='100%' height='21'  border='0' align='center'>";
            $result.=" <tr  align='center' style='border:1'>
                    <td>id</td>
                    <td>姓名</td>
                    <td>电话</td>
		    <td>QQ</td>
                    <td>报名时间</td>
                </tr>";
            foreach ($userinfos as $value) {
                $result.="<tr>";
                $result.="<td>" . $value['id'] . "</td>";
                $result.="<td>" . $value['name'] . "</td>";
                $result.="<td>" . DES1::decrypt($this->key, $value['iphone']) . "</td>";
				$result.="<td>" . $value['qq'] . "</td>";
                $result.="<td>" . $value["creat_date"] . "</td>";
                $result.="</tr>";
            }
            $result.="</table>";
            echo $result;
            exit;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值