本文目录导读:

我来详细介绍PHPOffice/PhpSpreadsheet(PHPExcel的升级版)在PHP项目中的Excel处理。
安装
composer require phpoffice/phpspreadsheet
基础配置
自动加载
require 'vendor/autoload.php'; use PhpOffice\PhpSpreadsheet\Spreadsheet; use PhpOffice\PhpSpreadsheet\Writer\Xlsx; use PhpOffice\PhpSpreadsheet\IOFactory;
创建Excel文件
基本示例
// 创建Spreadsheet对象
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 设置单元格值
$sheet->setCellValue('A1', 'Hello');
$sheet->setCellValue('B1', 'World');
$sheet->setCellValue('C1', 'Welcome');
// 保存文件
$writer = new Xlsx($spreadsheet);
$writer->save('hello_world.xlsx');
完整示例:导出数据
function exportExcel($data, $headers, $filename = 'export.xlsx') {
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 设置标题行
$col = 'A';
foreach ($headers as $header) {
$sheet->setCellValue($col . '1', $header);
$col++;
}
// 填充数据
$row = 2;
foreach ($data as $item) {
$col = 'A';
foreach ($item as $value) {
$sheet->setCellValue($col . $row, $value);
$col++;
}
$row++;
}
// 设置样式
$styleArray = [
'font' => [
'bold' => true,
'size' => 12,
],
'alignment' => [
'horizontal' => \PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER,
],
];
$sheet->getStyle('A1:' . $col . '1')->applyFromArray($styleArray);
// 设置列宽
foreach (range('A', $col) as $columnID) {
$sheet->getColumnDimension($columnID)->setAutoSize(true);
}
// 输出文件
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="' . $filename . '"');
header('Cache-Control: max-age=0');
$writer = new Xlsx($spreadsheet);
$writer->save('php://output');
exit;
}
读取Excel文件
基本读取
function readExcel($filePath) {
$spreadsheet = IOFactory::load($filePath);
$sheet = $spreadsheet->getActiveSheet();
$data = [];
foreach ($sheet->getRowIterator() as $row) {
$rowData = [];
foreach ($row->getCellIterator() as $cell) {
$rowData[] = $cell->getValue();
}
$data[] = $rowData;
}
return $data;
}
高级读取:处理空行和特殊格式
function readExcelAdvanced($filePath) {
$spreadsheet = IOFactory::load($filePath);
$worksheet = $spreadsheet->getActiveSheet();
$data = [];
$highestRow = $worksheet->getHighestRow();
$highestColumn = $worksheet->getHighestColumn();
$highestColumnIndex = \PhpOffice\PhpSpreadsheet\Cell\Coordinate::columnIndexFromString($highestColumn);
for ($row = 1; $row <= $highestRow; ++$row) {
$rowData = [];
for ($col = 1; $col <= $highestColumnIndex; ++$col) {
$cellValue = $worksheet->getCellByColumnAndRow($col, $row)->getValue();
// 处理日期格式
if (\PhpOffice\PhpSpreadsheet\Shared\Date::isDateTime($cellValue)) {
$cellValue = \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject($cellValue);
$cellValue = $cellValue->format('Y-m-d H:i:s');
}
$rowData[] = $cellValue;
}
// 跳过空行
if (!empty(array_filter($rowData))) {
$data[] = $rowData;
}
}
return $data;
}
高级样式设置
单元格样式
function setCellStyle($sheet) {
// 字体样式
$sheet->getStyle('A1:D1')->getFont()
->setBold(true)
->setSize(14)
->setColor(new \PhpOffice\PhpSpreadsheet\Style\Color('FF0000'));
// 背景颜色
$sheet->getStyle('A1:D1')->getFill()
->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID)
->getStartColor()->setARGB('FFFF00');
// 边框
$sheet->getStyle('A1:D10')->getBorders()
->getAllBorders()
->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN);
// 对齐
$sheet->getStyle('A1:D10')->getAlignment()
->setHorizontal(\PhpOffice\PhpSpreadsheet\Style\Alignment::HORIZONTAL_CENTER)
->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_CENTER);
// 数字格式
$sheet->getStyle('B2:B10')->getNumberFormat()
->setFormatCode('#,##0.00');
// 合并单元格
$sheet->mergeCells('A1:D1');
}
处理大文件
使用Chunk读取
function readLargeExcel($inputFileName) {
$inputFileType = IOFactory::identify($inputFileName);
$reader = IOFactory::createReader($inputFileType);
// 设置只读取数据
$reader->setReadDataOnly(true);
// 分块读取
$chunkSize = 1000;
$chunkFilter = new ChunkReadFilter();
$reader->setReadFilter($chunkFilter);
$data = [];
for ($startRow = 1; $startRow <= 10000; $startRow += $chunkSize) {
$chunkFilter->setRows($startRow, $chunkSize);
$spreadsheet = $reader->load($inputFileName);
// 处理数据
$worksheet = $spreadsheet->getActiveSheet();
foreach ($worksheet->getRowIterator() as $row) {
$rowData = [];
foreach ($row->getCellIterator() as $cell) {
$rowData[] = $cell->getValue();
}
$data[] = $rowData;
}
}
return $data;
}
实用功能示例
导出包含图片的Excel
function exportWithImage($data, $imagePath) {
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 添加数据
$sheet->setCellValue('A1', '商品名称');
$sheet->setCellValue('B1', '价格');
$sheet->setCellValue('C1', '图片');
$row = 2;
foreach ($data as $item) {
$sheet->setCellValue('A' . $row, $item['name']);
$sheet->setCellValue('B' . $row, $item['price']);
// 添加图片
$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
$drawing->setName('Image');
$drawing->setDescription('Product Image');
$drawing->setPath($imagePath);
$drawing->setHeight(100);
$drawing->setCoordinates('C' . $row);
$drawing->setWorksheet($sheet);
$row++;
}
return $spreadsheet;
}
多工作表操作
function createMultiSheet($dataSets) {
$spreadsheet = new Spreadsheet();
foreach ($dataSets as $index => $dataset) {
if ($index == 0) {
$sheet = $spreadsheet->getActiveSheet();
} else {
$sheet = $spreadsheet->createSheet();
}
$sheet->setTitle($dataset['title']);
// 设置数据
$row = 1;
foreach ($dataset['headers'] as $col => $header) {
$colLetter = chr(65 + $col);
$sheet->setCellValue($colLetter . $row, $header);
}
$row = 2;
foreach ($dataset['data'] as $item) {
$col = 0;
foreach ($item as $value) {
$colLetter = chr(65 + $col);
$sheet->setCellValue($colLetter . $row, $value);
$col++;
}
$row++;
}
}
return $spreadsheet;
}
性能优化建议
-
使用缓存:大数据量时启用缓存
$settings = new Settings(); $cache = new CacheInterface(); $settings->setCache($cache);
-
使用内存优化:大文件读取时使用
$reader->setReadDataOnly(true); $reader->setIgnoreRowsWithNoCells(true);
-
批量写入:
$sheet->fromArray($data, null, 'A2');
常见错误处理
try {
$spreadsheet = IOFactory::load($filePath);
// 处理逻辑
} catch (\PhpOffice\PhpSpreadsheet\Reader\Exception $e) {
// 读取错误
echo '文件格式不支持: ' . $e->getMessage();
} catch (\PhpOffice\PhpSpreadsheet\Exception $e) {
// Spreadsheet操作错误
echo '处理错误: ' . $e->getMessage();
} catch (Exception $e) {
// 其他错误
echo '未知错误: ' . $e->getMessage();
}
这些是PHPOffice/PhpSpreadsheet的主要用法,根据你的具体需求,可以选择相应的功能来实现Excel的导入导出处理。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播