Thinkphp5.1引入及使用phpspreadsheet

overme6个月前 (10-17)网页设计428
PhpSpreadsheet是一个读取和写入电子表格文件的纯PHP库。允许您读取和写入不同的电子表格文件格式, 如Excel和Lireffice Calc。PhpSpreadsheet是PHPExcel的升级版本,支持了PHP7的一些特性。PHPExcel已经没有维护了,因此推荐使用Phpspreadsheet。

本文分享在本地环境Thinkphp中引入phpspreadsheet并导出数据:

1、获取phpspreadsheet

① 小编尝试了从github下载和composer下载后移动到thinkphp项目下,但是将phpspreadsheet引入thinkphp有些麻烦。需要单独使用require加文件路径的方式引入,容易发生错误。

② 建议将composer设置为全局使用,切换到thinkphp项目下,再使用composer 获取phpspreadsheet库。这样Thinkphp可以帮你完成引入操作,可以方便的使用。(Composer全局设置方法

composer获取phpspreadsheet的命令:
composer require phpoffice/phpspreadsheet

2、引入phpspreadsheet及实例化

<?php
namespace app\admin\controller;
use think\Controller;
use think\View;
use app\index\model\Inform;
use PhpOffice\PhpSpreadsheet\Spreadsheet;  //引入PhpSpreadSheet
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;  //引入PhpSpreadSheet

$spreadsheet = new Spreadsheet(); //PhpSpreadSheet实例化

3、查询数据库数据,并导出Excel文件

//从数据库查询需要的数据
        $data = Inform::where([
                ‘status’ =>-1
            ])
             ->order(‘id’,’desc’)
             ->select();
        // Create new Spreadsheet object
        $spreadsheet = new Spreadsheet();
        // Add title
        $spreadsheet->setActiveSheetIndex(0)
            ->setCellValue(‘A1’, ‘ID’)
            ->setCellValue(‘B1’, ‘大类型’)
            ->setCellValue(‘C1’, ‘中类型’)
            ->setCellValue(‘D1’, ‘小类型’)
            ->setCellValue(‘E1’, ‘名称’)
            ->setCellValue(‘F1’, ‘网址’)
            ->setCellValue(‘G1’, ‘描述’);
        // Rename worksheet
        $spreadsheet->getActiveSheet()->setTitle(‘待审核数据’);

        $i = 2;//第一行标题使用了,因此需要从2开始
        foreach ($data as $rs) {
            // Add data
            $spreadsheet->getActiveSheet()
                ->setCellValue(‘A’.$i, $rs[‘id’])
                ->setCellValue(‘B’.$i, $rs[‘type’])
                ->setCellValue(‘C’.$i, $rs[‘category’][‘text’])
                ->setCellValue(‘D’.$i, $rs[‘smalltype’])
                ->setCellValue(‘E’.$i, $rs[‘name’])
                ->setCellValue(‘F’.$i, $rs[‘url’])
                ->setCellValue(‘G’.$i, $rs[‘des’]);
            $i++;
        }
        //Set width
        $spreadsheet->getActiveSheet()
            ->getColumnDimension(‘A’)
            ->setWidth(15);
        $spreadsheet->getActiveSheet()
            ->getColumnDimension(‘B’)
            ->setWidth(15);
        $spreadsheet->getActiveSheet()
            ->getColumnDimension(‘C’)
            ->setWidth(60);
        $spreadsheet->getActiveSheet()
            ->getColumnDimension(‘D’)
            ->setWidth(15);
        $spreadsheet->getActiveSheet()
            ->getColumnDimension(‘E’)
            ->setWidth(20);
        $spreadsheet->getActiveSheet()
            ->getColumnDimension(‘F’)
            ->setWidth(20);
        $spreadsheet->getActiveSheet()
            ->getColumnDimension(‘G’)
            ->setWidth(20);

        // Set alignment
        $spreadsheet->getActiveSheet()->getStyle(‘A1:G’.$i)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER);
        $spreadsheet->getActiveSheet()->getStyle(‘C2:C’.$i)->getAlignment()->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_LEFT);

        // Set active sheet index to the first sheet, so Excel opens this as the first sheet
        $spreadsheet->setActiveSheetIndex(0);
        return $this->exportExcel($spreadsheet, ‘xls’, ‘登陆日志’);
}

/**
    * 导出Excel
    * @param  object $spreadsheet  数据
    * @param  string $format       格式:excel2003 = xls, excel2007 = xlsx
    * @param  string $savename     保存的文件名
    * @return filedownload         浏览器下载
    */
    function exportExcel($spreadsheet, $format = ‘xls’, $savename = ‘export’) {
        if (!$spreadsheet) return false;
        if ($format == ‘xls’) {
            //输出Excel03版本
            header(‘Content-Type:application/vnd.ms-excel’);
            $class = “\PhpOffice\PhpSpreadsheet\Writer\Xls”;      
        } elseif ($format == ‘xlsx’) {
            //输出07Excel版本
            header(‘Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet’);
            $class = “\PhpOffice\PhpSpreadsheet\Writer\Xlsx”;
        }
        //输出名称
        header(‘Content-Disposition: attachment;filename=”‘.$savename.’.’.$format.'”‘);
        //禁止缓存
        header(‘Cache-Control: max-age=0’);
        $writer = new $class($spreadsheet);
        $filePath = env(‘runtime_path’).”temp/”.time().microtime(true).”.tmp”;
        $writer->save($filePath);
        readfile($filePath);
        unlink($filePath);
  }

需要注意的是setCellValue(‘A’.$i, $rs[‘id’]),第二个参数需要是字符串,不能是数组。

以上就是Thinkphp5.1引入及使用phpspreadsheet的方法。

相关文章


		thinkphp配置htaccess文件后出现No input file specified

thinkphp配置htaccess文件后出现No input file specified

如下图所示,小编配置了htaccess伪静态规则,但是通过index/index/demo访问demo方法时出现No input file specified报错 开始的伪静态规则:...


		Thinkphp显示页面错误!请稍后再试的处理方法

Thinkphp显示页面错误!请稍后再试的处理方法

thinkphp本地phpstudy环境中调试时,抛出错误:页面错误!请稍后再试 原因:出现这个页面(典型的thinkphp报错页面),说明程序已经收到请求,thinkphp程序抛出的一个404...

ThinkPHP5.1版本使用__CSS__不生效

现象:小编原来的模板有这么一段代码,5.0.24版本时可以自动变更为/static/css/style.css的。升级成5.1.40版本后,原样解析,导致网页布局错乱。 <link h...

Thinkphp如何引入另外一个php文件定义的类

小编最近在Thinkphp开发时遇到一个问题,在Login.php中想要引入Index.php文件,并使用该文件中定义的一个方法。该怎么实现呢! 小编的处理过程: 1、参考use方法,直接在Log...


		thinkphp通过循环输出栏目分类和文章 三层循环

thinkphp通过循环输出栏目分类和文章 三层循环

replyreload += ',' + 1255;thinkphp开发过程中,文章输出显示需要按大分类,小分类以及小分类中的文章进行分层输出。 按上这个设计要求,那么在thinkphp的控...

thinkphp定义获取器及如何获取原值

replyreload += ',' + 1256;获取器的作用是在获取数据库字段值后自动进行处理,例如将数据表中代表分类的数字,直接替换为中文分类名称 。 thinkphp下模型的定义: 在mo...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。