一、PhpSpreadsheet 介绍
PhpSpreadsheet是一个用纯PHP编写的库,提供了一组类,使您可以读取和写入不同的电子表格文件格式
PhpSpreadsheet提供了丰富的API接口,可以设置诸多单元格以及文档属性,包括样式、图片、日期、函数等等诸多应用,总之你想要什么样的Excel表格,PhpSpreadsheet都能做到
使用 PhpSpreadsheet 开发的PHP要求 7.1或更高版本
PhpSpreadsheet 支持链式操作
PhpSpreadsheet 官方网址:https://phpspreadsheet.readthedocs.io
PhpSpreadsheet 安装
composer require phpoffice/phpspreadsheet
二、基础使用
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$cellA = $sheet->getCell('A1');
$cellA->setValue('欧阳克');
$cellB = $sheet->getCellByColumnAndRow(1,2);
$cellB->setValue('黄蓉');
$sheet->getCell('A3')->setValue('郭靖');
$sheet->getCellByColumnAndRow(1,4)->setValue('杨康');
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$writer = new Xlsx($spreadsheet);
$writer->save('1.xlsx');
强化表格操作
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1','ID');
$sheet->setCellValue('B1','姓名');
$sheet->setCellValue('C1','年龄');
$sheet->setCellValue('D1','身高');
$sheet->setCellValue('E1','生日');
$sheet->setCellValue('F1','网址');
$sheet->setCellValue('G1','语文分数');
$sheet->setCellValue('H1','数学分数');
$sheet->setCellValue('I1','总分');
$sheet->setCellValueByColumnAndRow(1, 2, 1);
$sheet->setCellValueByColumnAndRow(2, 2, '欧阳克');
$sheet->setCellValueByColumnAndRow(3, 2, '18岁');
$sheet->setCellValueByColumnAndRow(4, 2, '188cm');
$sheet->setCellValueByColumnAndRow(5, 2, '188cm');
$sheet->setCellValue('E2','2019-10-10 10:10:10');
$sheet->setCellValue('G2',90);
$sheet->setCellValue('H2',92);
$sheet->setCellValue('I2','=SUM(G2:H2)');
$sheet->setCellValueByColumnAndRow(1, 3, 2);
$sheet->setCellValueByColumnAndRow(2, 3, '黄蓉');
$sheet->setCellValueByColumnAndRow(3, 3, '17岁');
$sheet->setCellValueByColumnAndRow(4, 3, '165cm');
$sheet->setCellValue('E3','2019-10-10 10:10:10');
$sheet->setCellValue('G3',90);
$sheet->setCellValue('H3',92);
$sheet->setCellValue('I3','=SUM(G2:H2)');
$sheet->getStyle('B2')->getFont()->setBold(true)->setName('宋体')->setSize(20)->getColor()->setRGB('#AEEEEE');
echo $sheet->getStyle('B2')->getFont()->getColor()->getRGB(),PHP_EOL;
$sheet->getStyle('B3')->getFont()->getColor()->setARGB('FFFF0000');
echo $sheet->getStyle('B3')->getFont()->getColor()->getARGB();
$sheet->getStyle('E3')->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_DATE_YYYYMMDD);
$sheet->setCellValue('A1',"欧阳克\n黄蓉");
$sheet->getStyle('A1')->getAlignment()->setWrapText(true);
$sheet->setCellValue('F2','www.php.cn');
$sheet->getCell('F2')->getHyperlink()->setUrl('http://www.php.cn');
$sheet->fromArray(
[
[4,'小名','18岁','188cm'],
[5,'小吴','18岁','188cm'],
],
4,
'A3'
);
$sheet->mergeCells('I4:I5');
$sheet->mergeCells('I6:I8');
$sheet->unmergeCells('I6:I8');
echo $sheet->getColumnDimension('A')->getWidth().PHP_EOL;
$sheet->getColumnDimension('A')->setWidth(30);
$sheet->getColumnDimension('B')->setAutoSize(true);
$sheet->getDefaultColumnDimension()->setWidth(20);
echo $sheet->getRowDimension(1)->getRowHeight().PHP_EOL;
$sheet->getRowDimension(1)->setRowHeight(100);
$sheet->getDefaultRowDimension()->setRowHeight(1);
echo $sheet->getHighestColumn().PHP_EOL;
echo $sheet->getHighestRow().PHP_EOL;
$styleArray = [
'alignment' => [
'horizontal' => 'center',
'vertical' => 'center',
],
'borders' => [
'outline' => [
'borderStyle' => 'thick',
'color' => ['argb' => 'FFFF0000'],
],
],
'font' => [
'name' => '黑体',
'bold' => true,
'size' => 22
]
];
$sheet->getStyle('B1')->applyFromArray($styleArray);
$sheet->setTitle('测试');
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
$writer = new Xlsx($spreadsheet);
$writer->save('1.xlsx');
读取表格
<?php
require 'vendor/autoload.php';
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$spreadsheet = $reader->load('1.xlsx');
$sheet = $spreadsheet->getActiveSheet();
$cellC1 = $sheet->getCell('B2');
echo '值: ', $cellC1->getValue(),PHP_EOL;
echo '坐标: ', $cellC1->getCoordinate(),PHP_EOL;
$sheet->setCellValue('B2','欧阳锋');
$cellC2 = $sheet->getCell('B2');
echo '值: ', $cellC2->getValue(),PHP_EOL;
echo '坐标: ', $cellC2->getCoordinate();
导入功能
<?php
$file = $_FILES['file']['tmp_name'];
require 'vendor/autoload.php';
require 'function.php';
$reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');
$spreadsheet = $reader->load($file);
$sheet = $spreadsheet->getActiveSheet();
$highestColumn = $sheet->getHighestColumn();
$highestRow = $sheet->getHighestRow();
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
$log = [];
for($a=2;$a<$highestRow;$a++){
$title = $sheet->getCellByColumnAndRow(1,$a)->getValue();
$cat_fname = $sheet->getCellByColumnAndRow(2,$a)->getValue();
$cat_name = $sheet->getCellByColumnAndRow(3,$a)->getValue();
$price = $sheet->getCellByColumnAndRow(4,$a)->getValue();
$img = $sheet->getCellByColumnAndRow(5,$a)->getValue();
$cat_fid = find('shop_cat','id','name="'.$cat_fname.'"');
$cat_id = find('shop_cat','id','name="'.$cat_name.'"');
$data = [
'title' => $title,
'cat_fid' => $cat_fid['id'],
'cat_id' => $cat_id['id'],
'price' => $price,
'img' => $img,
'add_time' => time(),
];
}
echo json_encode(['code'=>0,'msg'=>'成功','data'=>$log]);
xls / xlsx 文件下载
<?php
require 'vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Spreadsheet;
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$sheet->setCellValue('A1','ID');
$sheet->setCellValue('B1','姓名');
$sheet->setCellValue('C1','年龄');
$sheet->setCellValue('D1','身高');
$sheet->setCellValueByColumnAndRow(1, 2, 1);
$sheet->setCellValueByColumnAndRow(2, 2, '欧阳克');
$sheet->setCellValueByColumnAndRow(3, 2, '18岁');
$sheet->setCellValueByColumnAndRow(4, 2, '188cm');
header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition:attachment;filename=1.xlsx');
header('Cache-Control:max-age=0');
$writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');
$writer->save('php://output');
导出封装函数
<?php
require 'vendor/autoload.php';
function CreateExcel($Data, $Header, $Path, $FileName, $LongNumberField = null)
{
$SpreadSheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
$Sheet = $SpreadSheet->getActiveSheet();
if ($LongNumberField === null) {
array_unshift($Data, $Header);
$SpreadSheet->getDefaultStyle()->getNumberFormat()->setFormatCode(\PhpOffice\PhpSpreadsheet\Style\NumberFormat::FORMAT_NUMBER);
$Sheet->fromArray($Data);
} else {
$HeaderCount = count($Header);
for ($i = 0; $i < $HeaderCount; $i++) {
$Sheet->setCellValueByColumnAndRow($i + 1, 1, $Header[$i]);
}
$RowIndex = 2;
$DataCount = count($Data);
for ($i = 0; $i < $DataCount; $i++) {
$ColumnIndex = 1;
foreach ($Data[$i] as $Key => $Value) {
if (in_array($Key, $LongNumberField)) {
$Sheet->setCellValueExplicitByColumnAndRow($ColumnIndex, $RowIndex, $Value, \PhpOffice\PhpSpreadsheet\Cell\DataType::TYPE_STRING);
} else {
$Sheet->setCellValueByColumnAndRow($ColumnIndex, $RowIndex, $Value);
}
$ColumnIndex++;
}
$RowIndex++;
}
}
$Xlsx = new \PhpOffice\PhpSpreadsheet\Writer\Xlsx($SpreadSheet);
$Xlsx->save($Path . $FileName);
}
$Data = [
['id' => 1, 'name' => '张三', 'bank_card' => '123456789123456789'],
['id' => 2, 'name' => '李四', 'bank_card' => '123456123456789789'],
];
$Header = ['id', '姓名', '银行卡号'];
$Path = 'D:\Work\Php\test.loc\\';
$FileName = 'Export.xlsx';
$LongNumberField = ['bank_card'];
CreateExcel($Data, $Header, $Path, $FileName, $LongNumberField);