ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

TP5使用Composer安装PhpSpreadsheet类库实现导入导出

2020-03-31 19:00:46  阅读:468  来源: 互联网

标签:类库 insert excel getValue PhpSpreadsheet TP5 getCell new data


PhpSpreadsheet是PHPExcel的下一个版本。它打破了兼容性,大大提高了代码库质量(命名空间,PSR合规性,最新PHP语言功能的使用等)。

由于所有努力都转移到了PhpSpreadsheet,因此将不再维护PHPExcel。PHPExcel,补丁和新功能的所有贡献都应该针对PhpSpreadsheet开发分支。

说明:由于PHPExcel已更名phpspreadsheet,PHPExcel已不再更新,兼容新版本PHP会存在某些问题,建议升级到PHPSpreadsheet。

  PHPExcel已经被废弃在PHP7.2中已经无法获取更新,官方重新开了一个新包phpspreadsheet
环境及版本:ThinkPHP5.1.24、PHP7.2.8、Nginx1.15.3
功能实现:使用phpspreadsheet导出Excel、导入Excel返回数组数据
安装说明:请先使用composer安装依赖:composer install
在线地址:http://demo.linzening.club/
Git地址:https://gitee.com/linzening/newthink

重要的事情说N遍,建议使用       phpspreadsheet

composer安装

composer require phpoffice/phpspreadsheet

安装好之后

<!-- Excle导入 开始 -->
    <form action="/admin/market/csj_upExcle" method="post" enctype="multipart/form-data" class="layui-form layui-form-pane form-search dd1">
        <div class="layui-form-item layui-inline">
            <label class="layui-form-label">导入文件</label>
            <div class="layui-input-inline" style="width: 160px;">
                <input name="csjexclefile" class="layui-input" type="file">
            </div>
            <input type="hidden" name="now_time" class="csj_date" value=""><div class="layui-input-inline" style="width: 100px;">
                <input class="layui-input csjSubmit" type="submit" value="上传" style="width: 55px;">
            </div></div>
    </form>

只需要看form表单中input-name即可,其他的是  layui    不用管,提交表单之后   后台

<?php
namespace app\admin\controller;

use controller\BasicAdmin;use think\Db;use PHPExcel_IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\IOFactory;
use think\Loader;
use service\AliyunLogService;

/**
 * 大盘总览
 * Class Market
 * @package app\admin\controller
 */
class Index extends BasicAdmin
{public function csj_upExcle()
    {
        header("content-type:text/html;charset=utf-8");
        $file = request()->file('csjexclefile');
        //将文件保存到public/uploads目录下面
        $info = $file->move('./uploads');
        if ($info) {
            //获取上传到后台的文件名
            $fileName = $info->getSaveName();
            //获取文件路径.
            $filePath =__DIR__."/../../../uploads"      . DIRECTORY_SEPARATOR . $fileName;
            //获取文件后缀
            $suffix = $info->getExtension();
            // 有Xls和Xlsx和Cvs格式三种
            if ($suffix=="xls")
            {
                $reader = IOFactory::createReader('Xls');
            }elseif ($suffix=="xlsx")
            {
                $reader = IOFactory::createReader('Xlsx');
            }elseif ($suffix=="csv")
            {
                $reader = IOFactory::createReader('Csv');
            }
        } else {
            return "<script>alert('文件过大或格式不正确导致上传失败-_-!');window.history.back(-1);</script>";
        }
        //如果是cvs文件则不走PhpSpreadsheet
        if ($suffix=="csv")
        {
            $handle = fopen($filePath,'r');
            if (!$handle)
            {
                return "<script>alert('读取文件失败-_-!');window.history.back(-1);</script>";
            }
            //不取第一个集合(第一个集合是主题)
            $j = 0;
            //新数组下标从0开始
            $k = 0;
            $new_insert_data = [];
            while(($data = fgetcsv($handle)) !== false)
            {
                for ($i = 0; $i < count($data); $i++) {
                    $data[$i] = iconv('gbk', 'utf-8', $data[$i]);
                }
                if ($j>0)
                {
                    if (in_array($data[1],$gameArr))
                    {
                        $new_insert_data[$k]['game_name'] = $data[1];
                        $new_insert_data[$k]['date'] = date("Y-m-d",strtotime($data[0]));
                        $new_insert_data[$k]['channel'] = $data[2];
                        $new_insert_data[$k]['c_income'] = $data[3];
                        $new_insert_data[$k]['c_impel_income'] = $data[4];
                        $new_insert_data[$k]['c_information_income'] = $data[5];
                        $new_insert_data[$k]['c_all_video_income'] = $data[6];
                        $new_insert_data[$k]['c_start_video_income'] = $data[7];
                        $new_insert_data[$k]['c_insert_video_income'] = $data[8];
                        $new_insert_data[$k]['c_banner_income'] = $data[9];$k++;
                    }
                }
                $j++;
            }
        }else{
            //载入excel文件
            $excel = $reader->load($filePath);
            //读取第一张表
            $sheet = $excel->getSheet(0);
            //var_dump($sheet);die();
            //获取总行数
            $row_num = $sheet->getHighestRow();
            //获取总列数
            $col_num = $sheet->getHighestColumn();
            $insert_data = [];
            for ($i = 2; $i <= $row_num; $i++) {
                $game_name = $excel->getActiveSheet()->getCell("B" . $i)->getValue();
                if (in_array($game_name,$gameArr))
                {$insert_data[$i]['date'] = gmdate('Y-m-d',intval(($excel->getActiveSheet()->getCell("A" . $i)->getValue() - 25569) * 3600 * 24));
                    $insert_data[$i]['game'] = $excel->getActiveSheet()->getCell("B" . $i)->getValue();
                    $insert_data[$i]['chel'] = $excel->getActiveSheet()->getCell("C" . $i)->getValue();
                    $insert_data[$i]['c_me'] = $excel->getActiveSheet()->getCell("D" . $i)->getValue();
                    $insert_data[$i]['c_icome'] = $excel->getActiveSheet()->getCell("E" . $i)->getValue();
                    $insert_data[$i]['c_inincome'] = $excel->getActiveSheet()->getCell("F" . $i)->getValue();
                    $insert_data[$i]['c_alincome'] = $excel->getActiveSheet()->getCell("G" . $i)->getValue();
                    $insert_data[$i]['c_stacome'] = $excel->getActiveSheet()->getCell("H" . $i)->getValue();
                    $insert_data[$i]['c_ins_income'] = $excel->getActiveSheet()->getCell("I" . $i)->getValue();
                    $insert_data[$i]['c_e'] = $excel->getActiveSheet()->getCell("J" . $i)->getValue();
                    $insert_data[$i]['c_come'] = $excel->getActiveSheet()->getCell("K" . $i)->getValue();
                }
            }
            if (empty($insert_data)) {
                return "<script>alert('数据解析失败,请检查Excle序列号是否连续/联系管理员!');window.history.back(-1);</script>";
            }
            $new_insert_data = array_values($insert_data);
        }
      //入库就好了 $res = $this->insertCsj(); if ($res) { return "<script>alert('导入成功!');window.history.back(-1);</script>"; } } }

我这边没有导入cvs结尾的excle表格没有走  PhpSpreadsheet    因为中文读取为空。可能是我的表哥有问题吧。

我的表格这个样子

 

标签:类库,insert,excel,getValue,PhpSpreadsheet,TP5,getCell,new,data
来源: https://www.cnblogs.com/T8888/p/12607570.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有