PHP导出Excel,用来对付那些客户是杠杠的
发布时间:2016-04-20, 18:33:15 分类:PHP | 编辑 off 网址 | 辅助
图集1/1
正文 1346字数 735,228阅读
/**
* 导出数据为excel表格
*@param $data 一个二维数组,结构如同从数据库查出来的数组
*@param $title excel的第一行标题,一个数组,如果为空则没有标题
*@param $filename 下载的文件名
*@examlpe
$stu = M ('User');
$arr = $stu -> select();
exportexcel($arr,array('id','账户','密码','昵称'),'文件名!');
*/
function exportexcel($data=array(),$title=array(),$filename='report'){
header("Content-type:application/octet-stream");
header("Accept-Ranges:bytes");
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:attachment;filename=".$filename.".xls");
header("Pragma: no-cache");
header("Expires: 0");
//导出xls 开始
if (!empty($title)){
foreach ($title as $k => $v) {
$title[$k]=iconv("UTF-8", "GB2312",$v);
}
$title= implode("\t", $title);
echo "$title\n";
}
if (!empty($data)){
foreach($data as $key=>$val){
foreach ($val as $ck => $cv) {
$data[$key][$ck]=iconv("UTF-8", "GB2312", $cv);
}
$data[$key]=implode("\t", $data[$key]);
}
echo implode("\n",$data);
}
}
Run code
Cut to clipboard
(支付宝)给作者钱财以资鼓励 (微信)→
有过 6 条评论 »
<?php namespace Addons\Huiyuan\Controller; use Home\Controller\AddonsController; class HuiyuanController extends AddonsController{ var $model; function _initialize() { $this->model = $this->getModel ( 'huiyuan' ); parent::_initialize (); $act = strtolower ( _ACTION ); $type = I ( 'type' ); $res ['title'] = '会员列表'; $res ['url'] = addons_url ( 'Huiyuan://Huiyuan/lists' ); $res ['class'] = $act == 'lists' || $type == 'text' ? 'current' : ''; $nav [] = $res; $res ['title'] = '文本注册'; $res ['url'] = addons_url ( 'Huiyuan://Huiyuan/dr' ); $res ['class'] = $act == 'dr' || $type == 'textarea' ? 'current' : ''; $nav [] = $res; $res ['title'] = '批量导入会员注册'; $res ['url'] = addons_url ( 'Huiyuan://Huiyuan/daoru' ); $res ['class'] = $act == 'daoru' || $type == 'textarea' ? 'current' : ''; $nav [] = $res; $this->assign ( 'nav', $nav ); }
<?php namespace Addons\Huiyuan\Controller; use Home\Controller\AddonsController; class HuiyuanController extends AddonsController{ var $model; function _initialize() { $this->model = $this->getModel ( 'huiyuan' ); parent::_initialize (); $act = strtolower ( _ACTION ); $type = I ( 'type' ); $res ['title'] = '会员列表'; $res ['url'] = addons_url ( 'Huiyuan://Huiyuan/lists' ); $res ['class'] = $act == 'lists' || $type == 'text' ? 'current' : ''; $nav [] = $res; $res ['title'] = '文本注册'; $res ['url'] = addons_url ( 'Huiyuan://Huiyuan/dr' ); $res ['class'] = $act == 'dr' || $type == 'textarea' ? 'current' : ''; $nav [] = $res; $res ['title'] = '批量导入会员注册'; $res ['url'] = addons_url ( 'Huiyuan://Huiyuan/daoru' ); $res ['class'] = $act == 'daoru' || $type == 'textarea' ? 'current' : ''; $nav [] = $res; $this->assign ( 'nav', $nav ); } //随机盐 function generate_rand($l){ $c= "ABCDEFGHJKLMNPQRSTUVWXYabcdefghijkmnpqrstuvwxy3456789"; srand((double)microtime()*1000000); for($i=0; $i<$l; $i++) { $rand.= $c[rand()%strlen($c)]; } return $rand; } function ree($tel,$pass,$yue){ if(!$tel) return false; $mapc['tel']=$tel; $s_tel=M('huiyuan')->where($mapc)->limit(0,1)->select(); $s_tel=($s_tel['0']['id']); if($s_tel) return false; //写入注册信息 $data ['token'] = get_token (); //$data['rip']=$this->getip(); $data['tel']=($tel+0);//$_SESSION['check_mobile'];//$_POST['tel']; $salt=$this->generate_rand(9);//rand(100000,999999); $data['salt']=$salt; $data['pass']=md5($pass.$salt); $data['cTime']=time(); $data['mTime']=$data['cTime']; $saltr=$this->generate_rand(9); $data['saltr']=$saltr; //$data['lip']=$data['rip']; $data['zcj']=0;//$_SESSION['guanzhu_choujiang']; //$data['logg']=md5($data['rip'].$data['saltr']);//md5($data['rip'].$data['mTime'].$data['saltr']); //注册送抽奖次数 //$nnpn=($this->config); //$nnpn=$nnpn['cjzss']+0; //$nnpncjzssdd=($this->config); //$nnpncjzssdd=$nnpncjzssdd['cjzssdd']+0; //$data['dtime']=date('Ymd'); //if($nnpn) $data['zcj']=$_SESSION['guanzhu_choujiang']+$nnpn;//$_SESSION['guanzhu_choujiang']+$nnpn; $res = M('Huiyuan')->add($data); if($res){ $dataa['uid']=$res; $dataa['tel']=$data['tel']; $dataa['yue']=($yue+0); $dataa['mtime']=time(); $aaasss=M('recharge')->add($dataa); //echo '成功注册 '.$tel.'<br />'; } return $aaasss; } function daoru(){ if (! is_login ()) { redirect ( U ( 'home/user/login', array ( 'from' => 2 ) ) ); } /*if($_POST){ $this->daorudata(); exit; }*/ //dump($_POST); $this->display (); } function daorudata(){ $new_text='请上传Excel文件'; if(! empty ( $_FILES ['file_stu'] ['name'] )){ $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 ) != "xls"){ $new_text='不是Excel文件,重新上传'; //exit; } else{ // 判断文件是什么格式 $type = pathinfo($file); $type = strtolower($type["extension"]); $type=$type==='csv' ? $type : 'Excel5'; ini_set('max_execution_time', '0'); Vendor('PHPExcelN.PHPExcel'); // 判断使用哪种格式 $objReader = \PHPExcel_IOFactory::createReader($type); $objPHPExcel = $objReader->load($file); $sheet = $objPHPExcel->getSheet(0); // 取得总行数 $highestRow = $sheet->getHighestRow(); // 取得总列数 $highestColumn = $sheet->getHighestColumn(); //循环读取excel文件,读取一条,插入一条 $data=array(); //从第一行开始读取数据 //dump($data); for($j=2;$j<=$highestRow;$j++){ //从A列读取数据 for($k='A';$k<='B';$k++){ // 读取单元格 //$k='A'; if($objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue()){ $vsfsd=$objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue(); //电话 if($k=='A'){ $tel=$vsfsd; } if($k=='B'){ $yue=$vsfsd; } $newdr=$tel.'#'.$yue; /*$data[$j][]=$objPHPExcel->getActiveSheet()->getCell("$k$j")->getValue(); if($k=='A') $newdr[$k]['tel']=$vsfsd; $pass=str_split('0'.$vsfsd,6); if($k=='A') $newdr[$k]['pass']=$pass['1']; $daoruok=$this->ree($newdr[$k]['tel'],$newdr[$k]['pass']);*/ //成功注册 /*if($daoruok){ $daoruokstr.='成功注册'.$newdr[$k]['tel'].'<br>'; }else{ $daoross.='导入失败'.$newdr[$k]['tel'].'<br>'; }*/ /*$daoross.=$newdr[$k]['tel'].'<br>'; if($j==$highestRow) $daoross.='会员数据导入结束。<br>';*/ //$this->display (); } } $newdr=explode('#',$newdr); $pass=str_split('0'.$newdr['0'],6); $pass=$pass['1']; $daoruok=$this->ree($newdr['0'],$pass,$newdr['1']); //成功注册 if($daoruok){ $daoruokstrsss='<span style="color:blue;">成功注册</span>'; }else{ $daoruokstrsss='<span style="color:red;">导入失败/手机已注册</span>'; } $daoross.='<p style="color:#000;">第'.($j-1).'条 电话 '.$newdr['0'].' 余额 '.$newdr['1'].' '.$daoruokstrsss.'</p>'; if($j==$highestRow) $daoross.='<br><p style="color:blue;">会员数据导入结束。</p>'; //$this->display (); } //dump($data); $new_text='<p style="color:blue;">正在导入中...</p>'; //return $data; } } $this->assign ( 'daoruokstr', $daoruokstr ); $this->assign ( 'daoross', $daoross ); $this->assign ( 'new_text', $new_text ); $this->display (); } function dr(){ if (! is_login ()) { redirect ( U ( 'home/user/login', array ( 'from' => 2 ) ) ); } //echo get_token ();exit; //$templateFile = $this->model ['template_list'] ? $this->model ['template_list'] : ''; //$this->display ( $templateFile ); $dr=I ( 'dr' ); if($dr) { //$this->error ( $Model->getError () ); //dump(I ( 'dr' )); //$dr=str_ireplace("\r\n",'#',$dr); //$nnpnxxee=str_ireplace("购",'',$nnpnxxee); $dr=explode("\r\n",$dr); foreach ($dr as $k=>&$vsfsd) { $vsfsd = str_ireplace(' ','',$vsfsd); $vsfsd=explode('#',$vsfsd); $newdr[$k]['tel']=$vsfsd['0']; $pass=str_split('0'.$vsfsd['0'],6); $newdr[$k]['pass']=$pass['1']; $this->ree($newdr[$k]['tel'],$newdr[$k]['pass'],$vsfsd['1']); } //dump($newdr); $url = U ( 'lists' ); $this->success ( '批量注册完成!', $url,3 ); exit; } else $this->display (); } public function del() { } public function add() { $this->del(); return false; } }
<img src="<?php if(file_exists('./shearphoto_common/file/shearphoto_file/'.$c['id'].'_big.jpg')) echo '/shearphoto_common/file/shearphoto_file/'.$c['id'].'_big.jpg'; else echo '/0.jpg'; ?>" />
shearphoto 头像插件
php 定位到根目录
thinkphp 的绝对路径
入口文件为基础可以写成
'savePath'=>"./Public/Uploads/"
前面有一个点,注意区分后台服务器路径和前台前端路径区别表示
我是这么理解的:
1、APP目录和WEB目录不是一个概念,所以,要定义绝对路径,其文件夹必须在WEB目录下才行。(按你的表述来看,你的【根目录】就是WEB目录,对?)
2、后台(控制器)上传时使用./Public/Uploads,会上传到WEB目录下Public/Uploads文件夹。这就是你想要的结果不是?所以无需改为绝对路径。
3、前台(模板)调用,只需__PUBLIC__/Uploads就可以映射到WEB/Public/Uploads文件夹,如此调用不也是你想要的结果吗?
总结:结果均实现了,纠结相对与绝对有何意义?
提醒:WEB目录下的内容均可以使用绝对路径访问,需要自行组合。
圆形头像圆形css圆圈图片
border-radius: 100%;
<?php namespace Addons\Apply\Controller; use Home\Controller\AddonsController; use aliyun\api_demo\SmsDemo; class ApplyController extends AddonsController{ var $model; function _initialize() { $this->model = $this->getModel ( 'apply' ); parent::_initialize (); $act = strtolower ( _ACTION ); $type = I ( 'type' ); $res ['title'] = '列表'; $res ['url'] = addons_url ( 'Apply://Apply/lists' ); $res ['class'] = $act == 'lists' || $type == 'text' ? 'current' : ''; $nav [] = $res; $res ['title'] = '配置'; $res ['url'] = addons_url ( 'Apply://Apply/config' ); $res ['class'] = $act == 'config' || $type == 'textarea' ? 'current' : ''; $nav [] = $res; $res ['title'] = '导出'; $res ['url'] = addons_url ( 'Apply://Apply/daochu' ); $res ['class'] = $act == 'daochu' || $type == 'textarea' ? 'current' : ''; $nav [] = $res; $this->assign ( 'nav', $nav ); } function daochu(){ //Sever $Severnewslist=M('sever')->order('id desc')->select(); //dump($Severnewslist);exit; $newslist=M('apply')->field('id,name,tel,qq,wedding,gender,sever')->select(); foreach($newslist as $nk=>$vs){ $s=explode('<br />',$vs['sever']); //dump($s); foreach($Severnewslist as $ks=>$ssv){ $newslist[$nk][$ks]=''; foreach($s as $kss=>$vss){ if($vss==$ssv['sername']) $newslist[$nk][$ks]='√'; } } unset($newslist[$nk]['sever']); } //dump($newslist);exit; foreach($Severnewslist as $v){ $sv[]=$v['sername']; //if($sv) $sv.=',\''.$v.'\''; //else $sv='\''.$v.'\''; } //dump($sv);exit; //echo $sv;exit; $dname=date('Y-m-d H:i:s'); //exportexcel($arr,array('id','账户','密码','昵称'),'文件名!'); //$arr=array('0'=>'1','李振球','13607875450','2500152288'); $this->exportexcel($newslist,array_merge(array('id','姓名','手机号','QQ','婚期','性别'),$sv),$dname);//,'抱抱团服务' } function news(){ if($_POST['name']){ //dump($_POST);exit; $add['name']=htmlspecialchars($_POST['name']); $add['gender']=htmlspecialchars($_POST['gender']); $add['wedding']=htmlspecialchars($_POST['wedding']); $add['tel']=htmlspecialchars($_POST['tel']); $add['qq']=htmlspecialchars($_POST['qq']); $add['cTime']=time(); //$add['sever']=htmlspecialchars($_POST['sever']); foreach($_POST['sever'] as $v){ $v=htmlspecialchars($v); if($sv) $sv.='<br />'.$v; else $sv=$v; } $add['sever']=$sv; //dump($add);exit; if(empty($add['name'])){ //如果姓名为空 $this->error('请填写姓名');exit; } if(empty($add['gender'])){ //如果性别为空 $this->error('请选择您的性别');exit; } if(empty($add['wedding'])){ //如果婚期为空 $this->error('请选择婚期');exit; } if(empty($add['tel'])){//如果手机号为空 $this->error('请规范填写手机号');exit; } if(empty($add['qq'])){ //如果QQ为空 $this->error('请规范填写QQ号');exit; } if(empty($add['sever'])){ //如果验服务为空 $this->error('请勾选本次抱抱团的服务(至少一项)');exit; } $adds=M('apply')->add($add); if($adds){ //dump($_POST);exit; //发送短信 $tel=$add['tel']; $code='!'; if($tel && $code) $sendd=$this->dx($tel,$code); //end //$this->success('留言提交成功!');exit; if($sendd->Code=='OK') $this->success('留言提交成功!'); else $this ->error('短信发送失败!','',6); exit; }else{ $this ->error('留言提交失败!'); exit; } }else{ $newslist=M('sever')->order('id desc')->select(); $this->assign('newslist',$newslist); $this->display(ONETHINK_ADDON_PATH . 'Apply/View/default/Apply/news.html'); } } function ssww(){ exit; $this ->error('短信发送失败!','',6); exit; $this ->error('短信发送失败!','',3000); exit; $tel='18777337955'; $code=1; $n=$this->dx($tel,$code); dump($n->Code);exit; } function olhs() { $this->news(); return false; //$select = M('member_public')->where('token="gh_8ed7a5c1cbc4"')->find(); // $decc=$select['addon_config']; //dump($decc);exit; //dump($decc->Apply->id);exit; $newslist=M('sever')->where('1')->order('id desc')->limit(8)->select(); //dump($newslist);exit; $this->assign('newslist',$newslist); if(IS_POST){ $post['cTime']=time(); foreach ( $_POST['sever'] as $k => $v) { $str .= "$v ";//一个空格区分 } $post['sever']=$str; $post['gender']=$_POST['sexx']; $post['name']=htmlspecialchars($_POST['name']); $post['tel']=htmlspecialchars($_POST['tel']); $post['qq']=htmlspecialchars($_POST['qq']); $post['wedding']=$_POST['wedding']; if(empty($post['name'])){//如果姓名为空 $this->error('请填写姓名');exit; } if(empty($post['gender'])){//如果性别为空 $this->error('请选择您的性别');exit; } if(empty($post['wedding'])){//如果婚期为空 $this->error('请选择婚期');exit; } if(empty($post['tel'])){//如果手机号为空 $this->error('请规范填写手机号');exit; } if(empty($post['qq'])){//如果QQ为空 $this->error('请规范填写QQ号');exit; } if(empty($_POST['sever'][0])){//如果验服务为空 $this->error('请勾选本次抱抱团的服务(至少一项)');exit; } $add=M('apply')->add($post); if($add>0){ //dump($_POST);exit; //发送短信 $tel=$post['tel']; $code='!'; if($tel && $code) $this->dx($tel,$code); //end $this->success('留言提交成功!');die; }else{ $this ->error('留言提交失败!');die; } } $this->display(ONETHINK_ADDON_PATH . 'Apply/View/default/Apply/olhs.html'); } function index(){ //new SmsDemo(); $map['token']='gh_8ed7a5c1cbc4'; //发送短信 $tel=$post['tel']; $code='!'; if($tel && $code) $this->dx($tel,$code); //end } //发送短信 function dx($tel,$code){ if(!$tel || !$code) return false; $config = getAddonConfig ( 'Apply' ); // 获取后台插件的配置参数 $demo = new SmsDemo( $config['id'], $config['secret'] ); return $response = $demo->sendSms( $config['name'], // 短信签名 $config['CODE'], // 短信模板编号 $tel, // 短信接收者 Array( // 短信模板中字段的值 "yzm"=>$code )/*, "123"*/ ); } /** * 导出数据为excel表格 *@param $data 一个二维数组,结构如同从数据库查出来的数组 *@param $title excel的第一行标题,一个数组,如果为空则没有标题 *@param $filename 下载的文件名 *@examlpe $stu = M ('User'); $arr = $stu -> select(); exportexcel($arr,array('id','账户','密码','昵称'),'文件名!'); */ function exportexcel($data=array(),$title=array(),$filename='report'){ header("Content-type:application/octet-stream"); header("Accept-Ranges:bytes"); header("Content-type:application/vnd.ms-excel"); header("Content-Disposition:attachment;filename=".$filename.".xls"); header("Pragma: no-cache"); header("Expires: 0"); //导出xls 开始 if (!empty($title)){ foreach ($title as $k => $v) { $title[$k]=iconv("UTF-8", "GB2312",$v); } $title= implode("\t", $title); echo "$title\n"; } if (!empty($data)){ foreach($data as $key=>$val){ foreach ($val as $ck => $cv) { $data[$key][$ck]=iconv("UTF-8", "GB2312", $cv); } $data[$key]=implode("\t", $data[$key]); } echo implode("\n",$data); } } }
function sd(){ var ns=0; //var nons=0; //console.log($("input:checked").length);return false; $("#main p").find("input[type='radio']").each(function(){ if($(this).is(":checked")){ //alert($(this).val()); ns=parseInt(ns)+parseInt($(this).val()); //nons=0; }//else nons=1; }); if(!ns) ns=0.0001; if(ns && (($("input:checked").length)=='10')) location.href = '/index.php?s=/addon/Nwd/Nwd/index/wd/'+ns+'.html'; else alert('请回答所有问题再提交哦'); /*var s=getRadioValue('s'); if(s) location.href = '/index.php?s=/addon/Wdtest/Wdtest/index/id/'+s+'.html'; else alert('请选择答题项!');*/ }
0.0000001 修复 0 不存在bug
避免重复插入录入mysql数据bug
mysql索引类型normal,unique,full text的区别是什么?
normal:表示普通索引
unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique
full textl: 表示 全文搜索的索引。 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。
总结,索引的类别由建立索引的字段内容特性来决定,通常normal最常见。
BTREE
BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中,相信学过数据结构的童鞋都对当初学习二叉树这种数据结构的经历记忆犹新,反正愚安我当时为了软考可是被这玩意儿好好地折腾了一番,不过那次考试好像没怎么考这个。如二叉树一样,每次查询都是从树的入口root开始,依次遍历node,获取leaf。
BTREE在MyISAM里的形式和Innodb稍有不同
在 Innodb里,有两种形态:一是primary key形态,其leaf node里存放的是数据,而且不仅存放了索引键的数据,还存放了其他字段的数据。二是secondary index,其leaf node和普通的BTREE差不多,只是还存放了指向主键的信息.
而在MyISAM里,主键和其他的并没有太大区别。不过和Innodb不太一样的地方是在MyISAM里,leaf node里存放的不是主键的信息,而是指向数据文件里的对应数据行的信息.
RTREE
RTREE在mysql很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。
相对于BTREE,RTREE的优势在于范围查找.
各种索引的使用情况
(1)对于BTREE这种Mysql默认的索引类型,具有普遍的适用性
(2)由于FULLTEXT对中文支持不是很好,在没有插件的情况下,最好不要使用。其实,一些小的博客应用,只需要在数据采集时,为其建立关键字列表,通过关键字索引,也是一个不错的方法,至少愚安我是经常这么做的。
(3)对于一些搜索引擎级别的应用来说,FULLTEXT同样不是一个好的处理方法,Mysql的全文索引建立的文件还是比较大的,而且效率不是很高,即便是使用了中文分词插件,对中文分词支持也只是一般。真要碰到这种问题,Apache的Lucene或许是你的选择。
(4)正是因为hash表在处理较小数据量时具有无可比拟的素的优势,所以hash索引很适合做缓存(内存数据库)。如mysql数据库的内存版本Memsql,使用量很广泛的缓存工具Mencached,NoSql数据库redis等,都使用了hash索引这种形式。当然,不想学习这些东西的话Mysql的MEMORY引擎也是可以满足这种需求的。
(5)至于RTREE,我至今还没有使用过,它具体怎么样,我就不知道了。有RTREE使用经历的同学,到时可以交流下!
hash就是一种(key=>value)形式的键值对,如数学中的函数映射,允许多个key对应相同的value,但不允许一个key对应多个value。正是由于这个特性,hash很适合做索引,为某一列或几列建立hash索引,就会利用这一列或几列的值通过一定的算法计算出一个hash值,对应一行或几行数据(这里在概念上和函数映射有区别,不要混淆)。在java语言中,每个类都有自己的hashcode()方法,没有显示定义的都继承自object类,该方法使得每一个对象都是唯一的,在进行对象间equal比较,和序列化传输中起到了很重要的作用。hash的生成方法有很多种,足可以保证hash码的唯一性,例如在MongoDB中,每一个document都有系统为其生成的唯一的objectID(包含时间戳,主机散列值,进程PID,和自增ID)也是一种hash的表现。