YII2 自定义导入导出Excel [ 技术分享 ]
/**
********************************************************
* 函数名: format_excel2array
* 参数:
* @param string $filePath Excel文件路径
* @param int $sheet Excel指定表
* @param string $header 导入的Excel数据类型。必须在全局变量中定义'excel_' . $header . '_header',user用户,task广告主任务
* 'excel_user_header' => ['A'=>'user_realname',"B"=>'user_name',"C"=>"user_dept","D"=>'grade_id'],
* 函数描述:
* @return array|void
*******************************************************
*/
public function format_excel2array($filePath='',$sheet=0,$header='user'){
$excel_header = Yii::$app->params['excel_' . $header . '_header'];
$grade_arr = array_flip(Yii::$app->params['grade_arr']);
require dirname(dirname(__FILE__)).'/components/PHPExcel/PHPExcel.php';
if(empty($filePath) or !file_exists($filePath)){die('file not exists');}
$PHPReader = new \PHPExcel_Reader_Excel2007(); //建立reader对象
if(!$PHPReader->canRead($filePath)){
$PHPReader = new PHPExcel_Reader_Excel5();
if(!$PHPReader->canRead($filePath)){
echo 'no Excel';
return ;
}
}
$PHPExcel = $PHPReader->load($filePath); //建立excel对象
$currentSheet = $PHPExcel->getSheet($sheet); //**读取excel文件中的指定工作表*/
$allColumn = $currentSheet->getHighestColumn(); //**取得最大的列号*/
$allRow = $currentSheet->getHighestRow(); //**取得一共有多少行*/
$data = array();
for($rowIndex=2; $rowIndex<=$allRow; $rowIndex++ ){ //循环读取每个单元格的内容。注意行从1开始,列从A开始
for($colIndex='A'; $colIndex<=$allColumn; $colIndex++){
$addr = $colIndex.$rowIndex;
$cell = $currentSheet->getCell($addr)->getValue();
if($cell instanceof PHPExcel_RichText){ //富文本转换字符串
$cell = $cell->__toString();
}
if($colIndex == "D" && $header == 'user'){
$cell = $grade_arr[$cell];
}
if($colIndex == "A" && $header == 'task'){
$cell = \PHPExcel_Shared_Date::ExcelToPHP($cell);
}
$data[$rowIndex-1][$excel_header[$colIndex]] = $cell;
}
}
return $data;
}
/**
********************************************************
* 函数名: format_array2excel
* 参数:
* @param $data 导出的数据
* @param string $filename 导出的文件名
* @param $header 在全局变量 $pramas 中必须定义 excel_'.$header.'_export相应的数组作为导出表头
* 'excel_user_export' => [
* 'A'=>['key'=>'user_realname','label'=>'姓名'],
* "B"=>['key'=>'user_name','label'=>'帐号'],
* "C"=>['key'=>"user_dept",'label'=>"部门"],
* "D"=>['key'=>'grade_id','label'=>'职位']
* ],
* 函数描述:把数组导出到Excel
*******************************************************
*/
function format_array2excel($data,$filename='Excel',$header){
require dirname(dirname(__FILE__)).'/components/PHPExcel/PHPExcel.php';
date_default_timezone_set('Europe/London');
$header = Yii::$app->params['excel_'.$header.'_export'];
$grede_arr = Yii::$app->params['grade_arr'];
$objPHPExcel = new \PHPExcel();
/*以下是一些设置 ,什么作者 标题啊之类的*/
$objPHPExcel->getProperties()->setCreator("Hsuanyuen.chenyan")
->setLastModifiedBy("Hsuanyuen.chenyan")
->setTitle("用户导出")
->setSubject("数据EXCEL导出")
->setDescription("备份数据")
->setKeywords("excel")
->setCategory("数据导出");
/*以下就是对处理Excel里的数据, 横着取数据,主要是这一步,其他基本都不要改*/
foreach ($header as $k => $v ){
//Excel的第A列,uid是你查出数组的键值,下面以此类推
$objPHPExcel->setActiveSheetIndex(0)->setCellValue($k.'1', $v['label']);
$keys[$k]=$v['key'];
}
foreach($data as $k => $v){
$num= $k+2;
foreach ($header as $kk => $vv ) {
//Excel的第A列,uid是你查出数组的键值,下面以此类推
$objPHPExcel->setActiveSheetIndex()->setCellValue($kk . $num, $v[$vv['key']]);
}
}
$objPHPExcel->getActiveSheet()->setTitle('User');
$objPHPExcel->setActiveSheetIndex(0);
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
header('Cache-Control: max-age=0');
$objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
$objWriter->save('php://output');
exit;
}
待完善文档
共 2 条回复
陈诺 北京
注册时间:2017-06-26
最后登录:2018-03-20
在线时长:5小时51分
最后登录:2018-03-20
在线时长:5小时51分
- 粉丝4
- 金钱610
- 威望0
- 积分660