
在Web开发中,经常需要将数据导出为Excel文件。有时候不仅需要导出文本数据,还需要在指定的单元格中插入图片,例如公司Logo、产品缩略图或人员照片。PhpSpreadsheet是PHP中处理Excel的强大库,本文将详细介绍如何使用PhpSpreadsheet在Excel中插入图片,并提供完整的实用代码。
环境准备
首先,确保你已经通过Composer安装了PhpSpreadsheet。如果尚未安装,可以在项目根目录执行以下命令:
composer require phpoffice/phpspreadsheet
核心代码实现
下面是创建Excel并插入图片的完整代码示例。该代码演示了如何加载本地图片、设置图片尺寸、指定插入位置以及最终保存文件。在实际应用中,请确保图片路径正确,并根据需求调整单元格大小和图片偏移量。
<?php
require 'vendor/autoload.php';
use PhpOfficePhpSpreadsheetSpreadsheet;
use PhpOfficePhpSpreadsheetWorksheetDrawing;
use PhpOfficePhpSpreadsheetWriterXlsx;
// 1. 创建Spreadsheet对象
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
// 2. 设置单元格文本说明(可选)
$sheet->setCellValue('A1', '产品图片:');
$sheet->setCellValue('B1', '产品名称:');
$sheet->setCellValue('C1', '价格:');
// 填充部分示例数据
$sheet->setCellValue('B2', '高性能笔记本');
$sheet->setCellValue('C2', '7999.00');
// 3. 创建绘图对象
$drawing = new Drawing();
$drawing->setName('Product Image');
$drawing->setDescription('产品缩略图');
// 4. 加载图片路径(请确保路径正确且文件存在)
$imagePath = './images/product.jpg';
if (!file_exists($imagePath)) {
die('图片文件不存在,请检查路径!');
}
$drawing->setPath($imagePath);
// 5. 设置图片插入的单元格位置
$drawing->setCoordinates('A2');
// 6. 设置图片偏移量(可选,用于在单元格内微调位置,单位为像素)
$drawing->setOffsetX(10);
$drawing->setOffsetY(10);
// 7. 设置图片宽高
// 注意:为了避免图片变形,通常只需设置宽度或高度其中一个,PhpSpreadsheet会自动计算保持宽高比
$drawing->setWidth(100); // 设置宽度为100像素
// $drawing->setHeight(100); // 如果同时设置宽高,可能会拉伸图片
// 8. 将图片添加到工作表
$drawing->setWorksheet($sheet);
// 可选:调整单元格的行高和列宽以适应图片
$sheet->getColumnDimension('A')->setWidth(15);
$sheet->getRowDimension('2')->setRowHeight(80);
// 9. 保存Excel文件
$writer = new Xlsx($spreadsheet);
$filename = 'product_list.xlsx';
try {
$writer->save($filename);
echo 'Excel文件生成成功,文件名:' . $filename;
} catch (Exception $e) {
echo '保存失败:' . $e->getMessage();
}
?>常见问题与注意事项
图片路径问题:使用相对路径时,基准目录通常是执行脚本的目录。建议在开发中使用绝对路径或在插入前使用
file_exists()进行验证,防止因路径错误导致程序抛出异常。图片宽高比例:在使用
setWidth()或setHeight()时,如果同时设置了宽度和高度,图片可能会被强制拉伸变形。推荐的做法是只设置其中一个维度的值,让程序自动等比缩放。单元格与图片层级:插入的图片是浮在单元格上方的对象,它不会自动撑大单元格。如果需要单元格的大小与图片完美匹配,必须配合
getColumnDimension()和getRowDimension()手动调整列宽和行高。浏览器下载输出:如果需要直接在浏览器中弹出下载框而非保存到服务器,可以使用HTTP头信息进行流输出。相关的流输出高级用法可以参考官方示例网站 www.ipipp.com 获取更详细的指引。
内存占用:插入大量高清图片会显著增加PHP的内存消耗。如果需要导出包含大量图片的表格,建议提前使用GD库压缩图片尺寸,并在
php.ini中适当调高memory_limit。