thinkphp整合系列之phpexcel导入excel数据

之前写过 thinkphp整合系列之phpexcel生成生成excel文件

和  php生成csv格式的excel表格 两种生成excel的方法

简简单单 同学的评论需求;

这里熬夜加班加点写出一个phpexcel导入数据的方法;


示例项目:https://github.com/baijunyao/thinkphp-bjyadmin

一:导入phpexcel

/ThinkPHP/Library/Vendor/PHPExcel

二:导入excel的函数

/**
 * 导入excel文件
 * @param  string $file excel文件路径
 * @return array        excel文件内容数组
 */
function import_excel($file){
    // 判断文件是什么格式
    $type = pathinfo($file); 
    $type = strtolower($type["extension"]);
    $type=$type==='csv' ? $type : 'Excel5';
    ini_set('max_execution_time', '0');
    Vendor('PHPExcel.PHPExcel');
    // 判断使用哪种格式
    $objReader = PHPExcel_IOFactory::createReader($type);
    $objPHPExcel = $objReader->load($file); 
    $sheet = $objPHPExcel->getSheet(0); 
    // 取得总行数 
    $highestRow = $sheet->getHighestRow();     
    // 取得总列数      
    $highestColumn = $sheet->getHighestColumn(); 
    //循环读取excel文件,读取一条,插入一条
    $data=array();
    //从第一行开始读取数据
    for($j=1;$j<=$highestRow;$j++){
        //从A列读取数据
        for($k='A';$k<=$highestColumn;$k++){
            // 读取单元格
            $data[$j][]=$objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue();
        } 
    }  
    return $data;
}

三:调用示例

先用之前文章生成excel的方法分别生成了xls和csv格式的表格放在了/Upload/excel/目录下;

当然正常导入的话;是需要用户上传excel文件的;

这里就略过上传的过程;直接写的是传入文件路径调用函数的了;

/Application/Home/Controller/IndexController.class.php

    /**
     * 导入excel数据
     */
    public function import(){
        // 导入csv格式的数据
        $data=import_excel('./Upload/excel/simple.csv');
        p($data);
        // 导入xls格式的数据
        $data=import_excel('./Upload/excel/simple.xls');
        p($data);die;
    }

//*****************************回复 李庆发-多迪网络 童鞋的分割线*******************************

2016.8.22补充:

上面的p函数是为了优化输出显示的样式:以符合人类阅读的方式打印php数组

整合到自己的项目中用var_dump代替查看即可;

2016.8.22补充:

这里将上面的import拆为两个方法;

关于phpexcel导入大文件效率的问题;

建议将xls转为csv格式的表格;

然后调用import_csv这个方法

    /**
     * 导入xls格式的数据 
     * 也可以用来导入csv格式的数据
     * 但是csv建议使用 下面的import_csv 效率更高
     */
    public function import_xls(){
        $data=import_excel('./Upload/excel/simple.xls');
        p($data);
    }

    /**
     * 导入csv格式的数据
     */
    public function import_csv(){
        $data=file_get_contents('./Upload/excel/simple.csv');
        $data=explode("\r\n", $data);
        p($data);
    }



白俊遥博客

白俊遥博客
请先登陆后发表评论
  • 最新评论
  • 总共21条评论
白俊遥博客

梵梵✅:你好 白前辈!我往数据库插入40000条数据的时候就插入不进,10000以下就可以。能有什么房法解决吗?

2016-12-09 13:52:25 回复

白俊遥博客

.:求一份整合5.0的。。。

2016-11-24 01:08:25 回复

白俊遥博客

errortm:这是用的thinkphp哪个版本

2016-11-03 21:38:00 回复

白俊遥博客
  • 云淡风晴 回复 errortm:3.2.3
  • 2016-11-03 23:52:14 回复
白俊遥博客
  • errortm 回复 云淡风晴:5.0的需要修改的东西多吗
  • 2016-11-04 11:52:26 回复
白俊遥博客
  • 云淡风晴 回复 errortm:其实不限制于使用什么框架的;更换下include即可;
  • 2016-11-04 23:36:43 回复
白俊遥博客

ˉ那年那天.:大神 Class 'Admin\Controller\PHPExcel' not found 求解决

2016-11-02 18:13:39 回复

白俊遥博客
  • 云淡风晴 回复 ˉ那年那天.:没有成功导入类;
  • 2016-11-03 23:52:40 回复
白俊遥博客

:请问为什么我把导入excal的函数代码复制到我的项目中,同样也把PHPExcal文件复制到Vendor中了,但是在  $objReader = PHPExcel_IOFactory::createReader($type); 这一句中还是报错了 Class 'Home\Controller\PHPExcel_IOFactory' not found 。

2016-10-25 19:56:04 回复

白俊遥博客
  • 云淡风晴 回复 :用示例项目报错么?
  • 2016-10-27 00:11:41 回复
白俊遥博客

千翼网络--技术(37):Decryption password incorrect 这个是什么问题昂

2016-10-19 15:19:14 回复

白俊遥博客
  • 云淡风晴 回复 千翼网络--技术(37):excel加密的?
  • 2016-10-19 22:31:57 回复
白俊遥博客

Lkp白俊遥博客师兄,我也加,963492628,跟你学习了很多东西,希望能和你交流,不会打扰到你的

2016-10-18 09:18:53 回复

白俊遥博客

Tom:这个是tinkphp5吗,能发一个demo 或者说吗 qq           250285636@qq.com

2016-10-09 00:49:57 回复

白俊遥博客
  • 云淡风晴 回复 Tom:不好意思;这个是thinkphp3.2.3的;容我有时间了;写一份thinkphp5的;
  • 2016-10-09 07:09:44 回复
白俊遥博客

o:一个 比较大的表导入后只能显示第一列的数据.不知道为什么.担心是遍历地方出问题哦 .源文件是wps编辑的xlsarray (size=7)  1 =>     array (size=1)      0 => float 1  2 =>     array (size=1)      0 => float 2  3 =>     array (size=1)      0 => float 3  4 =>     array (size=1)      0 => float 4  5 =>     array (size=1)      0 => float 5  6 =>     array (size=1)      0 => float 6  7 =>     array (size=1)      0 => float 7

2016-09-17 21:34:40 回复

白俊遥博客
  • 云淡风晴 回复 o:比较大的表;建议使用csv格式的导入;
  • 2016-10-09 07:10:04 回复
白俊遥博客

米兔白俊遥博客这个地方还是有个问题,有的文件打印出来是这样的鬼东西、[2] => Array ( [0] => 506665 [1] => 12 [2] => PHPExcel_RichText Object ( [_richTextElements:PHPExcel_RichText:private] => Array ( [0] => PHPExcel_RichText_TextElement Object ( [_text:PHPExcel_RichText_TextElement:private] => 哈尔滨红肠3 ) [1] => PHPExcel_RichText_Run Object ( [_font:PHPExcel_RichText_Run:private] => PHPExcel_Style_Font Object ( [_name:protected] => 宋体 [_size:protected] => 11 [_bold:protected] => [_italic:protected] => [_superScript:protected] => [_subScript:protected] => [_underline:protected] => none [_strikethrough:protected] => [_color:protected] => PHPExcel_Style_Color Object ( [_argb:protected] => FF000000 [_parentPropertyName:protected] => [_isSupervisor:protected] => [_parent:protected] => ) [_isSupervisor:protected] => [_parent:protected] => [colorIndex] => 8 ) [_text:PHPExcel_RichText_TextElement:private] => 3 ) ) ) [3] => 哈尔滨红肠 [4] => 3344 [5] => 1 )

2016-09-17 01:15:40 回复

白俊遥博客

missU:受益了,写的很简练,谢谢白大大

2016-08-29 11:06:07 回复

白俊遥博客

蜗壳白俊遥博客白俊遥博客打算的撒大大 大阿萨德白俊遥博客的撒大大手打是大神大大撒大大撒大声地大神大神大神大大神

2016-08-23 13:39:20 回复

白俊遥博客

蜗壳白俊遥博客

2016-08-23 13:38:27 回复

白俊遥博客

李庆发-多迪网络:/* * 读取文件 */ protected function goods_import($filename, $exts='xls',$classId) { //导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入 import("Org.Util.PHPExcel"); //创建PHPExcel对象,注意,不能少了\ $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(); } $sheetName = '考勤详细'; //只加载指定的sheet $PHPReader->setLoadSheetsOnly($sheetName); //加载文件 $PHPExcel=$PHPReader->load($filename); //载入文件 //$PHPExcel=$PHPReader->load($filename); //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推 $currentSheet=$PHPExcel->getSheet(); //获取总列数 $allColumn=$currentSheet->getHighestColumn(); //获取总行数 $allRow=$currentSheet->getHighestRow(); //循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始 for($currentRow=5;$currentRow<=$allRow;$currentRow++){ //从哪列开始,A表示第一列 for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){ //数据坐标 $address=$currentColumn.$currentRow; //读取到的数据,保存到数组$arr中 $data[$currentRow][$currentColumn]=(string)$currentSheet->getCell($address)->getValue(); } } $this->save_import($data,$classId); **********经过测试就是载入文件最好内存!*************

2016-08-22 21:28:23 回复

白俊遥博客

白俊遥博客

2016-08-22 14:45:18 回复

白俊遥博客

:为什么头部  会有echo。。。。

2016-08-22 14:45:03 回复

白俊遥博客
  • 云淡风晴 回复 :导入的过程中有echo?哪行的输出?
  • 2016-08-22 21:02:45 回复
白俊遥博客

李庆发-多迪网络:请问p是什么方法?thinkphp没有这个方法,应该是自己定义的,能看一下这个方法么?

2016-08-22 09:34:05 回复

白俊遥博客
  • 云淡风晴 回复 李庆发-多迪网络:是的在/Application/Common/Common/function.php文件中  http://baijunyao.com/article/20
  • 2016-08-22 20:53:24 回复
白俊遥博客
  • 李庆发-多迪网络 回复 云淡风晴:我是用这个方法导入公司的考勤数据,当考勤记录只有100多条的时候,没啥问题,当考勤记录1000多条,就会报内存不足,用G查看发现解析excel很耗内存,大神是怎么解决的?
  • 2016-08-22 21:00:27 回复
白俊遥博客
  • 李庆发-多迪网络 回复 云淡风晴:我是用这个方法导入公司的考勤数据,当考勤记录只有100多条的时候,没啥问题,当考勤记录1000多条,就会报内存不足,用G查看发现解析excel很耗内存,大神是怎么解决的?
  • 2016-08-22 21:01:22 回复
白俊遥博客
  • 李庆发-多迪网络 回复 云淡风晴白俊遥博客这个二级回复好像有点问题....
  • 2016-08-22 21:02:20 回复
白俊遥博客
  • 云淡风晴 回复 李庆发-多迪网络:把方法补充到文章的最后了;
  • 2016-08-22 21:24:10 回复
白俊遥博客
  • じ情非得ぐ已 回复 李庆发-多迪网络:有道理
  • 2016-08-27 10:21:37 回复
白俊遥博客
  • じ情非得ぐ已 回复 云淡风晴:测试
  • 2016-08-27 10:49:23 回复
白俊遥博客
  • じ情非得ぐ已 回复 云淡风晴:测试1
  • 2016-08-27 10:49:42 回复
白俊遥博客
  • じ情非得ぐ已 回复 李庆发-多迪网络:测试2
  • 2016-08-27 10:49:53 回复
白俊遥博客
  • じ情非得ぐ已 回复 李庆发-多迪网络:回复云淡风轻
  • 2016-08-27 10:51:02 回复
白俊遥博客

淡白色╰一素锦流年:怎么显示Class 'Admin\Controller\PHPExcel_IOFactory' not found错误位置FILE: D:\www\excel\Application\Admin\Controller\IndexController.class.php  LINE: 53

2016-08-22 09:28:32 回复

白俊遥博客
  • 云淡风晴 回复 淡白色╰一素锦流年:是整合到自己的项目中出错的么?看文件是否正常引入;
  • 2016-08-22 20:59:12 回复
白俊遥博客

白俊遥博客

2016-08-20 14:56:41 回复

白俊遥博客

_:瞅瞅

2016-08-18 16:59:33 回复

白俊遥博客

(^_^):看看

2016-08-17 23:26:01 回复

白俊遥博客
  • 牧马一族 回复 (^_^): =-
  • 2016-08-18 16:30:48 回复
白俊遥博客
  • 当时我就2了 回复 牧马一族:看看
  • 2016-08-19 15:08:52 回复
白俊遥博客
  • zhttty 回复 当时我就2了:看看
  • 2016-09-08 13:22:42 回复