在做项目的时候,很多时候会遇到需要将excel导入到数据库的操作:
需要用到Excel类:
下载地址:
https://gitee.com/meiyouzhanghao/excel
位置:Thinkphp / Library / Org / Util
获取Excel 方法:
//获取excel文件、读取数据方法
public function getdata($file_name,$exts='xls'){
//导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入
import("Org.Util.PHPExcel", '', '.php');
//创建PHPExcel对象,注意,不能少了\
$PHPExcel=new \PHPExcel();
import("Org.Util.PHPExcel.Reader.Excel5",'','.php');
$PHPReader=new \PHPExcel_Reader_Excel5();
//载入文件
$PHPExcel=$PHPReader->load($file_name);
//获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
$currentSheet = $PHPExcel->getSheet(0);
//获取总列数
$allColumn = $currentSheet->getHighestColumn();
//获取总行数
$allRow = $currentSheet->getHighestRow();
$excelData = array();
//循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
for($currentRow = 2; $currentRow <= $allRow; $currentRow ++){
//从哪列开始,A表示第一列
for($currentColumn='B';$currentColumn<=$allColumn;$currentColumn++){
//数据坐标
$address=$currentColumn.$currentRow;
//读取到的数据,保存到数组$arr中
$excelData[$currentRow][$currentColumn] = $currentSheet-> getCell($address)-> getValue();
}
}
return $excelData;
}
导入操作:
public function test(){
$filePath = "./Uploads/201111.xls";
$data = $this->getdata($filePath);
pd($data); // 得到数据 批量循环插入
$UserDB = M('user');
foreach($data as $k=>$v){
$data = array();
$data['name'] = $v['B'];
$data['age'] = $v['C'];
$data['city'] = $v['D'];
// $UserDB->add($data);
}
}
需要导入的Excle.xls
上面 $data = $this->getdata($filePath); 获取的数据:
参考:导入操作
//导入Excel方法操作
public function importExp(){
header("Content-type: text/html;charset=utf-8");//设置页面内容是html编码格式是utf-8
$m=D("Webinfo");//连接数据表
$cell=array();
//导入Excel前要上传Excel文件到项目文件夹,如果成功进行,如果失败提示错误信息
//I('post.ExcelURL','','htmlspecialchars')为获取上传控件传来的文件名称
if(I('post.ExcelURL','','htmlspecialchars')!=""){
$uploads="Uploads";
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 5242880 ;// 设置附件上传大小
$upload->exts = array('xlsx','xls');// 设置附件上传类型
$upload->rootPath = './'.$uploads.'/'; // 设置附件上传根目录
$upload->subName = array('date','Ym');
// 上传单个文件
$info = $upload->uploadOne($_FILES['excel']); if(!$info) {// 上传错误提示错误信息
$this->error($upload->getError());
}else{
//上传Excel成功
$exts = $info['ext'];
$file_name=$uploads.'/'.$info['savepath'].$info['savename'];
$res=$this->getdata($file_name,$exts); //循环读取每行数据,进行写入数据库
foreach ( $res as $k => $v )
{
if ($k != 0)
{
//获取数据库中的最大ID自增加1
$m->create();
$id=$m->max('ID'); if($id==0||$id==NULL||$id==""){
$id=1;
}
else
{
$id=$id+1;
}
//读取数据后赋给数组data
$data['ID']=$id;
$data ['Name'] = $v [B];
$data ['Site'] = $v [C]; $result = $m->add($data);//添加操作 }
} if($result!=0){ $this->success('网站数据导入成功'); }else{ $this->error('网站数据导入失败'); }
}
}
else
{
$this->error("请选择上传的文件");
}
}
导出 Excel:
数据结构:
具体方法:
public function testOne(){
$UserDB = M('user');
$UserList = $UserDB->select();
$filename = "用户信息表";
$header = array('id','名字','年纪','城市');
$this->getExcel($filename,$header,$UserList);//调用导出引用方法
}
具体导出方法:
//导出引用方法
public function getExcel($fileName,$headArr,$data){
//导入PHPExcel类库,因为PHPExcel没有用命名空间,只能inport导入
import("Org.Util.PHPExcel", '', '.php');
import("Org.Util.PHPExcel.Writer.Excel5",'','.php');
import("Org.Util.PHPExcel.IOFactory.php"); $date = date("Y_m_d",time());
$fileName .= "_{$date}.xls"; //创建PHPExcel对象,注意,不能少了\
$objPHPExcel = new \PHPExcel();
$objProps = $objPHPExcel->getProperties(); //设置表头
$key = ord("A");
//print_r($headArr);exit;
foreach($headArr as $v){
$colum = chr($key);
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
$objPHPExcel->setActiveSheetIndex(0) ->setCellValue($colum.'1', $v);
$key += 1;
} $column = 2;
$objActSheet = $objPHPExcel->getActiveSheet(); //print_r($data);exit;
foreach($data as $key => $rows){ //行写入
$span = ord("A");
foreach($rows as $keyName=>$value){// 列写入
$j = chr($span);
$objActSheet->setCellValue($j.$column, $value);
$span++;
}
$column++;
} $fileName = iconv("utf-8", "gb2312", $fileName); //重命名表
//$objPHPExcel->getActiveSheet()->setTitle('test');
//设置活动单指数到第一个表,所以Excel打开这是第一个表
$objPHPExcel->setActiveSheetIndex(0);
ob_end_clean();//清除缓冲区,避免乱码
header('Content-Type: application/vnd.ms-excel');
header("Content-Disposition: attachment;filename=\"$fileName\"");
header('Cache-Control: max-age=0'); $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output'); //文件通过浏览器下载
exit;
}
导出方法示例:
//全部导出数据方法
public function allExp(){
//链接所导出的数据表
$xlsModel = D('Webinfo');
//“WID,WName,WebSite,Remark”为所查询的字段,“Status=2”查询条件
$goods_list = $xlsModel->relation(TRUE)->field('WID,WName,WebSite,Remark')->where('Status=2')->select();
$count=1;//导出Excel序号排列
$data = array();
//循环查询后的数据,进行每一列
foreach ($goods_list as $k=>$goods_info){
$data[$k][ID] = $count++;//序号列
$data[$k][Name] = $goods_info['Name'];//名称列
$data[$k][ebSite] = $goods_info['Site'];//地址列
$data[$k][Remark] = $goods_info['Remark'];//备注列
}
//每列表的名称
foreach ($data as $field=>$v){
if($field == 'ID'){
$headArr[]='序号';
} if($field == 'Name'){
$headArr[]='名称';
} if($field == 'Site'){
$headArr[]='网址';
} if($field == 'Remark'){
$headArr[]='备注';
}
}
$filename="网站信息数据表";//所导出的保存文件名称
$sss=$this->getExcel($filename,$headArr,$data);//调用导出引用方法
}