php使用PhpSpreadsheet導(dǎo)出Excel表格的實(shí)例詳解
PhpSpreadsheet介紹
1、簡介
PhpSpreadsheet 是一個用純PHP編寫的庫,提供了一組類,使您可以讀取和寫入不同的電子表格文件格式
PhpSpreadsheet 提供了豐富的API接口,可以設(shè)置諸多單元格以及文檔屬性,包括樣式、圖片、日期、函數(shù)等等諸多應(yīng)用,總之你想要什么樣的Excel表格,PhpSpreadsheet都能做到。
使用 PhpSpreadsheet 開發(fā)的PHP要求 7.1或更高版本
PhpSpreadsheet 支持鏈?zhǔn)讲僮?/p>
2、安裝
使用 composer 安裝,在項(xiàng)目根目錄下執(zhí)行下面命令,即可安裝。本次是在ThinkPHP5框架里使用。
composer require phpoffice/phpspreadsheet
使用
1、引用和實(shí)例化
use PhpOffice\PhpSpreadsheet\Spreadsheet; // 實(shí)例化 Spreadsheet 對象 $spreadsheet = new Spreadsheet();
2、獲取工作簿
getActiveSheet
// 獲取活動工作薄 $sheet = $spreadsheet->getActiveSheet();
單元格操作
1、獲取單元格
兩種獲取單元格方式
- getCell
- getCellByColumnAndRow 數(shù)字單元格坐標(biāo)獲取單元格
$cell = $sheet->getCell('A1');
$cell = $sheet->getCellByColumnAndRow(1,1); // 參數(shù):列、行
2、設(shè)置單元格的值
- setValue
- setCellValue
- setCellValueByColumnAndRow
// 獲取單元格
$cellA = $sheet->getCell('A1');
// 設(shè)置單元格值
$cellA->setValue('姓名'); // 設(shè)置A1單元格的值為姓名
// 給A1設(shè)置值,參數(shù):單元格位置,值
$sheet->setCellValue('A1','ID');
//給A2賦值 hello
$sheet->setCellValueByColumnAndRow(1, 2, 'hello');
3、單元格文字樣式
- getStyle 獲取單元格樣式
- getFont 獲取單元格文字樣式
- setBold 設(shè)置文字粗細(xì)
- setName 設(shè)置文字字體
- setSize 設(shè)置文字大小
//將A1至D1單元格設(shè)置成粗體
$sheet->getStyle('A1:D1')->getFont()->setBold(true);
//將A1單元格設(shè)置成粗體,黑體,10號字
$sheet->getStyle('A1')->getFont()->setBold(true)->setName('黑體')->setSize(10);
4、單元格文字顏色
- getColor() 獲取坐標(biāo)顏色
- setRGB() 設(shè)置字體顏色(顏色值帶#)
- getRGB() 獲取字體顏色
- setARGB() 設(shè)置字體顏色(顏色值不帶#)
- getARGB() 獲取字體顏色
// B3單元格設(shè)置顏色
$sheet->getStyle('B3')->getFont()->getColor()->setRGB('#AEEEEE');
$sheet->getStyle('B3')->getFont()->getColor()->setARGB('FFFF0000');
5、單元格內(nèi)文字換行
- setWrapText 設(shè)置文本里的\n符合為:換行
//使用 \n 進(jìn)行單元格內(nèi)換行,相當(dāng)于 Alt+Enter
$sheet->getCell('A1')->setValue("hello\nworld");
$sheet->getStyle('A1')->getAlignment()->setWrapText(true);
6、單元格列和行
- getColumnDimension 獲取一列
- getWidth 獲取一列的寬度
- setWidth 設(shè)置一列的寬度
- setAutoSize 設(shè)置一列的寬度自動調(diào)整
- getDefaultColumnDimension 獲取一列的默認(rèn)值
//設(shè)置默認(rèn)列寬20
$sheet->getDefaultColumnDimension()->setWidth(20);
//將A列寬度設(shè)置成20
$sheet->getColumnDimension('A')->setWidth(20);
//自動計(jì)算列寬
$sheet->getColumnDimension('A')->setAutoSize(true);
- getRowDimension 獲取一行
- getRowHeight 獲取一行的高度
- setRowHeight 設(shè)置一行的高度
//設(shè)置默認(rèn)行高
$sheet->getDefaultRowDimension()->setRowHeight(20);
//設(shè)置第一行行高為20pt
$sheet->getRowDimension('1')->setRowHeight(20);
- getHighestColumn 獲取總列數(shù)
- getHighestRow 獲取總行數(shù)
echo $sheet->getHighestColumn(); echo $sheet->getHighestRow();
7、單元格樣式
- applyFromArray 設(shè)置單元格樣式
- 對齊
use PhpOffice\PhpSpreadsheet\Style\Alignment;
// 居中對齊
$styleArray = [
'alignment' => [
'horizontal' => Alignment::HORIZONTAL_CENTER, //水平居中
'vertical' => Alignment::VERTICAL_CENTER, //垂直居中
],
];
$worksheet->getStyle('A1')->applyFromArray($styleArray);
- 邊框
上 下 左 右 全部 邊框都可設(shè)置
//紅色邊框
use PhpOffice\PhpSpreadsheet\Style\Border;
// 外邊框
// Border 類中的常量都是邊框樣式
// Border::BORDER_THICK 邊框樣式
$styleArray = [
'borders' => [
'outline' => [
'borderStyle' => Border::BORDER_THICK,
'color' => ['argb' => 'FFFF0000'],
],
],
];
$worksheet->getStyle('B2:G8')->applyFromArray($styleArray);
8、單元格合并和拆分
- mergeCells 合并
- unmergeCells 拆分
// 合并A1到C1列
$sheet->mergeCells('A1:C4');
// 合并A1到A4行
$sheet->mergeCells('A1:A4');
// 合并后,賦值只能給A1,開始的坐標(biāo)。
$sheet->getCell('A1')->setValue('西安');
// 拆分
$sheet->mergeCells('A1:C4');
$sheet->unmergeCells('A1:A4');
9、超鏈接
- getHyperlink 獲取單元格鏈接
- setUrl 設(shè)置單元格鏈接
$spreadsheet->getActiveSheet()->setCellValue('E6', 'xxxx的博客');
$spreadsheet->getActiveSheet()->getCell('E6')->getHyperlink()->setUrl('https://blog.csdn.net/u011167662');
10、使用函數(shù)
SUM求和A;VERAGE平均數(shù);MIN最小值;MAX最大值
$sheet->setCellValue('A3', '=SUM(A1:A2)');
$sheet->setCellValue('A3', '=MAX(A1:A2)');
11、批量賦值
- fromArray 從數(shù)組中的值填充工作表
參數(shù)1:數(shù)據(jù)(數(shù)組)
參數(shù)2:去除某個值
參數(shù)3:從哪個位置開始
$sheet->fromArray(
[
[1,'歐陽克','18歲','188cm'],
[2,'黃蓉','17歲','165cm'],
[3,'郭靖','21歲','180cm']
], 3, 'A2' );
12、寫入圖片
use PhpOffice\PhpSpreadsheet\Worksheet\Drawing;
//寫入圖片
$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 文件導(dǎo)出
- IOFactory::createWriter 寫入到文件
use PhpOffice\PhpSpreadsheet\IOFactory;
// MIME 協(xié)議,文件的類型,不設(shè)置,會默認(rèn)html
header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
// MIME 協(xié)議的擴(kuò)展
$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 文件導(dǎo)出
// MIME 協(xié)議,文件的類型,不設(shè)置,會默認(rèn)html
header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
// MIME 協(xié)議的擴(kuò)展
$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、設(shè)置工作簿標(biāo)題
- setTitle
$sheet->setTitle('標(biāo)題1');
實(shí)戰(zhàn)
1、導(dǎo)出簡單數(shù)據(jù)(使用 ThinkPHP5 框架)
<?php
namespace app\api\controller;
use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\IOFactory;
class Excel
{
public function exporteasy()
{
$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();
$title = 'Excel導(dǎo)出';
$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導(dǎo)出.xlsx');
header('Cache-Control: max-age=0');
$write = IOFactory::createWriter($spreadsheet, 'Xlsx');
$write->save('php://output');
}
}
導(dǎo)出表格截圖:

2、導(dǎo)出數(shù)據(jù)
liu_system_log 管理員操作記錄表
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);// 行高
// 標(biāo)題
$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++;
}
// 工作簿標(biāo)題
$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導(dǎo)出Excel表格的實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于php PhpSpreadsheet導(dǎo)出Excel的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php中有關(guān)合并某一字段鍵值相同的數(shù)組合并的改進(jìn)
這篇文章主要介紹了php中有關(guān)合并某一字段鍵值相同的數(shù)組合并的改進(jìn),需要的朋友可以參考下2015-03-03
PHP下利用header()函數(shù)設(shè)置瀏覽器緩存的代碼
PHP高級應(yīng)用學(xué)習(xí)筆記之 利用header()函數(shù)設(shè)置瀏覽器緩存2010-09-09
php urlencode()與urldecode()函數(shù)字符編碼原理詳解
中文字符編碼研究系列第五期,詳解 urlencode()與urldecode()函數(shù)字符編碼原理,兩個函數(shù)分別用于編碼 URL 字符串和解碼已編碼的 URL 字符串,實(shí)現(xiàn)對中文字符的編碼2011-12-12
解決wincache不支持64位PHP5.5/5.6的問題(提供64位wincache下載)
這篇文章主要解決wincache不支持64位PHP5.5/5.6的問題,并提供64位wincache的下載,需要的朋友可以參考下。2016-06-06

