之前写过 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);
}
本文为白俊遥原创文章,转载无需和我联系,但请注明来自白俊遥博客https://baijunyao.com 欢迎捐赠赞赏加入组织创建QQ群及捐赠渠道
你好包包丶℃ :Vendor('PHPExcel.PHPExcel');Class 'Home\Controller\PHPExcel_IOFactory' not found引入正常 PHPExcel拉到项目的Vendor里面的
2018-03-14 19:22:18 回复
没有冰激凌的夏天不完整 :excel 导入导出总结实践 http://www.combql.com/?cat=8
2017-11-08 11:06:08 回复
孙东瓜 :为什么不能读取第二个sheet,我已经修改了另外一个函数,第一个函数获取第一个表,第二个函数获取第二个但是不能读取?
2017-11-07 20:06:04 回复
云淡风晴 :试试这个?https://phpspreadsheet.readthedocs.io/en/develop/topics/reading-files/
2017-11-07 23:47:55 回复
离散的风 :导出的excel 如果上下行数据一样就合并单元格,怎么做?如 导出的表格 单位 姓名 性别,以单位为order 导出,碰见单位一样的,就合并单元格,要怎么做?谢谢?
2017-09-28 09:08:16 回复
云淡风晴 :https://phpspreadsheet.readthedocs.io/en/develop/topics/recipes/#mergeunmerge-cells 这有合并单元格的文档;可以试试这个;
2017-11-07 23:53:56 回复
丿Dark丨灬拓 :一直报错 Class 'PHPExcel_IOFactory' not found ; 什么原因? 怎么解决 谢谢了
2017-09-20 16:07:54 回复
云淡风晴 :没有正常导入;实在不行就手动include;
2017-09-20 22:46:50 回复
我的电脑 :有个问题求解答!!The filename ./Uploads/2017-07-12/5965dd321c2b8.xls is not recognised as an OLE file 错误位置 FILE: D:\phpStudy\WWW\borrow\ThinkPHP\Library\Vendor\PHPExcel\PHPExcel\Shared\OLERead.php LINE: 89
2017-07-12 16:29:18 回复
云淡风晴 :搜索引擎一下这个问题;一大堆解决方案;试试看行不;
2017-07-12 23:13:35 回复
stranger :为什么我的引用一直报错,我已经把
2017-06-12 18:15:49 回复
守望`夏末 :为什么我只能读取一列呢···?
2017-06-01 16:22:31 回复
tangsanshui :程序员都是喜欢留下自己的墨宝,为了做个自己的东西,偶尔加个班都不在话下,
2017-04-29 17:41:47 回复
LauEl :可以分享一下qq登录这些怎么做的吗
2017-04-21 23:28:01 回复
Jepson :The filename ./Upload/excel/2017-01-26/588a090b6e322.xls is not recognised as an OLE file.前辈们,你们有没有遇到这个问题??
2017-01-26 22:36:10 回复
绝言 :https://www.cnblogs.com/cqingt/p/5338023.html
2018-01-19 10:57:00 回复
Alan :哥,我毕业设计需要用到这个,能不能留个扣扣号找你
2017-01-23 01:28:18 回复
云淡风晴 :可以发我邮箱;
2017-01-28 21:14:54 回复
Mr、han :tp5需要怎么修改
2017-01-12 16:28:39 回复
Mr、han :Passed array does not specify an existing static method (class 'PHPExcel_Autoloader' not found)
2017-01-12 16:28:03 回复
清真猪肉罐头 :今天开始用管理系统,很好用,有个地方提个建议import_excel这个函数的$type = $type === 'csv' ? $type : 'Excel5';位置可以改为if ($type == 'xlsx') { $type = 'Excel2007'; } elseif ($type == 'xls') { $type = 'Excel5'; }因为我之前上传xlsx文件报错,改了之后就好了
2016-12-30 10:17:02 回复
云淡风晴 :多谢反馈;
2017-01-02 14:05:47 回复
李崬生 :方便交流下么
2017-03-24 00:58:22 回复
梵梵✅ :你好 白前辈!我往数据库插入40000条数据的时候就插入不进,10000以下就可以。能有什么房法解决吗?
2016-12-09 13:52:25 回复
云淡风晴 :40000条数据对mysql来说没有压力;可以检查插入失败的那条数据的sql;看是否有问题;
2016-12-11 21:59:01 回复
. :求一份整合5.0的。。。
2016-11-24 01:08:25 回复
errortm :这是用的thinkphp哪个版本
2016-11-03 21:38:00 回复
云淡风晴 :3.2.3
2016-11-03 23:52:14 回复
errortm :5.0的需要修改的东西多吗
2016-11-04 11:52:26 回复
云淡风晴 :其实不限制于使用什么框架的;更换下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 回复
有风方可飞丶 :我也遇到了同样的问题,请问您解决了吗
2017-07-26 15:40:20 回复
~ :我是在App\Common\Common\function.php 文件中引用的。
2017-07-26 17:00:12 回复
丿Dark丨灬拓 :你好 我和你一样的问题 请问你解决了吗 怎么解决的
2017-09-20 16:10:08 回复
丿Dark丨灬拓 :你好 我和你一样的问题 请问你解决了吗 怎么解决的
2017-09-20 16:10:35 回复
千翼网络--技术(37) :Decryption password incorrect 这个是什么问题昂
2016-10-19 15:19:14 回复
云淡风晴 :excel加密的?
2016-10-19 22:31:57 回复
Lkp :师兄,我也加,963492628,跟你学习了很多东西,希望能和你交流,不会打扰到你的
2016-10-18 09:18:53 回复
Speech :这个是tinkphp5吗,能发一个demo 或者说吗 qq 250285636@qq.com
2016-10-09 00:49:57 回复
云淡风晴 :不好意思;这个是thinkphp3.2.3的;容我有时间了;写一份thinkphp5的;
2016-10-09 07:09:44 回复
^ω^将子拖走^ω^ :可以使用我写的,参照了大神的。地址:https://github.com/jujulike/tp5excel
2019-03-15 10:24:00 回复
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 回复
云淡风晴 :比较大的表;建议使用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;$currentRowgetValue(); } } $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 :看看
2016-09-08 13:22:42 回复
最新评论