当前位置:首页 > PHP教程 > php高级应用 > 列表

php使用PhpSpreadsheet导出Excel表格的实例详解

发布:smiling 来源: PHP粉丝网  添加日期:2024-03-24 11:41:37 浏览: 评论:0 

PhpSpreadsheet介绍

1、简介

PhpSpreadsheet 是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式

PhpSpreadsheet 提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到。

使用 PhpSpreadsheet 开发的PHP要求 7.1或更高版本

PhpSpreadsheet 支持链式操作

2、安装

使用 composer 安装,在项目根目录下执行下面命令,即可安装。本次是在ThinkPHP5框架里使用。

composer require phpoffice/phpspreadsheet

使用

1、引用和实例化

  1. use PhpOffice\PhpSpreadsheet\Spreadsheet; 
  2.  
  3. // 实例化 Spreadsheet 对象 
  4. $spreadsheet = new Spreadsheet(); 

2、获取工作簿

getActiveSheet

// 获取活动工作薄

$sheet = $spreadsheet->getActiveSheet();

单元格操作

1、获取单元格

两种获取单元格方式

getCell

getCellByColumnAndRow 数字单元格坐标获取单元格

$cell = $sheet->getCell('A1');

$cell = $sheet->getCellByColumnAndRow(1,1); // 参数:列、行

2、设置单元格的值

setValue

setCellValue

setCellValueByColumnAndRow

  1. // 获取单元格 
  2. $cellA = $sheet->getCell('A1'); 
  3. // 设置单元格值 
  4. $cellA->setValue('姓名'); // 设置A1单元格的值为姓名 
  5. // 给A1设置值,参数:单元格位置,值 
  6. $sheet->setCellValue('A1','ID'); 
  7.  
  8. //给A2赋值 hello 
  9. $sheet->setCellValueByColumnAndRow(1, 2, 'hello'); 

3、单元格文字样式

getStyle 获取单元格样式

getFont 获取单元格文字样式

setBold 设置文字粗细

setName 设置文字字体

setSize 设置文字大小

  1. //将A1至D1单元格设置成粗体 
  2. $sheet->getStyle('A1:D1')->getFont()->setBold(true); 
  3. //将A1单元格设置成粗体,黑体,10号字 
  4. $sheet->getStyle('A1')->getFont()->setBold(true)->setName('黑体')->setSize(10); 

4、单元格文字颜色

getColor() 获取坐标颜色

setRGB() 设置字体颜色(颜色值带#)

getRGB() 获取字体颜色

setARGB() 设置字体颜色(颜色值不带#)

getARGB() 获取字体颜色

  1. // B3单元格设置颜色 
  2. $sheet->getStyle('B3')->getFont()->getColor()->setRGB('#AEEEEE'); 
  3. $sheet->getStyle('B3')->getFont()->getColor()->setARGB('FFFF0000'); 

5、单元格内文字换行

setWrapText 设置文本里的\n符合为:换行

  1. //使用 \n 进行单元格内换行,相当于 Alt+Enter 
  2. $sheet->getCell('A1')->setValue("hello\nworld"); 
  3. $sheet->getStyle('A1')->getAlignment()->setWrapText(true); 

6、单元格列和行

getColumnDimension 获取一列

getWidth 获取一列的宽度

setWidth 设置一列的宽度

setAutoSize 设置一列的宽度自动调整

getDefaultColumnDimension 获取一列的默认值

  1. //设置默认列宽20 
  2. $sheet->getDefaultColumnDimension()->setWidth(20); 
  3.  
  4. //将A列宽度设置成20 
  5. $sheet->getColumnDimension('A')->setWidth(20); 
  6.  
  7. //自动计算列宽 
  8. $sheet->getColumnDimension('A')->setAutoSize(true); 

getRowDimension 获取一行

getRowHeight 获取一行的高度

setRowHeight 设置一行的高度

  1. //设置默认行高 
  2. $sheet->getDefaultRowDimension()->setRowHeight(20); 
  3.  
  4. //设置第一行行高为20pt 
  5. $sheet->getRowDimension('1')->setRowHeight(20); 

getHighestColumn 获取总列数

getHighestRow 获取总行数

echo $sheet->getHighestColumn();

echo $sheet->getHighestRow();

7、单元格样式

applyFromArray 设置单元格样式

对齐

  1. use PhpOffice\PhpSpreadsheet\Style\Alignment; 
  2. // 居中对齐 
  3. $styleArray = [ 
  4.     'alignment' => [ 
  5.         'horizontal' => Alignment::HORIZONTAL_CENTER, //水平居中 
  6.         'vertical' => Alignment::VERTICAL_CENTER, //垂直居中 
  7.     ], 
  8. ]; 
  9. $worksheet->getStyle('A1')->applyFromArray($styleArray); 

边框

上 下 左 右 全部 边框都可设置

  1. //红色边框 
  2. use PhpOffice\PhpSpreadsheet\Style\Border; 
  3. // 外边框 
  4. // Border 类中的常量都是边框样式 
  5. // Border::BORDER_THICK 边框样式 
  6. $styleArray = [ 
  7.     'borders' => [ 
  8.         'outline' => [ 
  9.             'borderStyle' => Border::BORDER_THICK, 
  10.             'color' => ['argb' => 'FFFF0000'], 
  11.         ], 
  12.     ], 
  13. ]; 
  14. $worksheet->getStyle('B2:G8')->applyFromArray($styleArray); 

8、单元格合并和拆分

mergeCells 合并

unmergeCells 拆分

  1. // 合并A1到C1列 
  2. $sheet->mergeCells('A1:C4'); 
  3. // 合并A1到A4行 
  4. $sheet->mergeCells('A1:A4'); 
  5. // 合并后,赋值只能给A1,开始的坐标。 
  6. $sheet->getCell('A1')->setValue('西安'); 
  7. // 拆分 
  8. $sheet->mergeCells('A1:C4'); 
  9. $sheet->unmergeCells('A1:A4'); 

9、超链接

getHyperlink 获取单元格链接

setUrl 设置单元格链接

  1. $spreadsheet->getActiveSheet()->setCellValue('E6''xxxx的博客'); 
  2. $spreadsheet->getActiveSheet()->getCell('E6')->getHyperlink()->setUrl('https://www.phpfensi.com'); 

10、使用函数

SUM求和A;VERAGE平均数;MIN最小值;MAX最大值

$sheet->setCellValue('A3', '=SUM(A1:A2)');

$sheet->setCellValue('A3', '=MAX(A1:A2)');

11、批量赋值

fromArray 从数组中的值填充工作表

参数1:数据(数组)

参数2:去除某个值

参数3:从哪个位置开始

  1. $sheet->fromArray( 
  2.         [ 
  3.             [1,'欧阳克','18岁','188cm'], 
  4.             [2,'黄蓉','17岁','165cm'], 
  5.             [3,'郭靖','21岁','180cm'
  6.         ], 3, 'A2' ); 

12、写入图片

  1. use PhpOffice\PhpSpreadsheet\Worksheet\Drawing; 
  2. //写入图片 
  3. $drawing = new Drawing(); 
  4. $drawing->setName('Logo')->setDescription('Logo')->setPath('../files/1.jpg')->setHeight(30)->setCoordinates('D6')->setOffsetX(50)->setOffsetY(6); 
  5. $drawing->setRotation(25); 
  6. $drawing->getShadow()->setVisible(true); 
  7. $drawing->getShadow()->setDirection(45); 
  8.    
  9. $drawing->setWorksheet($sheet); 

工作簿操作

1、xlsx 文件导出

IOFactory::createWriter 写入到文件

  1. use PhpOffice\PhpSpreadsheet\IOFactory; 
  2. // MIME 协议,文件的类型,不设置,会默认html 
  3. header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');  
  4. // MIME 协议的扩展 
  5. $filename = date('Y-m-d').'工作报告单'
  6. header('Content-Disposition:attachment;filename='.$filename .'.xlsx'); 
  7. // 缓存控制 
  8. header('Cache-Control:max-age=0'); 
  9. $write = IOFactory::createWriter($spreadsheet, 'Xlsx'); 
  10. $write->save('php://output'); 

2、xls 文件导出

  1. // MIME 协议,文件的类型,不设置,会默认html 
  2. header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');  
  3. // MIME 协议的扩展 
  4. $filename = date('Y-m-d').'工作报告单'
  5. header('Content-Disposition:attachment;filename='.$filename .'.xls'); 
  6. // 缓存控制 
  7. header('Cache-Control:max-age=0'); 
  8. $write = IOFactory::createWriter($spreadsheet'Xls'); 
  9. $write->save('php://output'); 

3、设置工作簿标题

setTitle

$sheet->setTitle('标题1');

实战

1、导出简单数据(使用 ThinkPHP5 框架)

  1. <?php 
  2.  
  3. namespace app\api\controller; 
  4.  
  5. use PhpOffice\PhpSpreadsheet\Spreadsheet; 
  6. use PhpOffice\PhpSpreadsheet\Style\Alignment; 
  7. use PhpOffice\PhpSpreadsheet\Style\Border; 
  8. use PhpOffice\PhpSpreadsheet\IOFactory; 
  9.  
  10. class Excel 
  11.     public function exporteasy() 
  12.     { 
  13.         $spreadsheet = new Spreadsheet(); 
  14.         $worksheet = $spreadsheet->getActiveSheet(); 
  15.  
  16.         $title = 'Excel导出'
  17.         $worksheet->setTitle($title); 
  18.         $worksheet->mergeCells('B2:D2'); 
  19.         $worksheet->getRowDimension(1)->setRowHeight(50); 
  20.         $worksheet->getStyle('B2:D2')->applyFromArray([ 
  21.             'alignment' => [ 
  22.                 'horizontal' => Alignment::HORIZONTAL_CENTER, 
  23.                 'vertical' => Alignment::VERTICAL_CENTER, 
  24.             ], 
  25.             'borders' => [ 
  26.                 'outline' => [ 
  27.                    'borderStyle' => Border::BORDER_THIN, 
  28.                     'color' => ['argb' => '000000'
  29.                 ], 
  30.             ], 
  31.             'font' => [ 
  32.                 'name' => '黑体'
  33.                 'bold' => true, 
  34.                 'size' => 22 
  35.             ] 
  36.         ]); 
  37.         $worksheet->setCellValueByColumnAndRow(2, 2, $title); 
  38.         $worksheet->setCellValueByColumnAndRow(2, 3, '姓名'); 
  39.         $worksheet->setCellValueByColumnAndRow(3, 3, '性别'); 
  40.         $worksheet->setCellValueByColumnAndRow(4, 3, '年龄'); 
  41.         $worksheet->setCellValueByColumnAndRow(2, 4, '张三'); 
  42.         $worksheet->setCellValueByColumnAndRow(3, 4, '男'); 
  43.         $worksheet->setCellValueByColumnAndRow(4, 4, '20'); 
  44.  
  45.  
  46.         header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
  47.         header('Content-Disposition: attachment;filename=Excel导出.xlsx'); 
  48.         header('Cache-Control: max-age=0'); 
  49.  
  50.         $write = IOFactory::createWriter($spreadsheet'Xlsx'); 
  51.         $write->save('php://output'); 
  52.     } 

导出表格截图:

PhpSpreadsheet php导出Excel表格

2、导出数据

liu_system_log 管理员操作记录表

  1. public function export() 
  2.     { 
  3.         $spreadsheet = new Spreadsheet(); 
  4.         $sheet = $spreadsheet->getActiveSheet(); 
  5.  
  6.         $styleArray = [ 
  7.             'alignment' => [ 
  8.                 'horizontal' => Alignment::HORIZONTAL_CENTER, 
  9.                 'vertical' => Alignment::VERTICAL_CENTER, 
  10.             ], 
  11.             'borders' => [ 
  12.                 'outline' => [ 
  13.                     'borderStyle' => Border::BORDER_THICK, 
  14.                 ], 
  15.             ], 
  16.         ]; 
  17.  
  18.         $sheet->getDefaultColumnDimension()->setWidth(20);// 列宽 
  19.         $sheet->getDefaultRowDimension()->setRowHeight(20);// 行高 
  20.         // 标题 
  21.         $tabletitle = '管理员操作记录表'
  22.         $sheet->mergeCells('A1:D1'); 
  23.         $sheet->getRowDimension('1')->setRowHeight(40);// 行高 
  24.         $sheet->getStyle('A1')->applyFromArray($styleArray); 
  25.         $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16); 
  26.         $sheet->setCellValue('A1'$tabletitle); 
  27.           
  28.         $sheet->getStyle('A2:D2')->applyFromArray($styleArray); 
  29.         $sheet->getStyle('A2:D2')->getFont()->setBold(true)->setSize(12); 
  30.         $sheet->setCellValue('A2','管理员姓名'); 
  31.         $sheet->setCellValue('B2','操作'); 
  32.         $sheet->setCellValue('C2','ip'); 
  33.         $sheet->setCellValue('D2','操作时间'); 
  34.  
  35.         $data = Db::name('system_log')->select(); 
  36.         $sort = 0; 
  37.         foreach ($data as $v){ 
  38.             $sheet->setCellValue('A' . ($sort + 3), $v['admin_name']); 
  39.             $sheet->setCellValue('B' . ($sort + 3), $v['page']); 
  40.             $sheet->setCellValue('C' . ($sort + 3), $v['ip']); 
  41.             $sheet->setCellValue('D' . ($sort + 3), date('Y-m-d H:i:s'$v['add_time'])); 
  42.             $sort++; 
  43.         } 
  44.         // 工作簿标题 
  45.         $sheettitle = '管理员操作记录表'
  46.         $sheet->setTitle($sheettitle); 
  47.  
  48.         header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); 
  49.         // 文件名 
  50.         $filename = '管理员操作记录表'
  51.         header('Content-Disposition: attachment;filename=' . $filename .'.xlsx'); 
  52.         header('Cache-Control: max-age=0'); 
  53.  
  54.         $write = IOFactory::createWriter($spreadsheet'Xlsx'); 
  55.         $write->save('php://output'); 
  56.     }

Tags: PhpSpreadsheet php导出Excel表格

分享到: