Don't forget that you have had a dream

    

基于PhpSpreadsheet类库的数据导出方案 【置顶】

前言

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

解读

下载类库

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

https://file.whongbin.com/blog/img20190430110319.png

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;
}

您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站部分内容收集于互联网,如果有侵权内容、不妥之处,请联系我们删除。敬请谅解!
所有原创文章采用 知识共享署名-非商业性使用 4.0 国际许可协议 知识共享许可协议 进行许可。

评论已关闭

  更新日志

博客banner下方滚动文字替换为使用 一言API 随机获取 --- updated on 2019-05-22 09:04:31 星期三

  关于博主

三里林,一个致力于分享,分享心得,分享技术,分享知识点的个人博客

  近期评论

  分类目录

生老病死,八苦之四,众生必经,江澄亦是。

人红是非多,人傻当枪使。人蠢猛跟风,人笨不自知。

女人应该像水一样的,什么样的地方都能淌得过去啊。

放弃也是需要勇气的。

夹在我女友与前女友与青梅竹马间的果然是修罗场!

The opoosite of depression is not happiness, but vitality.

我要这天再遮不住我眼,要这地再埋不了我心.

开心就好