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

2019-04-17  本文已影响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;
}
上一篇下一篇

猜你喜欢

热点阅读