美文网首页
基于PhpSpreadsheet类库的数据导出方案

基于PhpSpreadsheet类库的数据导出方案

作者: 是彬不是杉 | 来源:发表于2019-04-17 09:50 被阅读0次

    原文链接:https://www.whongbin.com/archives/255.html

    前言

    我之前有写过一篇使用PHPexcel导出的文章,需要的可以看下:ThinkPHP5+PHPExcel导入导出 那篇文章使用的是旧版本PHPexcel库,目前这个库已经不再维护了,且项目已迁移至PhpSpreadsheet,项目地址https://github.com/PHPOffice/PhpSpreadsheet。所以,本篇文章我分享下使用新版PhpSpreadsheet开发导出功能,演示代码基于thinkphp5。

    解读

    下载类库

    在Composer 中文网 里搜索PHPoffice时,会发现有好几个可用库,细心点可以发现,phpexcel库显示不再维护更新,所以选择下面的 phpoffice/phpspreadsheet 类库。

    https://wx2.sinaimg.cn/large/0064eL5bly1g1ynrugqwvj30sg0dt7cc.jpg

    bash进入项目根目录执行下面命令进行安装

    composer require phpoffice/phpspreadsheet
    

    安装完成后,需要在项目中引入类库,如果使用常见框架(如:thinkphp,Laravel...) 在项目根目录中入口文件中引入 vendor/autoload.php


    这个类库的调用方式于原PHPExcel库的调用方式有所不同,个人感觉相对来说新版库的使用方式比较简单

    异常处理

    如果是正常导入导出的话按照下载的库里面的示例代码就可以用了,但是万一碰到必须导出大量列的业务场景时,示例中的方法就有点不胜其任了。使用Coordinate类中的stringFromColumnIndex可以解决。调用方法见代码。


    Tips:需要注意的一点是,在循环时,如果第一级循环从0开始的话,其实列是从Z1开始的,导出后就会出现少列的情况,使用$i+1即可;第二级循环如果从0开始时,则需要使用$j+1。这样出来的起始列才是A1。否则会报错。

    代码

    //此方法基于新版PHPExcel
    use PhpOffice\PhpSpreadsheet\Cell\Coordinate;
    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
    /**
     * excel表格导出
     * @param string $fileName 文件名称
     * @param array $headArr 表头名称
     * @param array $data 要导出的数据
     * @author whongbin  
     */
    function excel_export($fileName = '', $headArr = [], $datas = []) {
        foreach($datas as $item) $data[] = array_values($item);
        $dataArr[] = $headArr;
        $count = count($headArr);  //计算表头数量
        $spreadsheet = new Spreadsheet();
        $spreadsheet->getProperties();
        $sheet = $spreadsheet->getActiveSheet();
        $fileName .= "_" . date("Ymd", \think\Request::instance()->time()) . ".xlsx";
        /*--------------开始从数据库提取信息插入Excel表中------------------*/
        for ($a=0; $a < count($data); $a++) { 
            $dataArr[] = $data[$a];
        }
        for ($i=0; $i < count($dataArr[0]); $i++) { 
            for ($j=0; $j < count($dataArr); $j++) { 
                $coord = Coordinate::stringFromColumnIndex($i+1) . ($j+1);
                if (is_numeric($dataArr[$j][$i])) {
                    if ($dataArr[$j][$i]==0) {
                        $value = '否';
                    }else if ($dataArr[$j][$i]==1) {
                        $value = '是';
                    }else{
                        $value = ' '.$dataArr[$j][$i];
                    }
                }else{
                    $value = $dataArr[$j][$i];
                }
                $sheet->setCellValue($coord,$value);
            }
        }
    
        header('Content-Type: application/vnd.ms-excel');
        header('Content-Disposition: attachment;filename="' . $fileName);
        header('Cache-Control: max-age=0');
        $writer = new Xlsx($spreadsheet);
        $writer->save('php://output');
        //删除清空:
        $spreadsheet->disconnectWorksheets();
        unset($spreadsheet);
        exit;
    }
    

    相关文章

      网友评论

          本文标题:基于PhpSpreadsheet类库的数据导出方案

          本文链接:https://www.haomeiwen.com/subject/zokgwqtx.html