ThinkPHP5.1 excel表的导入导出操作 (PHPExcel)

2019-08-07 19:53:39 浏览数 (1)

☞ 背景

  • 这两天在开发快递查询的功能时,涉及到了 Excel表导入MySQL 的操作,为了方便后期的快捷使用,在此整理一下 PHPExcelexcel 表导入导出的代码解决步骤,希望能帮到有需要的道友们…

框架:ThinkPHP5.1 类库:PHPExcel 技能:Composer,MySql

☞ 前期准备:PHPExcel 类库的获取

第一种方式为:使用 Composer 进行安装; 第二种方式为:直接到【Github·PHPOffice/PHPExcel】下载源包 后者需要注意,将压缩包解压后放到vendor目录,并且注意路径的正确引入 此处,只做第一种方式的指导参考 [建议学会Composer的简单使用,实在是太方便了]

  • 进入项目目录,输入命令: composer require phpoffice/phpexcel

安装成功后,会注意到项目的vendor目录下,多出了一个phpoffice文件夹

☞ 如何将 Excel中的数据导入MySQL

除了参考我展示的步骤,也要注意下我的代码注释哦!

①. excel 文件的整理

首先要求用来导入MySQL 数据表的 excel文件中的内容要规整,对应于你的数据表

  • 鄙人将其放置于目录publiccmsfilebird_express.xlsx

以我要操作的 excel表为例,(数据简单,可举一反三,自由拓展):

②. 创建目标数据表

  • 以我的简答测试为例,表格设计如下:

③. MTPhpExcel类的使用

  • 首先引入所提供源码中的 MTPhpExcel.php 下图即为我创建的 测试入口,主要目的就是为了调用核心方法 readExcelFileToArray()

核心处理方法 readExcelFileToArray() 源码见附录

  • 运行代码后的结果如下:

☞ 如何将数据导出到Excel文件 ☜

  • 同理,我设计了一个测试方法,主要目的就是为了调用核心方法 outputDataToExcelFile()

核心处理方法 outputDataToExcelFile() 源码见附录

  • 运行代码后,可以得到如下的一个 excel 表:
  • 【温馨提示:】
代码语言:javascript复制
1. 为了代码参考方便,鄙人尽量使其简洁化
   所以如果对于某列数据需要字体加粗、居中、变大等各种操作,可自行扩展
2. 当前代码,未做图片格式的展示处理
   如有需要可阅读 phpexcel 文档规则,根据目标数据对应性处理即可 ...

☞ 附录

☛ >>>源码下载>>>(正在审核中,稍等…) ☚

  • 毕竟主要使用的就是这个 MTPhpExcel类,如果不需要下载参考excel数据表,也可直接参考下面的源码
代码语言:javascript复制
<?php
/**
 * Created by PhpStorm.
 * User: moTzxx
 * Date: 2019/4/21
 * Time: 9:24
 */
namespace appapiController;
use thinkDb;

class MTPhpExcel
{
    /**
     * 测试方法 1
     * (根据传入的 excel 文件导入MySQL)
     * @return array
     */
    public function inputMySQLTest()
    {
        $excel_file_path = "./cms/file/bird_express.xlsx";
        $excelArr = $this->readExcelFileToArray($excel_file_path);
        $resultArr = [];
        //TODO 将获取的数组数据进行优化,并压入目标数组 $resultArr
        foreach ($excelArr as $key => $value) {
            $resultArr[$key]['name'] = $value[0];
            $resultArr[$key]['code'] = $value[1];
        }
        //var_dump($resultArr);
        /**
         * TODO 此时进行数据表记录的遍历插入操作即可
         * 因为数据量较大,建议使用批量插入的方式
         * 以我的业务需求,代码举例如下:
         */
        //Db::name('xbird_express')->data($resultArr)->limit(50)->insertAll();
        return $resultArr;
    }

    /**
     * 测试方法 2
     * (根据得到的的数组数据,导出Excel文件)
     */
    public function outputToExcelTest()
    {
        //测试数据(数组形式),一般来源于数据表查询
        $list = [
            ['name' => '顺丰速运', 'code' => 'SF', 'mark' => '很贵的哦'],
            ['name' => '百世快递', 'code' => 'HTKY', 'mark' => 'en嗯嗯'],
            ['name' => '中通快递', 'code' => 'ZTO', 'mark' => '还是挺快的!'],
            ['name' => '申通快递', 'code' => 'STO', 'mark' => 'God bless you!'],
            ['name' => '圆通速递', 'code' => 'YTO', 'mark' => '施主您好'],
            ['name' => '韵达速递', 'code' => 'YD', 'mark' => '大学的记忆'],
            ['name' => '邮政快递包裹', 'code' => 'YZPY', 'mark' => '听,起风了~'],
        ];
        $headerArr = ['快递名称', '编码', '备注'];
        //设置保存的Excel表格名称
        $excelTitle = 'moTzxx表格导出测试';
        $save_fileUrl = "moTzxx快递公司".date('Ymd-His', time()) . ".xls";
        $this->outputDataToExcelFile($list, $headerArr, $excelTitle, $save_fileUrl);
    }

    /**
     * 将得到的数组数据,转化为Excel文件导出
     * @param array $list 数组数据
     * @param array $headerArr 显示的顶部导航栏
     * @param string $excelTitle 表格标题
     * @param string $save_fileUrl 构建存储文件,注意扩展名
     */
    public function outputDataToExcelFile($list = [], $headerArr = [],
                                          $excelTitle = "", $save_fileUrl = "")
    {
        //实例化PHPExcel类
        $objPHPExcel = new PHPExcel();
        //设置头信息 激活当前的sheet表
        $objPHPExcel->setActiveSheetIndex(0);
        $keyC = ord('A');
        foreach ($headerArr as $head) {
            $colKey = chr($keyC);
            //TODO 设置表格头(即excel表格的第一行)
            $objPHPExcel->getActiveSheet()->setCellValue($colKey . '1', $head);
            //设置单元格宽度
            $objPHPExcel->getActiveSheet()->getColumnDimension($colKey)->setWidth(20);
            $keyC  ;
        }

        $colIndex = 2;
        foreach ($list as $key => $rows) {
            $colKey2 = ord('A');
            foreach ($list[$key] as $keyName => $value) {
                $objPHPExcel->getActiveSheet()->setCellValue(chr($colKey2) . $colIndex, $value);
                $colKey2  ;
            }
            $colIndex  ;
        }

        //设置当前激活的sheet表格名称;
        $objPHPExcel->getActiveSheet()->setTitle($excelTitle);
        //设置浏览器窗口下载表格
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");
        header('Content-Disposition:inline;filename="' . $save_fileUrl . '"');
        //生成excel文件
        $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
        //下载文件在浏览器窗口
        $objWriter->save('php://output');
        exit;
    }

    /**
     * 将读取到的 excel 文件转化为数组数据并返回
     * 此处的要求是:
     *          excel文件的后缀名不要手动改动,一般为 xls、xlsx
     *          excel文件中的数据尽量整理的跟数据表一样规范
     *
     * @param $excel_file_path 文件路径,保证能访问到
     * @return array
     */
    public function readExcelFileToArray($excel_file_path)
    {
        if (!file_exists($excel_file_path)) {
            die('Sorry, file not found!');
        } else {
            $extension = strtolower(pathinfo($excel_file_path, PATHINFO_EXTENSION));
            $objExcel = null;
            if ($extension == 'xlsx') {
                $objReader = new PHPExcel_Reader_Excel2007();
                $objExcel = $objReader->load($excel_file_path);
            } else if ($extension == 'xls') {
                $objReader = new PHPExcel_Reader_Excel5();
                $objExcel = $objReader->load($excel_file_path);
            } else if ($extension == 'csv') {
                $PHPReader = new PHPExcel_Reader_CSV();
                //默认输入字符集
                $PHPReader->setInputEncoding('GBK');
                //默认的分隔符
                $PHPReader->setDelimiter(',');
                //载入文件
                $objExcel = $PHPReader->load($excel_file_path);
            }
            $excelArr = $objExcel->getSheet(0)->toArray();
        }
        return $excelArr;
    }
}

0 人点赞