PHP生成excel表格导入及导出实用案例
2017-05-16PHP
许多公司都要求做成excel格式表格,但这并不复杂,因为phpexcel为我们提供了方便、快捷的excel操作类。下面来看实际操作代码吧,这里的案例是基于thinkPHP框架开发的,请大家知晓。实际导出效果如下图所示
以前记得总是用PHP生成csv格式的表格,可现在excel表格越来越流行了,许多公司都要求做成excel格式表格,但这并不复杂,因为phpexcel为我们提供了方便、快捷的excel操作类。下面来看实际操作代码吧,这里的案例是基于thinkPHP框架开发的,请大家知晓。实际导出效果如下图所示

首先我们需要引用PHPexcel插件文件夹,这个插件可以在其官网下载,不过该插件是老外写的,所有官网是英文。下载好了的命名为excel文件夹并放到Vendor目录下,详细路径如:ThinkPHPLibraryVendorexcel。其中excel里面放入一个我自己写的处理类,类里面包括导出export和import导入两个方法,详细单如下
//ThinkPHPLibraryVendorexcelimportexport.class.php文件
getProperties()->setCreator("雷小天");
$objPHPExcel->getProperties()->setLastModifiedBy("最后修改");
$objPHPExcel->getProperties()->setTitle($titlename);
$objPHPExcel->getProperties()->setSubject("Excel导出表");
$objPHPExcel->getProperties()->setDescription("Excel导出表");
$objPHPExcel->getProperties()->setKeywords("Excel2007");
$objPHPExcel->getProperties()->setCategory("正式文件表格");
foreach ($arrTitle as $k => $v) {
$Letter = 65;
$Letter = chr($Letter + $k);
$Letter = $Letter . 1;
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($Letter ,$v) ;
}
foreach ($dataInfo as $key => $data) {
// $objPHPExcel->getActiveSheet()->getStyle('A' . ($key +2))->getNumberFormat()->setFormatCode("0");//决绝科学计算法格式
// $objPHPExcel->getActiveSheet()->getStyle('A' . ($key +2))->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_JUSTIFY);
$data = array_values($data);
foreach ($data as $k => $v) {
$Letter = 65;
$Letter = chr($Letter + $k);
$Letter = $Letter . ($key +2);
$value = $v ? ' '.$v : ' ';
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($Letter , $value);
}
}
foreach ($tablesize as $key => $value) {//设置不同表格的宽度$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);
$objPHPExcel->getActiveSheet()->getColumnDimension($key)->setWidth($value);
}
$objPHPExcel->getActiveSheet()->setTitle($titlename);
$objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel);
$objWriter->save('php://output');
exit;
}
// 导入
public function import($filename)//到时候要传名字$filename
{
// require_once ROOT_DIR ."/app/importexport/lib/excel/PHPExcel/Reader/Excel2007.php";
// require_once ROOT_DIR ."/app/importexport/lib/excel/PHPExcel/Reader/Excel5.php";
require_once(dirname(__FILE__) . '/PHPExcel/Reader/Excel2007.php');
require_once(dirname(__FILE__) . '/PHPExcel/Reader/Excel5.php');
//先试着用EXCEL2007 读取, 如果读取不到,就用低版本的去读取
$PHPReader = new PHPExcel_Reader_Excel2007;
if(!$PHPReader->canRead($filename)){
$PHPReader = new PHPExcel_Reader_Excel5;
if(!$PHPReader->canRead($filename)){
return '非EXCEL文件';
}
}
$PHPExcel = $PHPReader->load($filename);
//读取第一个工作表
$currentSheet = $PHPExcel->getSheet(0);
// 取列数
$allColumn = $currentSheet->getHighestColumn();
// 取行数
$allRow = $currentSheet->getHighestRow();
// die(var_dump($allColumn));
// 从第二行开始输出,excel表中第一行为列名
$arrImportData = array();
for($currentRow = 2;$currentRow <= $allRow;$currentRow++){
// 第A列
for($currentColumn= 'A';$currentColumngetCellByColumnAndRow(ord($currentColumn) - 65,$currentRow)->getValue());
// echo strval($currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65,$currentRow)->getValue());
}
}
return $arrImportData;
}
}公共处理类写好了,我们就要写各个导出和导入实际案例代码,导出代码不一样,导入是公共的,放在公共控制器中
导出案例:导出需要实例化importexport.class.php类
roleModle=M("role");
Vendor('excel.importexport#class');
$this->excel = new importexport();
}
//角色导出excel
public function exportexcel(){
if(isset($_GET['type'])){
if($_GET['type']==1){
$rolelist = $this->roleModle->order('id asc')->select();
foreach ($rolelist as $k => $v) {
$roleArr[$k]['id']=$rolelist[$k]['id'];
$roleArr[$k]['name']=$rolelist[$k]['name'];
$roleArr[$k]['pid']=$rolelist[$k]['pid'];
$roleArr[$k]['status']=($v['status']==1)?'正常':'禁用';
$roleArr[$k]['remark']=$rolelist[$k]['remark'];
}
// $filename='商品库存明细'.'_'.date('Y-m-dHis');
$filename='角色表'.'-'.date('Ymd');
$titlename='角色表单';
}
$arrTemp=array(
'编号' => 'id',
'名称' => 'name',
'上级角色' => 'pid',
'状态' => 'status',
'备注' => 'remark',
);
$arrTitle=array_keys($arrTemp);
//自定义每列的宽度
$tablesize=array(
'A'=>18,
'B'=>20,
'C'=>20,
'D'=>20,
'E'=>40,
);
$this->excel->export($roleArr,$arrTitle,$filename,$titlename,$tablesize);
}
}
}导入案例:导入需要先将excel表格上传
excel = new importexport();
$result=$this->excel->import($file);
switch ($type) {
case 'equipment':
$doorModle=M("doorcontroller");
foreach ($result as $key => $value) {
$data=array(
'controllerno'=>trim($value[0]),
'computeno'=>trim($value[1]),
'communicationip'=>trim($value[2]),
'communicationport'=>trim($value[3]),
'areaname'=>trim($value[4]),
'joinstatus'=>0,
'doorfieldno'=>trim($value[6]),
'controllersn'=>trim($value[7]),
'doorstatus'=>trim($value[8]),
'direction'=>trim($value[9]),
'operatorname'=>$_SESSION['username'],
'makedatetime'=>time(),
'remark'=>trim($value[12]),
);
$res=$doorModle->add($data);
if($res){
$this->success('添加成功',U('Admin/Doorcontroller/index'),3);
}else{
$this->error('添加失败',U('Admin/Doorcontroller/index'),3);
}
}
break;
case 'area':
$areaModle=M("areainfo");
foreach ($result as $key => $value) {
$data=array(
// 'areano'=>trim($value[0]),//自增长不填写
'upareano'=>trim($value[1]),
'areaname'=>trim($value[2]),
'remark'=>trim($value[3]),
'operatorname'=>trim($value[4]),
);
$res=$areaModle->add($data);
if($res){
$this->success('导入成功',U('Admin/Areainfo/index'),3);
}else{
$this->error('导入失败',U('Admin/Areainfo/index'),3);
}
}
break;
case 'value2':
# code...
break;
default:
# code...
break;
}
return $result;
}
public function upload(){//这个方法和上面的方法度需要放到公共函数中
if ($_POST['type']) {
$upload = new ThinkUpload();// 实例化上传类
$upload->maxSize = 3145728 ;// 设置附件上传大小
$upload->exts = array('xlsx', 'xls');// 设置附件上传类型
$upload->rootPath = './Public/Uploads/'; // 设置附件保存根目录
$upload->savePath = './excel/'; // 设置附件根目录下面的保存目录
$upload->replace = true; // 覆盖文件
// 单文件上传
$info = $upload->upload();
if(!$info) {
// 上传错误提示错误信息
$this->show($upload->getError());
}else{
// 上传成功 获取上传文件信息
$info['import_file']['savepath']=substr($info['import_file']['savepath'],1);
$file = '/data/wwwroot/door/Public/Uploads'.$info['import_file']['savepath'].$info['import_file']['savename'];
$this->importexcel($file,$_POST['type']);
// $result=$this->excel->import($file);
// die(var_dump($result));
exit;
}
}
// $this->display();
}至此,一个完整的PHP生成excel表格功能就完成了,而且导出时的表格可以通过$tablesize数组控制每列的宽度
很赞哦! ()
