PHPExcel的一些小tips
前言
用了PHPExcel有大半年了,这里是关于PHPEXCEL的一些小心得、踩过的坑
1、导出的Excel内容缺失或打开时报“部分内容有问题,是否让我们尽量尝试恢复”
两种可能:
1、脚本申请的内存不足,可以使用
ini_set('memory_limit', '256M'); //升级为256M内存
2、导出的数据中可能含有phpexcel中无法识别的编码
//直接过滤一遍即可
foreach ($row as $k => $v) {
$row[$k] = iconv('gb2312', 'utf-8//IGNORE', iconv('utf-8', 'gb2312//IGNORE', $v));
}
2、如果字符串中有“=”符号,PHPEXCEL将会报错
可以选择用str_replace()为等号加上双引号来避免错误,或者直接去掉等号
str_replace('=', "'='", $tongyi_url)
3、需要Z以上的列数(AA-ZZ)
private function chrNext(&$a)
{
$strList = preg_split("//u", $a, -1, PREG_SPLIT_NO_EMPTY);
if ($strList[count($strList) - 1] == 'Z') {
$str = '';
foreach ($strList as $key => $value) {
if ($key != count($strList) - 1)
$str .= $value;
}
if ($str == '') {
$str = chr(ord('A') - 1);
}
$str = $this->chrNext($str) . 'A';
} else {
$strList[count($strList) - 1] = chr(ord($strList[count($strList) - 1]) + 1);
$str = implode('', $strList);
}
$a = $str;
return $a;
}
4、两种保存方式
a.本地保存
$objWriter = PHPExcel_IOFactory::createWriter($this->objPHPExcel, 'Excel5');
$objWriter->save($filename);
b.浏览器直接输出(在导出大量数据时为避免超时则需要在服务器配置文件中设置超时时间)
browser_export('Excel5', $customer_name . '_' . date('Y-m-d_H-i-s') . '_database');
PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5')->save('php://output');
exit;
/**
* 在浏览器导出Excel
* @param $type
* @param $file_name
*/
private function browser_export($type, $file_name)
{
switch ($type) {
case 'Excel5':
header('Content-Type: application/vnd.ms-excel');//告诉浏览器将输出excel2003文件
header('Content-Disposition: attachment;filename="' . $file_name . '.xls"');//告诉浏览器将输出文件的名称
break;
case 'Excel2007':
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');//告诉浏览器将输出excel2007文件
header('Content-Disposition: attachment;filename="' . $file_name . '.xlsx"');//告诉浏览器将输出文件的名称
break;
default:
header('Content-Type: application/vnd.ms-excel');//告诉浏览器将输出excel2003文件
header('Content-Disposition: attachment;filename="' . $file_name . '.xls"');//告诉浏览器将输出文件的名称
}
header('Cache-Control: max-age=0');//禁止缓存
}