下面介绍一个很另类的php导出数据到xls文件的方法,用到的函数有pack,iconv
//上面三个自定义函数很重要,大家自行揣摩
function xlsBOF() {
echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
}
function xlsEOF() {
echo pack("ss", 0x0A, 0x00);
}
function xlsWriteLabel($Row, $Col, $Value) {
$L = strlen($Value);
echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
echo $Value;
}
//封装的方法,要看原博,请点击文章底部链接
function export(array $head, array $body)
{
// prepare headers information
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Disposition: attachment; filename=\"export_".date("Y-m-d").".xls\"");
header("Content-Transfer-Encoding: binary");
header("Pragma: no-cache");
header("Expires: 0");
xlsBOF();
//因为我们的内容一般会有中文,所以表头和表内容都需要预先转码,不然会出现乱码
//此处用的是逗号分隔,如果内容中含有逗号就会出问题,大家可以换成其他分隔符,或者采用for循环的方式逐行进行转换
$head_str = iconv('utf-8', 'gbk', implode(',', $head));
$head_arr = explode(',', $head_str);
$head_count = count($head_arr);
for ($i = 0; $i < $head_count; $i++) {
xlsWriteLabel(0, $i, $head_arr[$i]);
}
//body
$body_count = count($body);
for ($i = 0; $i < $body_count; $i++) {
$value = $body[$i];
$value_str = iconv('utf-8', 'gbk',implode(',', $value));
$value_arr = explode(',', $value_str);
for ($j = 0; $j < $head_count; $j++) {
xlsWriteLabel($i + 1, $j, $value_arr[$j]);
}
}
xlsEOF();
}
//使用方法
$head = ['手机号', '姓名', '昵称'];
$body = [
[
'1378949440',
'张三',
'张三三'
],
[
'1399494900',
'李四',
'李四四'
]
];
export($head, $body);
网友评论