需求:将数据导入到Excel文件中
导入数据格式:
$title = array("name","age","info");
$data = array(
array("1"=>"张三","2"=>"12","3"=>"vvvvv"),
array("1"=>"李四","2"=>"13","3"=>"vvvvv"),
array("1"=>"王五","2"=>"16","3"=>"vvvvv"),
);
$filename = "test";
方法一:通过header头下载文件
通过定义头加载excel文件,不引用任何文件, 由于生成的是非excel格式文件,所以打开前会提示文件损坏,但也可以使用,并且不能修改科学计数法的数字。
ob_end_clean();
ob_start();
header("Content-type:application/vnd.ms-excel");
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header("Cache-Control:max-age=0");
header("Content-Disposition:attachment;filename=" . $filename . ".xls");
//导出xls开始
if (!empty($title)) {
foreach ($title as $k => $v) {
$title[$k] = iconv("UTF-8", "GB2312", $v);
}
$title = implode("\t", $title);
echo "$title\n";
}
if (!empty($data)) {
foreach ($data as $key => $val) {
foreach ($val as $ck => $cv) {
$data[$key][$ck] = iconv("UTF-8", "GB2312", $cv);
}
$data[$key] = implode("\t", $data[$key]);
}
echo implode("\n", $data);
}
exit;
方法二:使用PHPExcel
使用PHPExcel能够导出准确的Excel格式,并且能够调整具体的Excel格式,但是加载速度过慢,测试中仅800多条数据就需要20多秒的时间,与其他两种方式的秒加载相比,性能较差。
$excelData = array(
'cols'=>$title,
'rows'=>$data
);
$phpexcel = new PHPExcel();
// Set properties 设置文件属性
$properties = $phpexcel->getProperties();
// $properties->setTitle($filename);//设置标题
$sheet = $phpexcel->getActiveSheet();
// $sheet->setTitle('Sheet1');//设置sheet名称
//从A开始
$startLetter = 'A';
$rowNumber = 1;
// 遍历表头
foreach ($excelData['cols'] as $key => $col) {
$sheet ->setCellValue($startLetter++.$rowNumber , $col);
}
++$rowNumber;
// 遍历数据
foreach ($excelData['rows'] as $key => $row) {
$startLetter = 'A';
foreach ($row as $key => $value) {
$sheet ->setCellValue($startLetter++.$rowNumber , $value);
}
++ $rowNumber;
}
$phpexcel->setActiveSheetIndex(0);
header('Content-Type: application/vnd.ms-excel');
header("Content-Disposition: attachment;filename=".$filename.".xls");
header('Cache-Control: max-age=0');
$objwriter = PHPExcel_IOFactory::createWriter($phpexcel, 'Excel5');
$objwriter->save('php://output');
exit;
使用PHPExcel需要下载PHPExcel的类文件,并引用
https://github.com/PHPOffice/PHPExcel下载Classes中的文件
通过require_once引用
require_once dirname(__FILE__).'/Excel/PHPExcel.php';
方法三:通过fputcsv方式导出csv
和header头方式原理类似,导出到csv中,通过','隔开文本,该方式导出速度较快,不存在提示错误,且能够解决科学计数法的问题。
//缓存清理
ob_end_clean();
// 输出Excel文件头,可把user.csv换成你要的文件名
header('Content-Type: application/vnd.ms-excel');
header("Content-Disposition: attachment;filename=$filename.csv");
header('Cache-Control: max-age=0');
// 打开PHP文件句柄,php://output 表示直接输出到浏览器
$fp = fopen('php://output', 'a');
// 输出Excel列名信息
foreach ($title as $i => $v) {
// CSV的Excel支持GBK编码,一定要转换,否则乱码
// 每个字段后加上 "\t" 可以防止长数字显示为科学计数法
$head[$i] = "\t" . iconv('utf-8', 'gbk//ignore', $v);
}
// 将数据通过fputcsv写到文件句柄
fputcsv($fp, $head);
$cnt = 0;// 计数器
// 每隔$limit行,刷新一下输出buffer
$limit = 10000;
// 逐行取出数据,不浪费内存
foreach ($data as $row) {
$cnt++;
if ($limit == $cnt) {
//刷新一下输出buffer,防止由于数据过多造成问题
ob_flush();
flush();
$cnt = 0;
}
foreach ($row as $i => $v) {
//格式调整
$row[$i] = "\t" . iconv('utf-8', 'gbk//ignore', $v);
}
fputcsv($fp, $row);
}
exit;
综合比较,方式三较为高效和便利。