PHP教程 使用PhpSpreadsheet在Excel插入图片的完整代码
用PHP和PhpSpreadsheet给Excel报表插上“图片”的翅膀
在后端开发中,生成带数据的Excel报表是家常便饭,但若想让报表图文并茂,直观地展示产品、课程或人员信息,就需要在单元格里精准地插入图片。今天,我们就来聊聊如何借助强大的PhpSpreadsheet库,让PHP轻松搞定这个需求。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
准备工作
万事开头先装包。通过Composer,一行命令就能把PhpSpreadsheet请到项目里来:
composer require phpoffice/phpspreadsheet
核心实现
1. 创建图片插入函数
function addImageToCell($worksheet, $imagePath, $cell, $name){
$drawing = new Drawing();
$drawing->setName($name);
$drawing->setDescription($name);
$drawing->setPath($imagePath);
$drawing->setHeight(80);
$drawing->setWidth(100);
$drawing->setCoordinates($cell);
$drawing->setOffsetX(5);
$drawing->setOffsetY(5);
$drawing->setWorksheet($worksheet);
}
这个函数是整个流程的“心脏”。它利用 PhpOffice\PhpSpreadsheet\Worksheet\Drawing 类,不仅把图片塞进指定单元格,还能精细控制尺寸、位置,甚至微调图片在单元格内的偏移量,确保视觉上的严丝合缝。
2. 准备数据
$header = ['课程名称', '图片'];
$list = [
[
'name' => 'thinkphp',
'image' => 'images/thinkphp.png'
],
[
'name' => 'npm',
'image' => 'images/npm.png'
],
[
'name' => 'uni-app',
'image' => 'images/uni-app.jpg'
]
];
3. 创建Excel并填充数据
$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();
// 填充标题行
$worksheet->setCellValue('A1', $header[0]);
$worksheet->setCellValue('B1', $header[1]);
$worksheet->getColumnDimension('B')->setWidth(15);
$line = 1;
foreach ($list as $k => $v) {
$line++;
$worksheet->getRowDimension($line)->setRowHeight(100);
$worksheet->getCell('A' . $line)->setValue($v['name']);
addImageToCell($worksheet, $v['image'], 'B' . $line, $v['name']);
}
4. 保存文件
保存方式很灵活,可以根据场景二选一。
通过命令行生成文件: 执行 php index.php,一个实实在在的.xlsx文件就会出现在你的项目目录里。
$writer = new Xlsx($spreadsheet); $filename = 'course_list.xlsx'; $writer->sa ve($filename);
通过Web端触发下载: 如果用内置服务器php -S 127.0.0.1:8888跑起来,访问该地址就会自动弹出下载。部署到Nginx等生产环境后,访问相应URL同样能直接下载文件。
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="course_list.xlsx"');
header('Cache-Control: max-age=0');
$writer = new Xlsx($spreadsheet);
$writer->sa ve('php://output');
关键要点
- 核心在于用好
Drawing类,它是操控图片插入的瑞士军刀。 - 图片要放得好看,提前调整好行高和列宽是关键一步,不然图片可能显示不全。
- 善用
setOffsetX和setOffsetY,能让图片在单元格中的位置更居中、更美观。 - 一个老生常谈但至关重要的问题:务必确保代码中的图片路径正确,并且文件真实存在,否则一切都会功亏一篑。
实际效果
运行代码后,你将得到一个标准的两列表格:“课程名称”是清晰的文本,而“图片”列则整齐地排列着对应的课程Logo或缩略图。整个报表看起来专业又直观,视觉效果直接拉满。
这套方法简直是生成产品目录、带照片的员工花名册、图文课程列表等复合型报表的利器,既满足了数据导出的刚需,又兼顾了视觉呈现的体验。
完整代码
setName($name);
$drawing->setDescription($name);
$drawing->setPath($imagePath);
$drawing->setHeight(80);
$drawing->setWidth(100);
$drawing->setCoordinates($cell);
$drawing->setOffsetX(5);
$drawing->setOffsetY(5);
$drawing->setWorksheet($worksheet);
}
// 示例数据
$header = ['课程名称', '图片'];
$list = [
[
'name' => 'thinkphp',
'image' => 'images/thinkphp.png'
],
[
'name' => 'npm',
'image' => 'images/npm.png'
],
[
'name' => 'uni-app',
'image' => 'images/uni-app.jpg'
]
];
$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();
// 填充标题行
$worksheet->setCellValue('A1', $header[0]);
$worksheet->setCellValue('B1', $header[1]);
$worksheet->getColumnDimension('B')->setWidth(15);
$line = 1;
foreach ($list as $k => $v) {
$line++;
$worksheet->getRowDimension($line)->setRowHeight(100);
$worksheet->getCell('A' . $line)->setValue($v['name']);
addImageToCell($worksheet, $v['image'], 'B' . $line, $v['name']);
}
// 保存为Excel文件
$writer = new Xlsx($spreadsheet);
$filename = 'course_list.xlsx';
$writer->sa ve($filename);
// 下载Excel文件
// header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
// header('Content-Disposition: attachment;filename="course_list.xlsx"');
// header('Cache-Control: max-age=0');
// $writer = new Xlsx($spreadsheet);
// $writer->sa ve('php://output');
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
jstat监控新生代对象增长速率与S区年龄分布动态平衡
实时监控新生代变量增长速率与Survivor区对象年龄分布的动态平衡,对预测MinorGC频率和内存风险至关重要。使用jstat工具持续采样关键时序指标,如Eden区使用量斜率可反映对象增长速率。结合对象年龄分布分析,能识别不同模式下的GC压力,例如高增长速率伴随低龄对象主导可能引发频繁GC,需及时调整优化。
异常性能开销分析揭示为何避免用try-catch替代逻辑判断
在软件开发的日常实践中,开发者常常面临一个关于代码性能与结构清晰度的经典权衡:是否可以使用异常处理机制(try-catch)来替代常规的条件判断逻辑(if-else)?明确的答案是:不应该这样做。这并非仅仅是编码风格的偏好问题,其背后涉及深刻的性能损耗与软件设计哲学。 其根本原因在于,异常的实例化与
使用phpEnv安装AppFlowy搭建Notion替代工具教程
先说一个核心结论:如果你正尝试用phpEnv来安装或运行AppFlowy,那这条路从一开始就走不通。AppFlowy是一个用Rust编写、通过Flutter构建的原生桌面应用,它和PHP、MySQL、Apache这套经典的Web服务栈没有任何关系。简单来说,它既不是PHP项目,也不依赖Web服务器,
Systemarraycopy方法实现数组元素覆盖模拟缓存行擦除操作
在Java编程中,System arraycopy()是实现高效数组复制的核心方法,但它本身并不直接提供数据“擦除”功能。所谓的“模拟缓存行擦除”,其核心原理是利用特定的默认值(如0、null或业务定义的无效标记)批量覆盖目标数组的指定区域,从而在逻辑上使旧数据失效。这种技术在实现轻量级环形缓冲区、
Scanner.useLocale方法详解确保多语言环境小数点数值解析正确
Scanner useLocale()方法要求输入字符串格式与所设Locale完全匹配,无法自动转换小数点格式。常见错误包括环境与输入不匹配、混合格式数据源处理不当。可靠方案是预处理输入或使用NumberFormat类。Locale设置即时生效且不影响其他实例,需注意数字解析与空白分割是独立机制。
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

