thinkphp5.1 phpexcel 批量导入导出

news2024/10/7 12:24:01

1.批量导入

public function importExcel(){

        $authority = $this->getUserAuthority('order_input', 'batch_import');
        if ($authority['code'] != 0) {
           return json($authority);
        }

        $file = request()->file('files');
        if(empty($file)){
            return printMsg(-1, "请上传文件");
        }
        // 移动到框架应用根目录/uploads/ 目录下
        //$info = $file->validate(['size'=>(100*1024*1024),'ext'=>'xls,xlsx'])->move('static/uploads/');
        $ext_arr = ['xlsx'];
        //接收文件
        $file_type = $file->getInfo()['name'];
        //获取后缀
        $ext = explode('.', $file_type);
        $ext = end($ext);
        //判断时候是限制的文件格式
        if (!in_array($ext, $ext_arr)) {
            return printMsg(-1,'文件格式有误,只支持Excel2007,xlsx后缀的文件');
        }
        //实例化类库 // 读取excel文件
        require_once './../extend/PHPExcel/IOFactory.php';
        require_once './../extend/PHPExcel/PHPExcel.php';
        if ($ext == 'xls') {
                $PHPReader = new \PHPExcel_Reader_Excel5();
            } elseif ($ext == 'xlsx') {
                $PHPReader = new \PHPExcel_Reader_Excel2007();
        }
        $tmp_name = $file->getInfo()['tmp_name'];

        $objData = $PHPReader->load($tmp_name, $encode = 'utf-8');
        $excel_array = $objData->getsheet(0)->toArray();
        //删除表格第一行
        unset($excel_array[0]);
        $insertData = [];
        $userInfo = $this->getTokenUser();
        $date = date('Y-m-d H:i:s', $this->request->time());
        if (count($excel_array) > 500){
            return printMsg(-1,'批量导入行数不能大于500条');
        }
        //todo 线上对应的数据
        $project_name_id = 13;
        $source = '腾讯游戏';
        $project_source_detail_id = 115;
        $depargroup = 29;
        $designer_uid = 1114;
        Db::startTrans();
        try {

            foreach ($excel_array as $key => $value) {

                    $line = $key+1;
                    try {
                        $d2 = date("Y-m-d",($value[2] - 25569) * 86400);
                        $d3 = date("Y-m-d",($value[3] - 25569) * 86400);
                        $d5 = date("Ym",($value[5] - 25569) * 86400);
                    }catch (Exception $exception){
                        Db::rollback();
                        return printMsg(-1, "第".$line."行,日期格错误");
                    }

                    $line = $key+1;
                    if (empty($value[0])){
                        Db::rollback();
                        return printMsg(-1, "第".$line."行,单号不能为空");
                    }
                    if (empty($value[1])){
                        Db::rollback();
                        return printMsg(-1, "第".$line."行,需求名称不能为空");
                    }
                    if (!$this->isDate($d2)){
                        Db::rollback();
                        return printMsg(-1, "第".$line."行,需求开始日期格式不正确");
                    }
                    if (!$this->isDate($d3)){
                        Db::rollback();
                        return printMsg(-1, "第".$line."行,需求结束日期格式不正确");
                    }
                    if (!is_numeric($value[4])){
                        Db::rollback();
                        return printMsg(-1, "第".$line."行,价格格式不正确");
                    }
                    if (!$this->isDate2($d5)){
                        Db::rollback();
                        return printMsg(-1, "第".$line."行,需求归属日期格式不正确");
                    }
                    $achievementData = [
                        "type"         => 1, #1:报价
                        "project_name" => $project_name_id,
                        "project_name_id" => $project_name_id,
                        "demand_name"  => $value[1],
                        "demander"     => '腾讯',
                        "start_time"   =>  $d2,
                        "end_time"     =>  $d3,
                        "user_id"      => $userInfo['id'],
                        "create_time"  => $date,
                        "update_time"  => $date,
                    ];
                    if (!empty($value[0])) {
                        $achievementData['sn'] = trim($value[0]);
                    }
                    $achiveId = $this->orderAchievement->insertGetId($achievementData);

                    $orderInputData = [];


                    $orderData = [
                        'source'   => $source,
                        'project_source_detail_id'   => $project_source_detail_id,
                        'terminal' => '报价',
                        'type'     => '报价',
                        'nature'   => '报价',
                        'text'     => '报价',
                        'nitprice' => $value[4],
                        'workload' => 1,
                        'status'   => 1, #1:报价
                        'create_time' => $date,
                        'update_time' => $date,
                    ];
                    $orderId = $this->orderModel->insertGetId($orderData);

                    $orderInputData = [
                        'num'          => 1,
                        'project'      => $project_name_id,
                        'order_time'   => $d5,
                        'personnel'    => $userInfo['id'],
                        'order'        => $orderId,
                        'depargroup'   => $depargroup,
                        'type'         => 1, #1:报价
                        'designer_uid' => $designer_uid,
                        'order_achievement_id' => $achiveId,
                        'create_time' => $date,
                        'update_time' => $date,
                    ];

                    $this->orderInputModel->insertGetId($orderInputData);
                    $this->newLog('导入报价类');



            }
            Db::commit();
          } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            throw new \Exception('导入失败');
            return printMsg(self::myx_code + 10, "导入失败:" . $e->getMessage());
        }
        return printMsg(0, "导入成功");

}

    private function isDate($str) {
        $pattern = '/^\d{4}-\d{2}-\d{2}$/'; // 使用正则表达式匹配 YYYY-MM-DD 格式的日期
        if (preg_match($pattern, $str)) {
            return true;
        } else {
            return false;
        }
    }
    private function isDate2($str) {
        $pattern = '/^\d{4}\d{2}$/'; // 使用正则表达式匹配 YYYY-MM-DD 格式的日期
        if (preg_match($pattern, $str)) {
            return true;
        } else {
            return false;
        }
    }

excel模版文件
在这里插入图片描述

2.批量导出

public function download(Request $request)
    {
        /*$authority = $this->getUserAuthority('order_input', 'download');
        if ($authority['code'] != 0) {
            return json($authority);
        }
        $res = controller('OrderAchievement')->index($request, true);*/


        //return printMsg(0, "成功", $res);

        $order = OrderModel::where('source', '腾讯游戏')->where('status', '0')->select()->toArray();
        $title = [];
        foreach ($order as $k => $v) {
            if (empty($title[$v['terminal']])) {
                $title[$v['terminal']] = [
                    $v['nature'] => [
                        $v['type'] => [$v['text']]
                    ]
                ];
            } else {
                if (empty($title[$v['terminal']][$v['nature']])) {
                    $title[$v['terminal']][$v['nature']] = [
                        $v['type'] => [$v['text']]
                    ];
                } else {
                    if (empty($title[$v['terminal']][$v['nature']][$v['type']])) {
                        $title[$v['terminal']][$v['nature']][$v['type']] = [$v['text']];
                    } else {
                        $title[$v['terminal']][$v['nature']][$v['type']][] = $v['text'];
                    }
                }
            }
        }
        //return printMsg(0, "成功", $title);
        //die();
        $fileName = "需求订单";
        require_once './../extend/PHPExcel/IOFactory.php';
        require_once './../extend/PHPExcel/PHPExcel.php';


        $obj = new \PHPExcel();
        // 设置当前sheet
        $obj->setActiveSheetIndex(0);
        // 设置当前sheet的名称
        $obj->getActiveSheet()->setTitle('需求订单');
        // 列标
        $cellKey = ['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'];
        foreach (['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'] as $k => $v) {
            foreach (['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'] as $sk => $sv) {
                $cellKey[] = $v . $sv;
            }
        }
        //处理表头标题
        //$obj->getActiveSheet()->mergeCells('A1:' . $cellKey[(count($title) - 1) + 4] . '1');//合并单元格(如果要拆分单元格是需要先合并再拆分的,否则程序会报错)
        $obj->setActiveSheetIndex(0)->setCellValue('A1', '需求订单列表(仅腾讯需求)');
        $obj->getActiveSheet()->getStyle('A1')->getFont()->setBold(true);
        $obj->getActiveSheet()->getStyle('A1')->getFont()->setSize(11);
        $obj->getActiveSheet()->getStyle('A1')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $obj->getActiveSheet()->getStyle('A1')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);

        $leftNumber = 4; //左边位移数量
        // 填充表头
        $obj->getActiveSheet()
            ->setCellValue('A2', '来源')
            ->setCellValue('B2', '单号')
            ->setCellValue('C2', '项目名称')
            ->setCellValue('D2', '类型');
        //合并单元格
        $obj->getActiveSheet()->mergeCells('A2:A5');
        $obj->getActiveSheet()->mergeCells('B2:B5');
        $obj->getActiveSheet()->mergeCells('C2:C5');
        $obj->getActiveSheet()->mergeCells('D2:D5');
        //居中
        $obj->getActiveSheet()->getStyle('A2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
            ->getActiveSheet()->getStyle('B2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
            ->getActiveSheet()->getStyle('C2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER)
            ->getActiveSheet()->getStyle('D2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
        $obj->getActiveSheet()->getStyle('A2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER)
            ->getActiveSheet()->getStyle('B2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER)
            ->getActiveSheet()->getStyle('C2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER)
            ->getActiveSheet()->getStyle('D2')->getAlignment()->setVertical(\PHPExcel_Style_Alignment::VERTICAL_CENTER);
        $i = 0;
        foreach ($title as $k => $v) {
            $obj->getActiveSheet()->setCellValue(($cellKey[$i + $leftNumber]) . '2', $k);
            $obj->getActiveSheet()->getStyle(($cellKey[$i + $leftNumber]) . '2')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
            $i2 = $i;
            foreach ($title[$k] as $kj => $vj) {
                $i3 = $i;
                $obj->getActiveSheet()->setCellValue(($cellKey[$i + $leftNumber]) . '3', $kj);
                $obj->getActiveSheet()->getStyle(($cellKey[$i + $leftNumber]) . '3')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                foreach ($title[$k][$kj] as $skj => $svj) {
                    $i4 = $i;
                    $obj->getActiveSheet()->setCellValue(($cellKey[$i + $leftNumber]) . '4', $skj);
                    $obj->getActiveSheet()->getStyle(($cellKey[$i + $leftNumber]) . '4')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                    foreach ($svj as $ik => $iv) {
                        $obj->getActiveSheet()->setCellValue(($cellKey[$i + $leftNumber]) . '5', $iv);
                        $obj->getActiveSheet()->getStyle(($cellKey[$i + $leftNumber]) . '5')->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
                        $i++;
                    }
                    $obj->getActiveSheet()->mergeCells(($cellKey[$i4 + $leftNumber]) . '4' . ':' . ($cellKey[$i + 3]) . '4');
                }
                $obj->getActiveSheet()->mergeCells(($cellKey[$i3 + $leftNumber]) . '3' . ':' . ($cellKey[$i + 3]) . '3');
            }
            $obj->getActiveSheet()->mergeCells(($cellKey[$i2 + $leftNumber]) . '2' . ':' . ($cellKey[$i + 3]) . '2');
        }
        $obj->getActiveSheet()->mergeCells('A1:' . $cellKey[$i + 4] . '1');


        /*$obj->getActiveSheet()->mergeCells('A2:A3');
        $obj->getActiveSheet()->mergeCells('B3:B3');
        $obj->getActiveSheet()->mergeCells('C3:C3');
        $obj->getActiveSheet()->mergeCells('D3:D3');

        $obj->getActiveSheet()->mergeCells('E2:G2');
        $obj->getActiveSheet()->mergeCells('H2:J2');

        $obj->getActiveSheet()
            ->setCellValue('E3', '首页')
            ->setCellValue('F3', '内页')
            ->setCellValue('G3', '排版')
            ->setCellValue('H3', '首页')
            ->setCellValue('I3', '内页')
            ->setCellValue('J3', '排版');*/


        // 导出
        ob_clean();
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="' . $fileName . '.xlsx');
        header('Cache-Control: max-age=1');
        $objWriter = \IOFactory::createWriter($obj, 'Excel2007');
        $objWriter->save('php://output');
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1466366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode刷题日志-200.岛屿数量

思路: 遍历二维数组,每当遇到一个‘1’进行一次dfs,根据规则,将本次dfs到的所有元素标记为‘0’(放置重复dfs,并且能dfs到的元素一定是与当前遍历到的元素属于统一岛屿。)最后,dfs的…

Sora-OpenAI 的 Text-to-Video 模型:制作逼真的 60s 视频片段

OpenAI 推出的人工智能功能曾经只存在于科幻小说中。 2022年,Openai 发布了 ChatGPT,展示了先进的语言模型如何实现自然对话。 随后,DALL-E 问世,它利用文字提示生成令人惊叹的合成图像。 现在,他们又推出了 Text-t…

【初中生讲机器学习】11. 回归算法中常用的模型评价指标有哪些?here!

创建时间:2024-02-19 最后编辑时间:2024-02-23 作者:Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏,很高兴遇见你~ 我是 Geeker_LStar,一名初三学生,热爱计算机和数学,我们一起加…

【关于python变量类型学习笔记】

python的变量类型 在创建变量时会在内存中开辟一个空间,变量是存储在内存中的值。 根据变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中。 变量可以指定不同的数据类型,这些变量可以存储整数,…

Codeforces Round 927 (Div. 3) G. Moving Platforms --- 题解 (非常好的题)

目录 Codeforces Round 927 (Div. 3) G. Moving Platforms: 原题链接:Problem - G - Codeforces 题目大意: 思路解析: 代码实现: Codeforces Round 927 (Div. 3) G. Moving Platforms: 原题链接&#…

高刷电竞显示器 - HKC VG253KM

今天给大家分享一款高刷电竞显示器 - HKC VG253KM。 高刷电竞显示器 - HKC VG253KM源于雄鹰展翅翱翔的设计灵感,严格遵循黄金分割比例的蓝色点晴线条,加上雾面工艺及高低起伏错落有致的线条处理,在VG253KM的背部勾勒出宛若大鹏展翅的鹰翼图腾…

app自动化元素定位工具Weditor安装使用

之前用appium自带的appium Desktop inspector老是定位不到元素 如下 用另外工具 Weditor M1电脑 安装 pip3 install weditor 启动-自动打开端口 python3 -m weditor 输入设备名称,点击【connect】出现绿色为连接成功 获取到

vscode中git相应插件的使用(强化工作效率)

git graph 这篇文章写的不错:Git Graph 对于git graph的插件的使用: 1、首先vscode-extension中去下载 2、打开 相应的项目,然后在vscode左边底下去找到git graph标识然后打开就可以看到commit记录的可视化形式了。 能够很清晰的看到你的提…

自定义股票池策略周报告---收益1.8,回撤0.7,提供实盘设置

综合交易模型已经交易了1个月了目前收益10,回测0.8,策略追求稳稳的幸福,细水流长,回测年化20,最大回撤8 链接自定义股票池策略周报告---收益1.8,回撤0.7,提供实盘设置 (qq.com) 实盘稳定运行2…

镜像的使用条件

Q:老师,我怎么才能把做了一半的脸直接复制呢? A:镜像,但是镜像是有条件的 Q:镜像的使用条件有哪些呢? A: 1.对称面不能存在,必须是镂空的(以哪个面做对称…

yolov8学习笔记(一)网络结构

一、yolov8.yaml YOLOv8详解 【网络结构代码实操】: YOLOv8详解 【网络结构代码实操】-CSDN博客文章浏览阅读10w次,点赞559次,收藏2.9k次。YOLOv8 算法的核心特性和改动可以归结为如下:提供了一个全新的 SOTA 模型,包…

SQL Server——建表时为字段添加注释

在 MySQL 中,新建数据库表为字段添加注释可以使用 comment 属性来实现。SQL Server 没有 comment 属性,但是可以通过执行 sys.sp_addextendedproperty 这个存储过程添加扩展属性来实现相同的功能。 这个存储过程的参数定义如下: exec sys.s…

TiDB 社区智慧合集丨TiDB 相关 SQL 脚本大全

非常感谢各位 TiDBer 在之前 【TiDBer 唠嗑茶话会 48】非正式 TiDB 相关 SQL 脚本征集大赛!( https://asktug.com/t/topic/996635 )里提供的各种常用脚本。 在这篇文章中,我们整理了社区同学提供的一系列 TiDB 相关 SQL 脚本,希望能为大家在…

基于Springboot实现课程评分系统设计和实现

基于java Springboot实现课程评分系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

Floyd算法详解

这里是引用 文章目录 写在前面要说floyd就不能只说板子状态转移空间优化kij or ijk 应用求多源最短路求传递闭包求无向图的最小环 写在前面 在做洛谷的树上dp题单的时候遇到了一道题目P1613 跑路发现自己对flyod的理解太浅薄了,于是去重新学习了一遍,又…

1.系统调用接口

1. 系统调用接口 1.1 Linux系统调用概念 系统调用(systemcall): 所有的操作系统在内核里都有一些内建的函数,这些函数完成对硬件的访问和对文件的打开、读、写、关闭等操作。 Linux 系统中称这些函数为系统调用。这些函数实现了…

Java学习笔记2024/2/23

今日内容 多态 包 final 权限修饰符 代码块 教学目标 能够说出使用多态的前提条件理解多态的向上转型理解多态的向下转型能够知道多态的使用场景包的作用public和private权限修饰符的作用描述final修饰的类的特点描述final修饰的方法的特点描述final修饰的变量的特点 第…

Unity实现帧序列

一、目的 1.想实现序列帧效果 自己使用Animation一直无法实现动画播放效果 二、参考 1. Unity序列帧动画——Sprite图片集制作UI动画_unity 序列帧动画图集-CSDN博客 结果:很好用,能实现效果 三、实操 新建Image,增加Animator组件&#x…

【行业交流】优积科技·国住人居与广东保利就学校、居住场景下模块化建筑技术的运用进行交流

近日,保利发展控股集团股份有限公司(以下简称“保利发展”)、 优积建筑科技发展(上海)有限公司(以下简称“优积科技”)、国住人居工程顾问有限公司(以下简称“国住人居公司”)就模块化建造体系与…

操作系统--多线程的互斥、同步

一、概念 在进程/线程并发执行的过程中,进程/线程之间存在协作的关系,例如有互斥、同步的关系。 1.互斥 由于多线程执行操作共享变量的这段代码可能会导致竞争状态,因此我们将此段代码称为临界区(critical section)…