接到的任务是将excel 中的数据 先预览到前端页面 之后 在插入到数据库中 这里就要用到的东西就是咱们的PHPexcel 这个百度一下就好 之后把下载的文件 放到vendor 下面
这个路径一定要记住了 引用好
vendor("PHPExecl.PHPExcel");
vendor("PHPExcel.PHPExcel.PHPExcel_IOFactory");
vendor("PHPExcel.PHPExcel.Reader.Excel5");
这是楼主的引用方式 跟我一样就好 这三个文件一个不能少 。
前端的话就是一个 简单的input 上传标签 ,文件必须上传 才能 读取 , 所以先要上传 读取数据
if (!empty($_FILES)) {
cookie('filesname',$_FILES['files']['name']);
$config=array(
'maxSize' => '3145728',
'exts'=>array('xlsx','xls'),
'rootPath' => './',
'savePath'=>'./Public/upload/',
'saveRule'=>'time',
);
$upload = new \Think\Upload($config);
$info =$upload->upload();
if (!$info) {
$this->error($upload->getError());
}
上传之后存入到$info 变量中 之后要用到 ,其他都是正常的上传设置 不在多说。
$objPHPExcel = new \PHPExcel();
这一步非常关键 实例化 phpexcel 这里要注意命名空间的问题 楼主在这个位置 爬坑 爬了半天 那个反斜扛 切记切记 。
$file_name=$info['files']['savepath'].$info['files']['savename'];
$objReader = \PHPExcel_IOFactory::createReader('Excel5');
$objPHPExcel = $objReader->load($file_name,$encode='utf-8');
$sheet = $objPHPExcel->getSheet(0);
$highestRow = $sheet->getHighestRow(); // 取得总行数
$highestColumn = $sheet->getHighestColumn(); // 取得总列数
这一段是获取数据表的结构 对要上传的数据进行第一步的数据验证 也就是数据类型是否正确 比较麻烦的额就是这个 是否为空了 仔细看一下 应该不难理解
for($i=2;$i<=$highestRow;$i++){
$flag=1;
foreach ($data as $key => $value) {
$number=65; //大写字母
$number+=$key;
$date[$value]=$objPHPExcel->getActiveSheet()->getCell(chr($number).$i)->getValue();
}
}
通过 反编译ASCII 码 把ABCDE...... 遍历出来
unlink($file_name);
$this->ajaxReturn($result);
这里把 上传的文件删掉了 因为之前已经把数据保存到session了,这中间 还有一部分 check验证 将可以成功上传的条目和不能成功上传的条目都显示出来 。
想要了解这个是怎么实现的可以关注我的下一篇博客 将详细讲解
这样就把 整个文件 在页面预览出来了 可以上传的 不能上传的也分类打印 一目了然; 分别加个button 控制上传和下载就可以了。
function jointable(){
$user=M(session('table'));
$date=session('space');
foreach ($date as $key => $value) {
$user->add($value,$options=array(),$replace=true);
}
$this->ajaxReturn(1);
}
接下来就是下载了。 将错误的信息条目导出到一个新的表格中 下载下来 。
public function outexcel(){
//引入PHPExcel库文件
vendor("PHPExecl.PHPExcel");
vendor("PHPExcel.PHPExcel.PHPExcel_IOFactory");
vendor("PHPExcel.PHPExcel.Reader.Excel5");
//创建对象
$excel = new \PHPExcel();
$num=65; // 大写字母 A
//填充表头信息
$table=session('table');
$head=M('main');
$map=array('main_id'=>$table);
$header=$head->where($map)->select();
foreach ($header[0] as $key => $value) {
if ($key>0&&$value!="") {
$tableheader[]=$value;
//EXCEL 表头值 中文字段
$letter[]=chr($num); // excel列 值 ABCDEFG...
$num++;
}
}
for($i = 0;$i < count($tableheader);$i++) {
$excel->getActiveSheet()->setCellValue("$letter[$i]1","$tableheader[$i]");
}
//表格数组
$data = session('roow');
//填充表格信息
for ($i = 2;$i <= count($data)+1;$i++) {
$j = 0;
foreach ($data[$i - 2] as $key=>$value) {
$excel->getActiveSheet()->setCellValue("$letter[$j]$i","$value");
$j++;
}
}
//创建Excel输入对象
$write = new \PHPExcel_Writer_Excel5($excel);
header("Pragma: public");
header("Expires: 0");
header("Cache-Control:must-revalidate, post-check=0, pre-check=0");
header("Content-Type:application/force-download");
header("Content-Type:application/vnd.ms-execl");
header("Content-Type:application/octet-stream");
header("Content-Type:application/download");
header('Content-Disposition:attachment;filename="出错条目信息".xls"');
header("Content-Transfer-Encoding:binary");
$write->save('php://output');
}
$table=session('table');
$head=M('main');
$map=array('main_id'=>$table);
$header=$head->where($map)->select();
剩下的 都是套路 拷贝就可以 记住 引用文件千万不要出错就可以了。
如果有什么问题 欢迎与我联系 。
本人第一次 写博客 也是第一篇 希望看官们 多多批评指正 ,先谢过了!