使用PHPExcel实现Excel文件的导入和导出(模板导出)

在之前有写过一篇文章讲述了使用PHP快速生成excel表格文件并下载,这种方式生成Excel文件,生成速度很快,但是有缺点是:
1.单纯的生成Excel文件,生成的文件没有样式,单元格属性(填充色,宽度,高度,边框颜色...)不能自定义;
2.生成的文件虽然可以打开,但是兼容性很差,每次打开,都会报一个警告:

今天使用一个第三方的SDK(PHPExcel)实现Excel文件的导入和导出。

准备工作:
1.下载PHPExcel的SDK,下载地址:https://github.com/PHPOffice/PHPExcel

2.将SDK解压之后的Class文件拷贝到自己的项目。

一.Excel文件读取

 

 

composer自动加载一个文件后必须执行命令composer dump-autoload

1、composer安装:

composer require phpoffice/phpspreadsheet

 

复制代码
function excelToArray(){  
    require_once dirname(__FILE__) . '/Lib/Classes/PHPExcel/IOFactory.php';  
      
    //加载excel文件  
    $filename = dirname(__FILE__).'/result.xlsx';  
    $objPHPExcelReader = PHPExcel_IOFactory::load($filename);    
  
    $sheet = $objPHPExcelReader->getSheet(0);        // 读取第一个工作表(编号从 0 开始)  
    $highestRow = $sheet->getHighestRow();           // 取得总行数  
    $highestColumn = $sheet->getHighestColumn();     // 取得总列数  
  
    $arr = array('A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z');  
    // 一次读取一列  
    $res_arr = array();  
    for ($row = 2; $row <= $highestRow; $row++) {  
        $row_arr = array();  
        for ($column = 0; $arr[$column] != 'F'; $column++) {  
            $val = $sheet->getCellByColumnAndRow($column, $row)->getValue();  
            $row_arr[] = $val;  
        }  
          
        $res_arr[] = $row_arr;  
    }  
      
    return $res_arr;  
}  
复制代码

或者:

复制代码
function excelToArray(){  
    require_once dirname(__FILE__) . '/Lib/Classes/PHPExcel/IOFactory.php';  
      
    //加载excel文件  
    $filename = dirname(__FILE__).'/result.xlsx';  
    $objPHPExcelReader = PHPExcel_IOFactory::load($filename);    
  
    $reader = $objPHPExcelReader->getWorksheetIterator();  
    //循环读取sheet  
    foreach($reader as $sheet) {  
        //读取表内容  
        $content = $sheet->getRowIterator();  
        //逐行处理  
        $res_arr = array();  
        foreach($content as $key => $items) {  
              
             $rows = $items->getRowIndex();              //行  
             $columns = $items->getCellIterator();       //列  
             $row_arr = array();  
             //确定从哪一行开始读取  
             if($rows < 2){  
                 continue;  
             }  
             //逐列读取  
             foreach($columns as $head => $cell) {  
                 //获取cell中数据  
                 $data = $cell->getValue();  
                 $row_arr[] = $data;  
             }  
             $res_arr[] = $row_arr;  
        }  
          
    }  
      
    return $res_arr;  
}  
复制代码

两种方法均可将表格数据转化为数组,然后哦再进行相关的操作就简单了。

 

二.Excel文件导出

 

复制代码
public function actionDao()
{
$objExcel = new \PHPExcel();
$objWriter = \PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');
$objActSheet = $objExcel->getActiveSheet(0);

$objActSheet->setTitle('会员批量导入模板'); //设置excel的标题
$objActSheet->setCellValue('A1', '用户id');
$objActSheet->setCellValue('B1', '昵称');
$objActSheet->setCellValue('C1', '手机号');

$baseRow = 2; //数据从N-1行开始往下输出 这里是避免头信息被覆盖
//默认数据
// $explame_data1 = [
// [
// 'id' => '1',
// 'name' => '小明',
// 'email' => '15012345678',
// ],
// [
// 'id' => '2',
// 'name' => '小明2',
// 'email' => '15012345672',
// ]
// ];
$explame_data= Staff::find()->select('id,name,email')->asArray()->all();//查询数据 必须是数组

foreach ($explame_data as $key => $value) {
$i = $baseRow + $key;
//$id = $value['id'] ?? "";
// $name = $value['name'] ?? "";
// $email = $value['email'] ?? "";

$objExcel->getActiveSheet()->setCellValue('A' . $i, $value['id']);
$objExcel->getActiveSheet()->setCellValue('B' . $i, $value['name']);
$objExcel->getActiveSheet()->setCellValue('C' . $i, $value['email']);
}

// Rename worksheet
$objExcel->getActiveSheet()->setTitle('Simple');
$objExcel->getActiveSheet()->setTitle('Simple1');

// Set active sheet index to the first sheet, so Excel opens this as the first sheet
$objExcel->setActiveSheetIndex(0);

// Redirect output to a client’s web browser (Excel2007)
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="测试文档.xlsx"');
header('Cache-Control: max-age=0');
// If you're serving to IE 9, then the following may be needed
header('Cache-Control: max-age=1');

// If you're serving to IE over SSL, then the following may be needed
header ('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); // Date in the past
header ('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT'); // always modified
header ('Cache-Control: cache, must-revalidate'); // HTTP/1.1
header ('Pragma: public'); // HTTP/1.0

$objWriter = \PHPExcel_IOFactory::createWriter($objExcel, 'Excel2007');
$objWriter->save('php://output');
exit;
}
复制代码

导出文件,还可以设置模板

复制代码
//execl模板下载
public function actionDao()
{
$objExcel = new \PHPExcel();
$objWriter = \PHPExcel_IOFactory::createWriter($objExcel, 'Excel5');
$objActSheet = $objExcel->getActiveSheet(0);
$objActSheet->setTitle('会员批量导入模板'); //设置excel的标题
$objActSheet->setCellValue('A1', '用户id');
$objActSheet->setCellValue('B1', '昵称');
$objActSheet->setCellValue('C1', '手机号');

$baseRow = 2; //数据从N-1行开始往下输出 这里是避免头信息被覆盖
//默认数据
$explame_data = array(
array(
'user_id' => '1',
'nickname' => '小明',
'phone' => '15012345678',
),
);

foreach ($explame_data as $key => $value) {
$i = $baseRow + $key;
$objExcel->getActiveSheet()->setCellValue('A' . $i, $value['user_id']);
$objExcel->getActiveSheet()->setCellValue('B' . $i, $value['nickname']);
$objExcel->getActiveSheet()->setCellValue('C' . $i, $value['phone']);
}



$objExcel->setActiveSheetIndex(0);
//4、输出
$objExcel->setActiveSheetIndex();
header('Content-Type: applicationnd.ms-excel');
$time = date('Y-m-d');
header("Content-Disposition: attachment;filename=会员批量导入模板" . $time . ".xls");
header('Cache-Control: max-age=0');
// $spreadsheet = new Spreadsheet();
$objWriter->save('php://output');
}
复制代码

先弄一个excel模板

然后使用该模板导出数据

除此之外还可以对表格属性做很多自定义。感兴趣的自己看看吧!

 

转: https://blog.csdn.net/a8240357/article/details/80758222

posted @ 2021-08-12 16:31  胡良庆  阅读(630)  评论(0编辑  收藏  举报