在PHP项目经常要导入导出Excel表单。
先去下载PHPExcel类库文件,放到相应位置。
我在thinkphp框架中的位置为ThinkPHP/Library/Org/Util/
导入
在页面上传excel文件提交到后台,利用form表单提单即可
<form method="post" enctype="multipart/form-data" action="" >
<input type="submit" value="导入" />
<input type="file" name="excel" />
</form>
提交到后台后进行上传处理,这是一个执行上传的方法
public function data(){
if(IS_POST){
//设置编码防止乱码
header("Content-Type:text/html;charset=utf-8");
$upload = new \Think\Upload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('xls','xlsx','csv');// 设置附件上传类
$upload->rootPath = 'Uploads/';
$upload->savePath = ''; // 设置附件上传目录
// 上传文件
$info = $upload->uploadOne($_FILES['excel']);
$filename = 'Uploads/'.$info['savepath'].$info['savename'];
$exts = $info['ext'];
// var_dump($info);
if(!$info) {// 上传错误提示错误信息
$this->error($upload->geterror());
}else{// 上传成功
$this->data_import($filename, $exts);
}
}
}
上传文件的格式设为excel的格式,xls,xlsx,csv均可支持
然后对上传后的文件内容进行读取导入,下面是一个读取的方法。
protected function data_import($filename, $exts='xls')
{
//导入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();
}else if($exts == 'csv'){
import("Org.Util.PHPExcel.Reader.CSV");
$PHPReader=new \PHPExcel_Reader_CSV();
} //var_dump($PHPReader);die;
//载入文件
$PHPExcel=$PHPReader->load($filename);
//获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
$currentSheet=$PHPExcel->getSheet(0);
//获取总列数
$allColumn=$currentSheet->getHighestColumn();
//获取总行数
$allRow=$currentSheet->getHighestRow();
//循环获取表中的数据,$currentRow表示当前行,从哪行开始读取数据,索引值从0开始
for($currentRow=1;$currentRow<=$allRow;$currentRow++){
//从哪列开始,A表示第一列
for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){
//数据坐标
$address=$currentColumn.$currentRow;
//读取到的数据,保存到数组$arr中
$data[$currentRow][$currentColumn]=$currentSheet->getCell($address)->getValue();
} }
$this->save_import($data);
}
用上面这个方法获得excel里的数据,然后用save_import把获得的数据存入数据库
//保存导入数据
public function save_import($data)
{
//print_r($data);exit; $bath = M('data'); //插入新数据时先清空原表数据,没有这个需要可以注释下面步骤
//M('mobile')->where('1=1')->delete(); foreach ($data as $k=>$v){
//$mobile=$v['A']; //注:****** (1)处
$info['a'] = $v['A'];
$info['b'] = $v['B'];
$info['c']=$v['C'];
$info['d_water']=$v['D'];
$info['e']=$v['E'];
$info['f']=$v['F']; $arr[] = $info; }
$result=$bath->addall($arr);
if($result){
$this->success('数据导入成功');
}else{
$this->error('数据导入失败');
}
//print_r($info);
}
导出相对于导入就容易的多,从数据库读出数据做出相应的处理
public function excel(){
//引入PHPExcel库文件
Vendor('PHPExcel.Classes.PHPExcel');
//创建对象
$excel = new PHPExcel();
//Excel表格式,这里简略写了8列
$letter = array('A','B','C','D','E','F','F','G');
//表头数组
$tableheader = array('序号','客栈名称','客栈地址','座机','手机','QQ','邮箱');
//填充表头信息
for($i = 0;$i < count($tableheader);$i++) {
$excel->getActiveSheet()->setCellValue("$letter[$i]1","$tableheader[$i]");
}
//表格数组
$data = array(
array('1','B','C','D','E','F','G'),
array('2','B','C','D','E','F','G'),
array('3','B','C','D','E','F','G'),
array('4','B','C','D','E','F','G'),
array('5','B','C','D','E','F','G'),
array('6','B','C','D','E','F','G'),
array('7','B','C','D','E','F','G'),
);
//填充表格信息
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');
前台页面只需要执行此方法即可