您的位置:首页 >使用PHP和PhpSpreadsheet在Excel中插入图片的完整代码
发布于2026-04-21 阅读(0)
扫一扫,手机访问
在后端开发中,生成带数据的Excel报表是家常便饭,但若想让报表图文并茂,直观地展示产品、课程或人员信息,就需要在单元格里精准地插入图片。今天,我们就来聊聊如何借助强大的PhpSpreadsheet库,让PHP轻松搞定这个需求。
万事开头先装包。通过Composer,一行命令就能把PhpSpreadsheet请到项目里来:
composer require phpoffice/phpspreadsheet
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 类,不仅把图片塞进指定单元格,还能精细控制尺寸、位置,甚至微调图片在单元格内的偏移量,确保视觉上的严丝合缝。
$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']);
}
保存方式很灵活,可以根据场景二选一。
通过命令行生成文件: 执行 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');
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9