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

转自网络

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值