PHP生成Excel

需求:将数据导入到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;

综合比较,方式三较为高效和便利。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值