PHPExcel 表格导入数据代码解析(二)

前面大概讲了phpexcel用表格导入数据到数据库中的教程,今天会详细剖析函数代码,话不多说,先上代码:

public function upload() {
    ini_set('memory_limit','1024M');
    //设定一个脚本所能够申请到的最大内存字节数,这有利于写的不好的脚本消耗服务器上的可用内存
    if (!empty($_FILES)) {
        $config = array(
            'exts' => array('xlsx','xls'),
            'maxSize' => 3145728000,
            'rootPath' =>"./Public/",
            'savePath' => 'Uploads/',
            'subName' => array('date','Ymd'),
        );//设置相关参数
        $upload = new \Think\Upload($config);//定义tp的Upload对象
        if (!$info = $upload->upload()) {     //$upload调用upload()函数并赋值给$info
            $this->error($upload->getError());
        }
        vendor("PHPExcel.PHPExcel");//thinkphp3.2.3中使用Vendor加载第三方类库
        $file_name=$upload->rootPath.$info['photo']['savepath'].$info['photo']['savename']; //文件名称
        $extension = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));//判断导入表格后缀格式
        if ($extension == 'xlsx') {
            $objReader =\PHPExcel_IOFactory::createReader('Excel2007');
            //创建一个特定的读取类,读取类型为‘Excel2007’
            $objPHPExcel =$objReader->load($file_name, $encode = 'utf-8');//读取文件$file_name
        } else if ($extension == 'xls'){
            $objReader =\PHPExcel_IOFactory::createReader('Excel5');
            $objPHPExcel =$objReader->load($file_name, $encode = 'utf-8');
        }
        $sheet =$objPHPExcel->getSheet(0);//getSheet()获取表集合

        $highestRow = $sheet->getHighestRow();//取得总行数
        $highestColumn =$sheet->getHighestColumn(); //取得总列数
        D('pro_info')->execute('truncate table pro_info');
        for ($i = 2; $i <= $highestRow; $i++) {
            $data['pId'] =$objPHPExcel->getActiveSheet()->getCell("A" . $i)->getValue();
            $data['pName'] =$objPHPExcel->getActiveSheet()->getCell("B" .$i)->getValue();
            $data['pPrice'] =$objPHPExcel->getActiveSheet()->getCell("C" .$i)->getValue();
            $data['pCount'] = $objPHPExcel->getActiveSheet()->getCell("D". $i)->getValue();
            D('pro_info')->add($data);
        }
        $this->success('导入成功!');
    } else {
        $this->error("请选择上传的文件");
    }
}

主要是流程图如下:

在上面代码上基本上都有注释,看不懂的没关系,下面我就几个点聊聊好了:

$upload = new \Think\Upload($config);//实例化上传类

TP文件上传:

属性

描述

maxSize

文件上传的最大文件大小(以字节为单位),0为不限大小

rootPath

文件上传保存的根路径

savePath

文件上传的保存路径(相对于根路径)

saveName

上传文件的保存规则,支持数组和字符串方式定义

saveExt

上传文件的保存后缀,不设置的话使用原文件后缀

replace

存在同名文件是否是覆盖,默认为false

exts

允许上传的文件后缀(留空为不限制),使用数组或者逗号分隔的字符串设置,默认为空

mimes

允许上传的文件类型(留空为不限制),使用数组或者逗号分隔的字符串设置,默认为空

autoSub

自动使用子目录保存上传文件 默认为true

subName

子目录创建方式,采用数组或者字符串方式定义

hash

是否生成文件的hash编码 默认为true

callback

检测文件是否存在回调,如果存在返回文件信息数组

设置好上传的参数后,就可以调用Think\Upload类的upload方法进行附件上传,如果失败,返回false,并且用getError方法获取错误提示信息;如果上传成功,就返回成功上传的文件信息数组。

  1. $info = $upload->upload();
  2. if(!$info) {// 上传错误提示错误信息
  3. $this->error($upload->getError());
  4. }else{// 上传成功 获取上传文件信息
  5. foreach($info as $file){
  6. echo $file['savepath'].$file['savename'];
  7. }
  8. }

属性

描述

key

附件上传的表单名称

savepath

上传文件的保存路径

name

上传文件的原始名称

savename

上传文件的保存名称

size

上传文件的大小

type

上传文件的MIME类型

ext

上传文件的后缀类型

md5

上传文件的md5哈希验证字符串 仅当hash设置开启后有效

sha1

上传文件的sha1哈希验证字符串 仅当hash设置开启后有效

文件上传成功后,就可以使用这些文件信息来进行其他的数据操作,例如保存到当前数据表或者单独的附件数据表

  1. $model = M('Photo');
  2. // 取得成功上传的文件信息
  3. $info = $upload->upload();
  4. // 保存当前数据对象
  5. $data['photo'] = $info[0]['savename'];
  6. $data['create_time'] = NOW_TIME;
  7. $model->add($data);

PHPExcel_IOFactory 读取文件:

vendor("PHPExcel.PHPExcel");
$objReader =\PHPExcel_IOFactory::createReader('Excel2007');
//创建一个特定的读取类,读取类型为‘Excel2007’
$objPHPExcel =$objReader->load($file_name, $encode = 'utf-8');
//读取文件$file_name

1.使用 PHPExcel_IOFactory 读取文件

$objPHPExcel = PHPExcel_IOFactory::load($inputFileName);

2.使用一个特定的读取类,读取文件

$objReader = new PHPExcel_Reader_Excel5();

$objPHPExcel = $objReader->load($inputFileName);

3.使用 PHPExcel_IOFactory 创建一个特定的读取类

$objReader = PHPExcel_IOFactory::createReader($inputFileType);

$objPHPExcel = $objReader->load($inputFileName);

读取类型有:

$inputFileType = 'Excel5';

$inputFileType = 'Excel2007';

$inputFileType = 'Excel2003XML';

$inputFileType = 'OOCalc';

$inputFileType = 'SYLK';

$inputFileType = 'Gnumeric';

$inputFileType = 'CSV';

4.使用 PHPExcel_IOFactory 来鉴别文件应该使用哪一个读取类

$inputFileType = PHPExcel_IOFactory::identify($inputFileName);

$objReader = PHPExcel_IOFactory::createReader($inputFileType);

$objPHPExcel = $objReader->load($inputFileName);

获取表集合:

$sheet =$objPHPExcel->getSheet(0);//getSheet()获取表集合

$highestRow = $sheet->getHighestRow();//取得总行数
$highestColumn =$sheet->getHighestColumn(); //取得总列数

循环读取数据:

原文发布于微信公众号 - 程序员的碎碎念(gh_53e607dd4782)

原文发表时间:2017-10-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏社区的朋友们

Java 动态加载 so 的解决方案

业务场景有对 so 实现动态加载/替换的需求,但 Java 并没有直接动态加载 so 的机制。本文将深度剖析 Java 加载 so 的实现机制,并提出一套 Ja...

1.3K1
来自专栏前端布道

全方位理解JavaScript的Event Loop

下面我们一个一个的来了解 Event Loop 相关的知识点,最后再一步一步分析出本段代码最后的输出顺序。

743
来自专栏Seebug漏洞平台

34c3 部分Web Writeup

34c3应该算是2017年年末的最后一个惊喜了,比赛题目虽然有非预期导致难度降了很多,但是从CTF中能学到什么才是最重要的,其中Web有3个XSS题目,思路非常...

43210
来自专栏守望轩

Visual Studio 2008 每日提示(二十三)

#221、在对象浏览器中按对象和成员排序 原文链接:You can sort objects and members in the Object Browse...

3736
来自专栏Python小屋

80行代码使用Python+tkinter实现一个计算器

闲话不说,直奔主题。建议大家跟着敲一遍代码,体会一下代码复用、字符串方法的运用和动态创建组件的妙处,然后在这个框架的基础上进行补充和发挥。 选择任何一款Pyth...

2737
来自专栏漫漫全栈路

ASP.NET MVC学习笔记06编辑方法和编辑视图

上一篇中,说到了MVC生成的Index方法,和Details方法,现在来说一下自动生成的方法和视图,应该怎么的来进行编辑。 优化日期显示 在这之前,先对前面的...

3655
来自专栏柠檬先生

Angularjs基础(一)

(一) 模型——视图——控制器     端对端的解决方案,AngularJS 试图成为WEB 应用中的一种段对端的解决方案。AngylarJS 的出众  ...

20210
来自专栏jiajia_deng

Cmder git 中文显示乱码解决方案

Cmder 是 Windows 下替换原有 cmd 的绝佳工具,但是与默认的 cmd 一样,都与 git 命令行存在一些兼容性问题,比如中文乱码问题。在 Cmd...

2182
来自专栏性能与架构

JS如何实现多线程?

单线程的问题 javascript是单线程执行的,在处理运算过程中,浏览器不能执行其它javascript脚本,UI渲染线程也会被挂起,从而导致浏览器进入僵死...

3195
来自专栏知道一点点

基于AngularJS的过滤与排序【转载】

  首先,如果要是先查询过滤,就要使用到AngularJS中的 过滤器filter 了。

821

扫码关注云+社区