前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ThinkPHP5.1 excel表的导入导出操作 (PHPExcel)

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

作者头像
泥豆芽儿 MT
修改2019-08-07 19:53:39
2.5K0
修改2019-08-07 19:53:39
举报

☞ 背景

  • 这两天在开发快递查询的功能时,涉及到了 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文件中的内容要规整,对应于你的数据表

  • 鄙人将其放置于目录public\cms\file\bird_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 app\api\Controller;
use think\Db;

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;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ☞ 背景
  • ☞ 前期准备:PHPExcel 类库的获取
  • ☞ 如何将 Excel中的数据导入MySQL ☜
    • ①. excel 文件的整理
      • ②. 创建目标数据表
        • ③. MTPhpExcel类的使用
        • ☞ 如何将数据导出到Excel文件 ☜
        • ☞ 附录
          • ☛ >>>源码下载>>>(正在审核中,稍等…) ☚
          相关产品与服务
          云数据库 SQL Server
          腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档