编程语言
首页 > 编程语言> > TP5使用Composer安装PhpSpreadsheet类库实现导入导出

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

作者:互联网

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