THinkPHP3.2 使用 PHPExcel 生成 excel 文件

感情迁移 提交于 2020-02-05 15:23:22
1.PHPExcel是什么
 
PHPExcel 是一个采用 PHP 生成/读取 excel 文件的类库,其中包含了各种 excel 的操作,用途非常广泛,不过根据官方的公告,其在 2019 年已经停止更新,但是之前已经实现的功能已经足够我们日常使用了。
 

 2.下载

下载地址: https://github.com/PHPOffice/PHPExcel/releases,选择最新版本下载即可。
目录结构如下:
 
3.放入vendor库
 
为了在 THinkPHP3.2 中使用,只需要将下载下来的 Classes 中的文件夹,放置于 ThinkPHP/Library/Vendor/PHPExcel/ 目录下即可。
Classes 文件夹中的目录:
THinkPHP 目录:
4.加载
 
采用 TP3.2 自带的加载方法对类库进行加载即可:
 
vendor('PHPExcel.PHPExcel');

加载完成后,通过示例代码即可进行导出:

 
/** Error reporting */
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

if (PHP_SAPI == 'cli')
    die('This example should only be run from a Web Browser');

// 创建PHPExcel对象
$objPHPExcel = new PHPExcel();


// 设置文档属性,用于鼠标右键查看文档属性时显示,可以不进行设置
$objPHPExcel->getProperties()
// 设置创建者
->setCreator("Maarten Balliauw")
// 最近一次修改者
->setLastModifiedBy("Maarten Balliauw")
// 设置文档标题
->setTitle("Office 2007 XLSX Test Document")
// 设置文档描述
->setDescription("Test document for Office 2007 XLSX, generated using PHP classes.")
// 设置文档关键词
->setKeywords("office 2007 openxml php")
// 设置文档分类
->setCategory("Test result file");

// 添加数据
$objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue('A1', 'Hello')
            ->setCellValue('B2', 'world!')
            ->setCellValue('C1', 'Hello')
            ->setCellValue('D2', 'world!');

// 重命名工作簿名称
$objPHPExcel->getActiveSheet()->setTitle('Simple');

// 设置活动的工作簿,即文档刚开始打开时显示的那个工作簿,可省略
$objPHPExcel->setActiveSheetIndex(0);


// 设置头部信息,用于文档下载
header('Content-Type: application/vnd.ms-excel');
// 设置头部的描述信息以及文档名称,可以传入变量
header('Content-Disposition: attachment;filename="01simple.xls"');
header('Cache-Control: max-age=0');
// IE 9 需要设置为1
header('Cache-Control: max-age=1');


// 设置其他的头信息
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // 最近一次修改时间
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0

// 创建文档,第二个参数为excel版本
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
// php标准输出
$objWriter->save('php://output');
exit;

5.使用

以上为 excel 导出示例,如果要真实使用的话,可以参考下方的使用,在 function.php 中新增函数后进行调用:
 
/**
* PHPExcel导出
* @param string $fileName 导出文件名称
* @param array $sheetHeader 表格标题
* @param array $rows 表格内容,与标题一一对应的多行数据
* @param string $fileName 导出文件名称
* @throws PHPExcel_Exception
* @throws PHPExcel_Reader_Exception
* @throws PHPExcel_Writer_Exception
* @desc //设置表格标题
* 调用示例:
* // 设置列标题
* $sheetHeader = ['姓名', '年龄', '性别'];
* //设置内容
* $rows = array(
* array('易庆庆', '18', '男'),
* array('易庆庆', '18', '男'),
* array('易庆庆', '18', '男'),
* array('易庆庆', '18', '男'),
* array('易庆庆', '18', '男'),
* array('易庆庆', '18', '男')
* );
* try {
* exportExcel($sheetHeader, $rows, '导出测试');
* } catch(\PHPExcel_Exception $e) {
* print_r($e);
* }
*/
function exportExcel($sheetHeader, $rows, $fileName = 'simple')
{
    $fileName = $fileName. '.xlsx';

    // ThinkPHP引入
    vendor('PHPExcel.PHPExcel');
    /** Error reporting */
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);


    if (PHP_SAPI == 'cli')
        die('This function should only be run from a Web Browser');


    //设置表格列
    $headArr = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
 'V', 'W', 'X', 'Y', 'Z'];


    // 创建执行对象
    $objPHPExcel = new PHPExcel();


    // 设置表格属性
    $objPHPExcel->getProperties()->setCreator("易安")
                                ->setLastModifiedBy("易安")
                                ->setTitle("$fileName")
                                ->setSubject("$fileName");


    // 设置表格标题
    // 此处通过循环,获取表格列以及设置好的列标题,方便设置,不需要重复进行列名以及标题名的设置
    foreach ($sheetHeader as $key => $value) {
        $objPHPExcel->setActiveSheetIndex(0)
            ->setCellValue($headArr[$key] . '1', $value);
    }

    // 设置表格内容
    // 表格内容以行输入,循环设置到对应的单元格中,注意单元格的行索引从 2 开始,因为 1 为每列的标题
    for ($rowNum = 0; $rowNum < count那个是什么($rows); ++$rowNum) {
        $row = $rows[$rowNum];
        $colNum = 0;
        foreach ($row as $key => $value) {
            $objPHPExcel->setActiveSheetIndex(0)
                ->setCellValue($headArr[$colNum].($rowNum + 2), $value);
            $colNum++;
        }
    }

    // 设置输出头部属性
    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="'.$fileName.'"');
    header('Cache-Control: max-age=0');

    // 设置头
    header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
    header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
    header ('Pragma: public'); // HTTP/1.0

    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    $objWriter->save('php://output');
    exit;
}

控制器中进行调用:

 
<?php
namespace Manage\Controller;

/**
* 后台
*/
class IndexController extends BaseManageController {
    public function export()
    {
        //设置表格标题
        $sheetHeader = ['姓名', '年龄', '性别'];
        //设置内容
        $rows = array(
            array('易庆庆', '18', '男'),
            array('易庆庆', '18', '男'),
            array('易庆庆', '18', '男'),
            array('易庆庆', '18', '男'),
            array('易庆庆', '18', '男'),
            array('易庆庆', '18', '男')
        );
        try {
            exportExcel($sheetHeader, $rows, '导出测试');
        } catch(\PHPExcel_Exception $e) {
            print_r($e);
        }
    }
}

访问控制器地址:index.php?s=/Manage/Index/export

 
导出结果:
 
6.提示
 
在下载的 PHPExcel 的压缩包中,包含了需要使用示例,如果有其他需求,可以直接在示例的进行查找,十分方便:
 
示例中基本涵盖了日常的使用:
 
 
 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!