翼度科技»论坛 编程开发 PHP 查看内容

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

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
PhpSpreadsheet介绍

1、简介
PhpSpreadsheet 是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式
PhpSpreadsheet 提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到。
  1. 使用 PhpSpreadsheet 开发的PHP要求 7.1或更高版本PhpSpreadsheet 支持链式操作
复制代码
2、安装
使用 composer 安装,在项目根目录下执行下面命令,即可安装。本次是在ThinkPHP5框架里使用。
  1. composer require phpoffice/phpspreadsheet
复制代码
使用

1、引用和实例化
  1. use PhpOffice\PhpSpreadsheet\Spreadsheet;

  2. // 实例化 Spreadsheet 对象
  3. $spreadsheet = new Spreadsheet();
复制代码
2、获取工作簿
getActiveSheet
  1. // 获取活动工作薄
  2. $sheet = $spreadsheet->getActiveSheet();
复制代码
单元格操作

1、获取单元格
两种获取单元格方式

  • getCell
  • getCellByColumnAndRow 数字单元格坐标获取单元格
  1. $cell = $sheet->getCell('A1');
  2. $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. //给A2赋值 hello
  8. $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. //将A列宽度设置成20
  4. $sheet->getColumnDimension('A')->setWidth(20);

  5. //自动计算列宽
  6. $sheet->getColumnDimension('A')->setAutoSize(true);
复制代码

  • getRowDimension 获取一行
  • getRowHeight 获取一行的高度
  • setRowHeight 设置一行的高度
  1. //设置默认行高
  2. $sheet->getDefaultRowDimension()->setRowHeight(20);

  3. //设置第一行行高为20pt
  4. $sheet->getRowDimension('1')->setRowHeight(20);
复制代码

  • getHighestColumn 获取总列数
  • getHighestRow 获取总行数
  1. echo $sheet->getHighestColumn();
  2. 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://blog.csdn.net/u011167662');
复制代码
10、使用函数
SUM求和A;VERAGE平均数;MIN最小值;MAX最大值
  1. $sheet->setCellValue('A3', '=SUM(A1:A2)');
  2. $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. $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
  1. $sheet->setTitle('标题1');
复制代码
实战

1、导出简单数据(使用 ThinkPHP5 框架)
  1. <?php

  2. namespace app\api\controller;

  3. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  4. use PhpOffice\PhpSpreadsheet\Style\Alignment;
  5. use PhpOffice\PhpSpreadsheet\Style\Border;
  6. use PhpOffice\PhpSpreadsheet\IOFactory;

  7. class Excel
  8. {
  9.         public function exporteasy()
  10.         {
  11.                 $spreadsheet = new Spreadsheet();
  12.                 $worksheet = $spreadsheet->getActiveSheet();

  13.                 $title = 'Excel导出';
  14.                 $worksheet->setTitle($title);
  15.                 $worksheet->mergeCells('B2:D2');
  16.                 $worksheet->getRowDimension(1)->setRowHeight(50);
  17.                 $worksheet->getStyle('B2:D2')->applyFromArray([
  18.                     'alignment' => [
  19.                         'horizontal' => Alignment::HORIZONTAL_CENTER,
  20.                         'vertical' => Alignment::VERTICAL_CENTER,
  21.                     ],
  22.                     'borders' => [
  23.                         'outline' => [
  24.                            'borderStyle' => Border::BORDER_THIN,
  25.                             'color' => ['argb' => '000000']
  26.                         ],
  27.                     ],
  28.                     'font' => [
  29.                         'name' => '黑体',
  30.                         'bold' => true,
  31.                         'size' => 22
  32.                     ]
  33.                 ]);
  34.                 $worksheet->setCellValueByColumnAndRow(2, 2, $title);
  35.                 $worksheet->setCellValueByColumnAndRow(2, 3, '姓名');
  36.                 $worksheet->setCellValueByColumnAndRow(3, 3, '性别');
  37.                 $worksheet->setCellValueByColumnAndRow(4, 3, '年龄');
  38.                 $worksheet->setCellValueByColumnAndRow(2, 4, '张三');
  39.                 $worksheet->setCellValueByColumnAndRow(3, 4, '男');
  40.                 $worksheet->setCellValueByColumnAndRow(4, 4, '20');


  41.                 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  42.                 header('Content-Disposition: attachment;filename=Excel导出.xlsx');
  43.                 header('Cache-Control: max-age=0');

  44.                 $write = IOFactory::createWriter($spreadsheet, 'Xlsx');
  45.                 $write->save('php://output');
  46.         }
  47. }
复制代码
导出表格截图:

2、导出数据
liu_system_log 管理员操作记录表
  1. public function export()
  2.         {
  3.                 $spreadsheet = new Spreadsheet();
  4.                 $sheet = $spreadsheet->getActiveSheet();

  5.                 $styleArray = [
  6.                         'alignment' => [
  7.                         'horizontal' => Alignment::HORIZONTAL_CENTER,
  8.                         'vertical' => Alignment::VERTICAL_CENTER,
  9.                     ],
  10.                     'borders' => [
  11.                         'outline' => [
  12.                             'borderStyle' => Border::BORDER_THICK,
  13.                         ],
  14.                     ],
  15.                 ];

  16.                 $sheet->getDefaultColumnDimension()->setWidth(20);// 列宽
  17.                 $sheet->getDefaultRowDimension()->setRowHeight(20);// 行高
  18.                 // 标题
  19.                 $tabletitle = '管理员操作记录表';
  20.                 $sheet->mergeCells('A1:D1');
  21.                 $sheet->getRowDimension('1')->setRowHeight(40);// 行高
  22.                 $sheet->getStyle('A1')->applyFromArray($styleArray);
  23.                 $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16);
  24.                 $sheet->setCellValue('A1', $tabletitle);
  25.                
  26.                 $sheet->getStyle('A2:D2')->applyFromArray($styleArray);
  27.                 $sheet->getStyle('A2:D2')->getFont()->setBold(true)->setSize(12);
  28.                 $sheet->setCellValue('A2','管理员姓名');
  29.             $sheet->setCellValue('B2','操作');
  30.             $sheet->setCellValue('C2','ip');
  31.             $sheet->setCellValue('D2','操作时间');

  32.             $data = Db::name('system_log')->select();
  33.             $sort = 0;
  34.             foreach ($data as $v){
  35.                     $sheet->setCellValue('A' . ($sort + 3), $v['admin_name']);
  36.                     $sheet->setCellValue('B' . ($sort + 3), $v['page']);
  37.                     $sheet->setCellValue('C' . ($sort + 3), $v['ip']);
  38.                     $sheet->setCellValue('D' . ($sort + 3), date('Y-m-d H:i:s', $v['add_time']));
  39.                     $sort++;
  40.             }
  41.             // 工作簿标题
  42.             $sheettitle = '管理员操作记录表';
  43.             $sheet->setTitle($sheettitle);

  44.                 header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  45.                 // 文件名
  46.                 $filename = '管理员操作记录表';
  47.                 header('Content-Disposition: attachment;filename=' . $filename .'.xlsx');
  48.                 header('Cache-Control: max-age=0');

  49.                 $write = IOFactory::createWriter($spreadsheet, 'Xlsx');
  50.                 $write->save('php://output');
  51.         }
复制代码
以上就是php使用PhpSpreadsheet导出Excel表格的实例详解的详细内容,更多关于php PhpSpreadsheet导出Excel的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/program/313252ee6.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具