Tp5使用PHPExcel导入Excel / 导出Excel

  • 1.composer 下载PHPExcel
composer require phpoffice/phpexcel
  • 2.common.php公共函数文件
//导入Excel
function data_import($filename, $exts = 'xls')
{
    ini_set('memory_limit', '-1');//取消内存限制
    set_time_limit(0);//无时间限制可以一直执行到结束
    //创建PHPExcel对象,注意,不能少了\
    new \PHPExcel();
    //如果excel文件后缀名为.xls,导入这个类
    if ($exts == 'xls') {
        import("Org.Util.PHPExcel.Reader.Excel5");
        $PHPReader = new \PHPExcel_Reader_Excel5();
    } else if ($exts == 'xlsx') {
        import("Org.Util.PHPExcel.Reader.Excel2007");
        $PHPReader = new \PHPExcel_Reader_Excel2007();
    } else if ($exts == 'csv') {
        import("Org.Util.PHPExcel.Reader.CSV");
        $PHPReader = new \PHPExcel_Reader_CSV();
    } else {
        return '不支持的文件类型';
        exit();
    }
    //载入文件
    $PHPExcel = $PHPReader->load($filename, $encode = 'utf-8');
    //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
    $currentSheet = $PHPExcel->getSheet(0);
    //获取总列数
    $allColumn = $currentSheet->getHighestColumn();
    //获取总行数
    $allRow = $currentSheet->getHighestRow();
    //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
    if ($allRow > 10000) {
        return '文件不能大于10000条';
        exit();
    }

    $i = 0;
    for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
        //从哪列开始,A表示第一列
        if (strlen($allColumn) >= 2) {
            for ($currentColumn = 'A'; $currentColumn <= 'Z'; $currentColumn++) {
                //数据坐标
                $address = $currentColumn . $currentRow;
                if ($currentColumn == '') {//指定H列为时间所在列
                    $data[$i][$currentColumn] = gmdate("Y-m-d H:i:s", PHPExcel_Shared_Date::ExcelToPHP($currentSheet->getCell($address)->getValue()));
                } else {
                    //读取到的数据,保存到数组$arr中
                      $data[$i][$currentColumn] = $currentSheet->getCell($address)->getValue();
                    // 开始格式化
                    // 获取excel C2的文本
                    import("Org.Util.PHPExcel");   // 这里不能漏掉
                    import("Org.Util.PHPExcel.IOFactory");
                    $cell = $currentSheet->getCell($address)->getValue();
                    // 开始格式化
                    if (is_object($cell)) {
                        $cell = $cell->__toString();
                    }
                    $data[$i][$currentColumn] = $cell;
                }
            }
            $i++;
        } else {
            for ($currentColumn = 'A'; $currentColumn <= $allColumn; $currentColumn++) {
                //数据坐标
                $address = $currentColumn . $currentRow;
                if ($currentColumn == '') {//指定H列为时间所在列
                    $data[$i][$currentColumn] = gmdate("Y-m-d H:i:s", PHPExcel_Shared_Date::ExcelToPHP($currentSheet->getCell($address)->getValue()));
                } else {
                    //读取到的数据,保存到数组$arr中
                      $data[$i][$currentColumn] = $currentSheet->getCell($address)->getValue();
                    // 开始格式化
                    // 获取excel C2的文本
                    import("Org.Util.PHPExcel");   // 这里不能漏掉
                    import("Org.Util.PHPExcel.IOFactory");
                    $cell = $currentSheet->getCell($address)->getValue();
                    // 开始格式化
                    if (is_object($cell)) {
                        $cell = $cell->__toString();
                    }
                    $data[$i][$currentColumn] = $cell;
                }
            }
            $i++;
        }
    }
    return $data;
}



//导出Excel
function exportExcel($expTitle, $expCellName, $expTableData, $setTitle)
{
    ini_set('memory_limit', '-1');//取消内存限制
    set_time_limit(0);//无时间限制可以一直执行到结束
    $xlsTitle = iconv('utf-8', 'gbk', $expTitle);//文件名称
    $fileName = $xlsTitle;//or $xlsTitle 文件名称可根据自己情况设定
    $cellNum = count($expCellName);
    $dataNum = count($expTableData);
    $objPHPExcel = new \PHPExcel();
    //设置工作表格名称
    $objPHPExcel->getActiveSheet()->setTitle($setTitle);

    $cellName = array('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', 'AA', 'AB', 'AC', 'AD', 'AE', 'AF', 'AG', 'AH', 'AI', 'AJ', 'AK', 'AL', 'AM', 'AN', 'AO', 'AP', 'AQ', 'AR', 'AS', 'AT', 'AU', 'AV', 'AW', 'AX', 'AY', 'AZ');

    for ($i = 0; $i < $cellNum; $i++) {
        $objPHPExcel->setActiveSheetIndex(0)->setCellValue($cellName[$i] . '1', $expCellName[$i][1]);
    }
    // Miscellaneous glyphs, UTF-8
    for ($i = 0; $i < $dataNum; $i++) {
        for ($j = 0; $j < $cellNum; $j++) {
            $objPHPExcel->getActiveSheet(0)->setCellValue($cellName[$j] . ($i + 2), $expTableData[$i][$expCellName[$j][0]]);
        }
    }

    // MIME 协议,文件的类型,不设置,会默认html
    header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    // MIME 协议的扩展
    header('Content-Disposition:attachment;filename="'.$fileName.'.xlsx"');
    // 缓存控制
    header('Cache-Control:max-age=0');

    $writer = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
    // php://output 它是一个只写数据流, 允许你以 print 和 echo一样的方式写入到输出缓冲区。
    $writer->save('php://output');
    exit;
}
  • 3.控制器创建方法
<?php

namespace app\index\controller;

use app\common\Base;
use think\Db;
use think\Request;
use PHPExcel;//导入PHPExcel
use PHPExcel_IOFactory;//导入PHPExcel__IOFactory

class Demo extends Base
{
    //使用phpExcel导入excel文件第一种方法
    public function upExcelsOne()
    {
        $file = $_FILES['file'];

        if ($file['error'] > 0) {
            return json(['请选择导入文件~']);
            exit;
        }

        $upload_dir = ROOT_PATH . 'public' . DS . 'uploads' . DS . date('Ymd');

        if (!is_dir($upload_dir)) {
            mkdir($upload_dir);
        }

        $upload_path = $upload_dir . DS . iconv('UTF-8', 'GBK', $file['name']);

        if (move_uploaded_file($file['tmp_name'], $upload_path)) {

            $exts = strtolower(pathinfo($file['name'], PATHINFO_EXTENSION));

            $data = data_import($upload_path, $exts);
            if ($data) {
                foreach ($data as $v) {

                    $arr[] = [
                        'id' => $v['A'],
                        'name' => $v['B'],
                        'sex' => $v['C'],
                        'tel' => $v['D'],
                    ];

                }
                //将表格数据存入数据库
                $chunk_result = array_chunk($arr, 2000);
//                    dump($chunk_result);die;
                foreach ($chunk_result as $v) {
                    //此处批量插入数据操作
                    $res = Db::table('hebei')->insertAll($v);
                }

                if ($res > 0) {
                    return json(['status' => true, 'msg' => '导入成功']);
                } else {

                    return json(['status' => false, 'msg' => '导入失败,请重试~']);
                }
            } else {
                return json(['status' => false, 'msg' => '导入失败,请检查表格数据是否存在']);
            }
        } else {
            return json(['status' => false, 'msg' => '导入错误']);
        }
    }


    //使用phpExcel导入excel文件第二种方法
    public function upExcelsTwo(Request $request)
    {
        //获取导入的文件信息
        $file = $request->file('file');

        if ($file) {
            //将Excel上传到指定目录
            $info = $file
                ->validate(['ext' => 'xls,xlsx,csv'])
                ->move(ROOT_PATH . 'public' . DS . 'uploads' . DS . date('Ymd'), '');

            if ($info) {
                //获取文件路径
                $upload_path = ROOT_PATH . 'public' . DS . 'uploads' . DS . date('Ymd') . DS . $info->getSaveName();
                //获取文件名后缀
                $exts = $info->getExtension();
                //获取Excel表格数据
                $data = data_import($upload_path, $exts);

                if ($data) {
                    //遍历获取到的多维数组
                    foreach ($data as $v) {
                        //处理数据
                        $arr[] = [
                            'id' => $v['A'],
                            'name' => $v['B'],
                            'sex' => $v['C'],
                            'tel' => $v['D'],
                        ];
                    }

                    $chunk_result = array_chunk($arr, 2000);
                    foreach ($chunk_result as $v) {
                        //此处批量插入数据操作
                        $res = Db::table('hebei')->insertAll($v);
                    }

                    if ($res > 0) {
                        return json(['status' => true, 'msg' => '导入成功']);
                    } else {
                        return json(['status' => false, 'msg' => '导入失败,请重试~']);
                    }
                } else {
                    return json(['status' => false, 'msg' => '导入失败,请检查表格数据是否存在']);
                }

            } else {
                return json(['status' => false, 'msg' => '导入失败,请重试~']);
            }
        } else {
            return json(['status' => false, 'msg' => '请选择导入文件']);
        }

    }

    //使用phpExcel导出Excel
    public function export()
    {
        //Excle文件名
        $xlsName = date('Ymd',time()).rand();
        //标题
        $xlsCell = array(
            array('id', '序号'),
            array('name', '用户名'),
            array('sex', '性别'),
            array('tel', '电话')
        );
        //查询数据
        $xlsData = Db::table('excel')->select();
        //Excel工作表名
        $setTitle = 'sheet1';
        exportExcel($xlsName,$xlsCell,$xlsData,$setTitle);
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354