首先下载PHPExcel类。网上很多,自行下载。
然后把文件放到vendor文件里面。
一般引用vendor里面的类或者插件用vendor();
里面加载的就是vendor文件,然后想要加载哪个文件,直接写就行,中间的“.”相当于文件路径的“/”。
例如加载excel5这个文件:
先把html代码贴出来(整个导入导出的):
???<form enctype="multipart/form-data" method="post" id="form-admin-role-add"> ???????<div class="form-group col-sm-2"> ???????????<input type="file" name="file_stu" /> ???????</div> ???????<div class="form-group col-sm-2"> ???????????<input type="submit" value="导入" class="btn btn-w-m btn-primary btn-outline" /> ???????</div> ???</form> ???<div class="form-group col-sm-2"> ???????<a class="btn btn-w-m btn-primary btn-outline" href="{:url(‘EquipmentList/out‘)}">下载excel表格</a> ???</div>
这里有个要注意的地方,我导入是做了异步的,导出不能做异步。
然后先放导入的方法吧:
//导入Excel ???public function into() ???{ ???????if (!empty ($_FILES [‘file_stu‘] [‘name‘])) { ???????????$tmp_file = $_FILES [‘file_stu‘] [‘tmp_name‘]; ???????????$file_types = explode(".", $_FILES [‘file_stu‘] [‘name‘]); ???????????$file_type = $file_types [count($file_types) - 1]; ???????????/*判别是不是.xls文件,判别是不是excel文件*/ ???????????if (strtolower($file_type) != "xlsx") { ???????????????$this->error(‘不是Excel文件,重新上传‘); ???????????} ???????????/*设置上传路径*/ ???????????/*百度有些文章写的上传路径经过编译之后斜杠不对。不对的时候用大写的DS代替,然后用连接符链接就可以拼凑路径了。*/ ???????????$savePath = ROOT_PATH . ‘public‘ . DS . ‘uploads‘ . DS;/*以时间来命名上传的文件*/ ???????????$str = date(‘Ymdhis‘); ???????????$file_name = $str . "." . $file_type; ???????????????????????/*是否上传成功*/ ??????????????????????if (!copy($tmp_file, $savePath . $file_name)) { ???????????????$this->error(‘上传失败‘); ???????????} ???????????/* ???????????*对上传的Excel数据进行处理生成编程数据,这个函数会在下面第三步的ExcelToArray类中 ???????????*注意:这里调用执行了第三步类里面的read函数,把Excel转化为数组并返回给$res,再进行数据库写入 ???????????*/ ???????????require THINK_PATH.‘library/think/ExcelToArrary.php‘;//导入excelToArray类 ?????????//引入这个类试了百度出来的好几个方法都不行。最后简单粗暴的使用了require方式。这个类想放在哪里放在哪里。只要路径对就行。 ????????????????????$ExcelToArrary = new ExcelToArrary();//实例化 ???????????????????????$res=$ExcelToArrary->read($savePath.$file_name,"UTF-8",$file_type);//传参,判断office2007还是office2003 ??????????????????????/*对生成的数组进行数据库的写入*/ ???????????foreach ($res as $k => $v) { ???????????????if ($k > 1) { ???????????????????$data[$k][‘pname‘] = $v[0]; ???????????????????$data[$k][‘access‘] = $v[1]; ??????????????????$data[$k][‘jointime‘] = time(); ???????????????} ???????????} ???????????????????????//插入的操作最好放在循环外面 ???????????$result = model(‘ProductAccess‘)->insertAll($data); ???????????????????????if($result){ ???????????????return [‘state‘=>true, ‘msg‘=>‘导入成功‘]; ???????????}else{ ???????????????return [‘state‘=>false, ‘msg‘=>‘导入失败‘]; ???????????} ???????} ???}
这里面有要引入ExcelToArray,代码如下:
<?phpnamespace think;use PHPExcel_IOFactory;use PHPExcel_Cell;use PHPExcel;/** ?* 读取Excel数据 */class ExcelToArrary{ ???public function __construct() { ???????//这些文件需要下载phpexcel,然后放在vendor文件里面。具体参考上一篇数据导出。 ???????vendor("PHPExcel.PHPExcel.PHPExcel"); ???????vendor("PHPExcel.PHPExcel.Writer.IWriter"); ???????vendor("PHPExcel.PHPExcel.Writer.Abstract"); ???????vendor("PHPExcel.PHPExcel.Writer.Excel5"); ???????vendor("PHPExcel.PHPExcel.Writer.Excel2007"); ???????vendor("PHPExcel.PHPExcel.IOFactory"); ???} ???public function read($filename,$encode,$file_type){ ???????????if(strtolower ( $file_type )==‘xls‘)//判断excel表类型为2003还是2007 ???????????{ ???????????????Vendor("Excel.PHPExcel.Reader.Excel5"); ????????????????$objReader = PHPExcel_IOFactory::createReader(‘Excel5‘); ???????????????$objReader = PHPExcel_IOFactory::createReader(‘Excel5‘); ???????????}elseif(strtolower ( $file_type )==‘xlsx‘) ???????????{ ???????????????Vendor("Excel.PHPExcel.Reader.Excel2007"); ????????????????$objReader = PHPExcel_IOFactory::createReader(‘Excel2007‘); ???????????} ???????????$objReader->setReadDataOnly(true); ???????????$objPHPExcel = $objReader->load($filename); ???????????$objWorksheet = $objPHPExcel->getActiveSheet(); ???????????$highestRow = $objWorksheet->getHighestRow(); ???????????$highestColumn = $objWorksheet->getHighestColumn(); ???????????$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); ???????????$excelData = array(); ???????????for ($row = 1; $row <= $highestRow; $row++) { ???????????????for ($col = 0; $col < $highestColumnIndex; $col++) { ???????????????????$excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue(); ???????????????????} ???????????} ???????????return $excelData; ???}}
只要类都引入成功了,代码直接贴上去就能用了
这里改成你自己的。导入就完成啦。
然后就是导出。
//导出Excel ???public function out() ???{ ???????????????//导出 ???????$path = dirname(__FILE__); //找到当前脚本所在路径 ???????vendor("PHPExcel.PHPExcel.PHPExcel"); ???????vendor("PHPExcel.PHPExcel.Writer.IWriter"); ???????vendor("PHPExcel.PHPExcel.Writer.Abstract"); ???????vendor("PHPExcel.PHPExcel.Writer.Excel5"); ???????vendor("PHPExcel.PHPExcel.Writer.Excel2007"); ???????vendor("PHPExcel.PHPExcel.IOFactory"); ???????$objPHPExcel = new \PHPExcel(); ???????$objWriter = new \PHPExcel_Writer_Excel5($objPHPExcel); ???????$objWriter = new \PHPExcel_Writer_Excel2007($objPHPExcel); ???????// 实例化完了之后就先把数据库里面的数据查出来 ???????$sql = model(‘ProductAccess‘)->select(); ???????// 设置表头信息 ???????$objPHPExcel->setActiveSheetIndex(0) ???????->setCellValue(‘A1‘, ‘机型‘) ???????->setCellValue(‘B1‘, ‘机型编号‘) ???????->setCellValue(‘C1‘, ‘生产日期‘); ???????/*--------------开始从数据库提取信息插入Excel表中------------------*/ ???????$i=2; ?//定义一个i变量,目的是在循环输出数据是控制行数 ???????$count = count($sql); ?//计算有多少条数据 ???????for ($i = 2; $i <= $count+1; $i++) { ???????????$objPHPExcel->getActiveSheet()->setCellValue(‘A‘ . $i, $sql[$i-2][‘pname‘]); ???????????$objPHPExcel->getActiveSheet()->setCellValue(‘B‘ . $i, $sql[$i-2][‘access‘]); ???????????$objPHPExcel->getActiveSheet()->setCellValue(‘C‘ . $i, $sql[$i-2][‘jointime‘]); ???????} ???????????????/*--------------下面是设置其他信息------------------*/ ???????$objPHPExcel->getActiveSheet()->setTitle(‘productaccess‘); ?????//设置sheet的名称 ???????$objPHPExcel->setActiveSheetIndex(0); ??????????????????//设置sheet的起始位置 ???????$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, ‘Excel5‘); ??//通过PHPExcel_IOFactory的写函数将上面数据写出来 ???????????????$PHPWriter = \PHPExcel_IOFactory::createWriter( $objPHPExcel,"Excel2007"); ???????????????????header(‘Content-Disposition: attachment;filename="设备列表.xlsx"‘); ???????header(‘Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet‘); ???????????????$PHPWriter->save("php://output"); //表示在$path路径下面生成demo.xlsx文件 ???????????}
这部分相应改成自己的就成了。
我做这个,遇到的问题也基本就是类引入不成功。只要都引入成功了。就改相应代码就OK了。
thinkphp5 使用PHPExcel 导入导出
原文地址:http://www.cnblogs.com/yayaa/p/8006919.html