PhpSpreadsheet介绍
1、简介
PhpSpreadsheet 是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式
PhpSpreadsheet 提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到。
使用 PhpSpreadsheet 开发的PHP要求 7.1或更高版本
PhpSpreadsheet 支持链式操作
2、安装
使用 composer 安装,在项目根目录下执行下面命令,即可安装。本次是在ThinkPHP5框架里使用。
composer require phpoffice/phpspreadsheet
使用
1、引用和实例化
1 2 3 4 | use PhpOfficePhpSpreadsheetSpreadsheet; // 实例化 Spreadsheet 对象 $spreadsheet = new Spreadsheet(); |
2、获取工作簿
getActiveSheet
1 2 | // 获取活动工作薄 $sheet = $spreadsheet ->getActiveSheet(); |
单元格操作
1、获取单元格
两种获取单元格方式
- getCell
- getCellByColumnAndRow 数字单元格坐标获取单元格
1 2 | $cell = $sheet ->getCell( 'A1' ); $cell = $sheet ->getCellByColumnAndRow(1,1); // 参数:列、行 |
2、设置单元格的值
- setValue
- setCellValue
- setCellValueByColumnAndRow
1 2 3 4 5 6 7 8 9 | // 获取单元格 $cellA = $sheet ->getCell( 'A1' ); // 设置单元格值 $cellA ->setValue( '姓名' ); // 设置A1单元格的值为姓名 // 给A1设置值,参数:单元格位置,值 $sheet ->setCellValue( 'A1' , 'ID' ); //给A2赋值 hello $sheet ->setCellValueByColumnAndRow(1, 2, 'hello' ); |
3、单元格文字样式
- getStyle 获取单元格样式
- getFont 获取单元格文字样式
- setBold 设置文字粗细
- setName 设置文字字体
- setSize 设置文字大小
1 2 3 4 | //将A1至D1单元格设置成粗体 $sheet ->getStyle( 'A1:D1' )->getFont()->setBold(true); //将A1单元格设置成粗体,黑体,10号字 $sheet ->getStyle( 'A1' )->getFont()->setBold(true)->setName( '黑体' )->setSize(10); |
4、单元格文字颜色
- getColor() 获取坐标颜色
- setRGB() 设置字体颜色(颜色值带#)
- getRGB() 获取字体颜色
- setARGB() 设置字体颜色(颜色值不带#)
- getARGB() 获取字体颜色
1 2 3 | // B3单元格设置颜色 $sheet ->getStyle( 'B3' )->getFont()->getColor()->setRGB( '#AEEEEE' ); $sheet ->getStyle( 'B3' )->getFont()->getColor()->setARGB( 'FFFF0000' ); |
5、单元格内文字换行
- setWrapText 设置文本里的n符合为:换行
1 2 3 | //使用 n 进行单元格内换行,相当于 Alt+Enter $sheet ->getCell( 'A1' )->setValue( "hellonworld" ); $sheet ->getStyle( 'A1' )->getAlignment()->setWrapText(true); |
6、单元格列和行
- getColumnDimension 获取一列
- getWidth 获取一列的宽度
- setWidth 设置一列的宽度
- setAutoSize 设置一列的宽度自动调整
- getDefaultColumnDimension 获取一列的默认值
1 2 3 4 5 6 7 8 | //设置默认列宽20 $sheet ->getDefaultColumnDimension()->setWidth(20); //将A列宽度设置成20 $sheet ->getColumnDimension( 'A' )->setWidth(20); //自动计算列宽 $sheet ->getColumnDimension( 'A' )->setAutoSize(true); |
- getRowDimension 获取一行
- getRowHeight 获取一行的高度
- setRowHeight 设置一行的高度
1 2 3 4 5 | //设置默认行高 $sheet ->getDefaultRowDimension()->setRowHeight(20); //设置第一行行高为20pt $sheet ->getRowDimension( '1' )->setRowHeight(20); |
- getHighestColumn 获取总列数
- getHighestRow 获取总行数
1 2 | echo $sheet ->getHighestColumn(); echo $sheet ->getHighestRow(); |
7、单元格样式
- applyFromArray 设置单元格样式
- 对齐
1 2 3 4 5 6 7 8 9 | use PhpOfficePhpSpreadsheetStyleAlignment; // 居中对齐 $styleArray = [ 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, //水平居中 'vertical' => Alignment::VERTICAL_CENTER, //垂直居中 ], ]; $worksheet ->getStyle( 'A1' )->applyFromArray( $styleArray ); |
- 边框
上 下 左 右 全部 边框都可设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | //红色边框 use PhpOfficePhpSpreadsheetStyleBorder; // 外边框 // Border 类中的常量都是边框样式 // Border::BORDER_THICK 边框样式 $styleArray = [ 'borders' => [ 'outline' => [ 'borderStyle' => Border::BORDER_THICK, 'color' => [ 'argb' => 'FFFF0000' ], ], ], ]; $worksheet ->getStyle( 'B2:G8' )->applyFromArray( $styleArray ); |
8、单元格合并和拆分
- mergeCells 合并
- unmergeCells 拆分
1 2 3 4 5 6 7 8 9 | // 合并A1到C1列 $sheet ->mergeCells( 'A1:C4' ); // 合并A1到A4行 $sheet ->mergeCells( 'A1:A4' ); // 合并后,赋值只能给A1,开始的坐标。 $sheet ->getCell( 'A1' )->setValue( '西安' ); // 拆分 $sheet ->mergeCells( 'A1:C4' ); $sheet ->unmergeCells( 'A1:A4' ); |
9、超链接
- getHyperlink 获取单元格链接
- setUrl 设置单元格链接
1 2 | $spreadsheet ->getActiveSheet()->setCellValue( 'E6' , 'xxxx的博客' ); $spreadsheet ->getActiveSheet()->getCell( 'E6' )->getHyperlink()->setUrl( 'https://blog.csdn.net/u011167662' ); |
10、使用函数
SUM求和A;VERAGE平均数;MIN最小值;MAX最大值
1 2 | $sheet ->setCellValue( 'A3' , '=SUM(A1:A2)' ); $sheet ->setCellValue( 'A3' , '=MAX(A1:A2)' ); |
11、批量赋值
- fromArray 从数组中的值填充工作表
参数1:数据(数组)
参数2:去除某个值
参数3:从哪个位置开始
1 2 3 4 5 6 | $sheet ->fromArray( [ [1, '欧阳克' , '18岁' , '188cm' ], [2, '黄蓉' , '17岁' , '165cm' ], [3, '郭靖' , '21岁' , '180cm' ] ], 3, 'A2' ); |
12、写入图片
1 2 3 4 5 6 7 8 9 | use PhpOfficePhpSpreadsheetWorksheetDrawing; //写入图片 $drawing = new Drawing(); $drawing ->setName( 'Logo' )->setDescription( 'Logo' )->setPath( '../files/1.jpg' )->setHeight(30)->setCoordinates( 'D6' )->setOffsetX(50)->setOffsetY(6); $drawing ->setRotation(25); $drawing ->getShadow()->setVisible(true); $drawing ->getShadow()->setDirection(45); $drawing ->setWorksheet( $sheet ); |
工作簿操作
1、xlsx 文件导出
- IOFactory::createWriter 写入到文件
1 2 3 4 5 6 7 8 9 10 | use PhpOfficePhpSpreadsheetIOFactory; // MIME 协议,文件的类型,不设置,会默认html header( 'Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ); // MIME 协议的扩展 $filename = date ( 'Y-m-d' ). '工作报告单' ; header( 'Content-Disposition:attachment;filename=' . $filename . '.xlsx' ); // 缓存控制 header( 'Cache-Control:max-age=0' ); $write = IOFactory::createWriter( $spreadsheet , 'Xlsx' ); $write ->save( 'php://output' ); |
2、xls 文件导出
1 2 3 4 5 6 7 8 9 | // MIME 协议,文件的类型,不设置,会默认html header( 'Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ); // MIME 协议的扩展 $filename = date ( 'Y-m-d' ). '工作报告单' ; header( 'Content-Disposition:attachment;filename=' . $filename . '.xls' ); // 缓存控制 header( 'Cache-Control:max-age=0' ); $write = IOFactory::createWriter( $spreadsheet , 'Xls' ); $write ->save( 'php://output' ); |
3、设置工作簿标题
- setTitle
1 | $sheet->setTitle( '标题1' ); |
实战
1、导出简单数据(使用 ThinkPHP5 框架)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | getActiveSheet(); $title = 'Excel导出' ; $worksheet ->setTitle( $title ); $worksheet ->mergeCells( 'B2:D2' ); $worksheet ->getRowDimension(1)->setRowHeight(50); $worksheet ->getStyle( 'B2:D2' )->applyFromArray([ 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, 'vertical' => Alignment::VERTICAL_CENTER, ], 'borders' => [ 'outline' => [ 'borderStyle' => Border::BORDER_THIN, 'color' => [ 'argb' => '000000' ] ], ], 'font' => [ 'name' => '黑体' , 'bold' => true, 'size' => 22 ] ]); $worksheet ->setCellValueByColumnAndRow(2, 2, $title ); $worksheet ->setCellValueByColumnAndRow(2, 3, '姓名' ); $worksheet ->setCellValueByColumnAndRow(3, 3, '性别' ); $worksheet ->setCellValueByColumnAndRow(4, 3, '年龄' ); $worksheet ->setCellValueByColumnAndRow(2, 4, '张三' ); $worksheet ->setCellValueByColumnAndRow(3, 4, '男' ); $worksheet ->setCellValueByColumnAndRow(4, 4, '20' ); header( 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ); header( 'Content-Disposition: attachment;filename=Excel导出.xlsx' ); header( 'Cache-Control: max-age=0' ); $write = IOFactory::createWriter( $spreadsheet , 'Xlsx' ); $write ->save( 'php://output' ); } } |
导出表格截图:
2、导出数据
liu_system_log 管理员操作记录表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | public function export() { $spreadsheet = new Spreadsheet(); $sheet = $spreadsheet ->getActiveSheet(); $styleArray = [ 'alignment' => [ 'horizontal' => Alignment::HORIZONTAL_CENTER, 'vertical' => Alignment::VERTICAL_CENTER, ], 'borders' => [ 'outline' => [ 'borderStyle' => Border::BORDER_THICK, ], ], ]; $sheet ->getDefaultColumnDimension()->setWidth(20); // 列宽 $sheet ->getDefaultRowDimension()->setRowHeight(20); // 行高 // 标题 $tabletitle = '管理员操作记录表' ; $sheet ->mergeCells( 'A1:D1' ); $sheet ->getRowDimension( '1' )->setRowHeight(40); // 行高 $sheet ->getStyle( 'A1' )->applyFromArray( $styleArray ); $sheet ->getStyle( 'A1' )->getFont()->setBold(true)->setSize(16); $sheet ->setCellValue( 'A1' , $tabletitle ); $sheet ->getStyle( 'A2:D2' )->applyFromArray( $styleArray ); $sheet ->getStyle( 'A2:D2' )->getFont()->setBold(true)->setSize(12); $sheet ->setCellValue( 'A2' , '管理员姓名' ); $sheet ->setCellValue( 'B2' , '操作' ); $sheet ->setCellValue( 'C2' , 'ip' ); $sheet ->setCellValue( 'D2' , '操作时间' ); $data = Db::name( 'system_log' )->select(); $sort = 0; foreach ( $data as $v ){ $sheet ->setCellValue( 'A' . ( $sort + 3), $v [ 'admin_name' ]); $sheet ->setCellValue( 'B' . ( $sort + 3), $v [ 'page' ]); $sheet ->setCellValue( 'C' . ( $sort + 3), $v [ 'ip' ]); $sheet ->setCellValue( 'D' . ( $sort + 3), date ( 'Y-m-d H:i:s' , $v [ 'add_time' ])); $sort ++; } // 工作簿标题 $sheettitle = '管理员操作记录表' ; $sheet ->setTitle( $sheettitle ); header( 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ); // 文件名 $filename = '管理员操作记录表' ; header( 'Content-Disposition: attachment;filename=' . $filename . '.xlsx' ); header( 'Cache-Control: max-age=0' ); $write = IOFactory::createWriter( $spreadsheet , 'Xlsx' ); $write ->save( 'php://output' ); } |
以上就是php使用PhpSpreadsheet导出Excel表格的实例详解的详细内容,更多关于php PhpSpreadsheet导出Excel的资料请关注IT俱乐部其它相关文章!