PHPExcel是一个强大的PHP库,可以用来导出包含图片的Excel文件。以下是完整的实现步骤:
<?php
// 引入PHPExcel库
require_once 'PHPExcel/PHPExcel.php';
// 数据库连接
$dbHost = 'localhost';
$dbUser = 'username';
$dbPass = 'password';
$dbName = 'database_name';
$conn = new mysqli($dbHost, $dbUser, $dbPass, $dbName);
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 创建PHPExcel对象
$objPHPExcel = new PHPExcel();
// 设置当前活动sheet
$objPHPExcel->setActiveSheetIndex(0);
$sheet = $objPHPExcel->getActiveSheet();
// 设置标题
$sheet->setCellValue('A1', 'ID');
$sheet->setCellValue('B1', '名称');
$sheet->setCellValue('C1', '图片');
// 查询数据库获取数据
$sql = "SELECT id, name, image_data, image_type FROM products"; // 假设image_data存储二进制图片数据
$result = $conn->query($sql);
if ($result->num_rows > 0) {
$rowIndex = 2; // 从第二行开始
while($row = $result->fetch_assoc()) {
// 写入基本数据
$sheet->setCellValue('A'.$rowIndex, $row['id']);
$sheet->setCellValue('B'.$rowIndex, $row['name']);
// 处理图片
if (!empty($row['image_data'])) {
// 创建临时图片文件
$tempFile = tempnam(sys_get_temp_dir(), 'phpimg');
file_put_contents($tempFile, $row['image_data']);
// 创建PHPExcel图片对象
$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setName('Product Image');
$objDrawing->setDescription('Product Image');
$objDrawing->setPath($tempFile);
// 设置图片位置和大小
$objDrawing->setCoordinates('C'.$rowIndex);
$objDrawing->setOffsetX(10);
$objDrawing->setOffsetY(10);
$objDrawing->setWidth(100);
$objDrawing->setHeight(100);
// 将图片添加到工作表
$objDrawing->setWorksheet($sheet);
// 调整行高以适应图片
$sheet->getRowDimension($rowIndex)->setRowHeight(80);
// 删除临时文件
unlink($tempFile);
}
$rowIndex++;
}
}
// 调整列宽
$sheet->getColumnDimension('A')->setWidth(10);
$sheet->getColumnDimension('B')->setWidth(20);
$sheet->getColumnDimension('C')->setWidth(30);
// 设置文件名和格式
$fileName = 'products_with_images_' . date('YmdHis') . '.xlsx';
// 设置HTTP头
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment;filename="'.$fileName.'"');
header('Cache-Control: max-age=0');
// 创建Excel2007写入对象
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
exit;
?>
如果数据库中存储的是图片路径而非二进制数据,可以修改图片处理部分:
// 替换上面的图片处理部分
if (!empty($row['image_path'])) {
$imagePath = '/path/to/images/' . $row['image_path']; // 根据实际情况调整路径
if (file_exists($imagePath)) {
$objDrawing = new PHPExcel_Worksheet_Drawing();
$objDrawing->setName('Product Image');
$objDrawing->setDescription('Product Image');
$objDrawing->setPath($imagePath);
$objDrawing->setCoordinates('C'.$rowIndex);
$objDrawing->setOffsetX(10);
$objDrawing->setOffsetY(10);
$objDrawing->setWidth(100);
$objDrawing->setHeight(100);
$objDrawing->setWorksheet($sheet);
$sheet->getRowDimension($rowIndex)->setRowHeight(80);
}
}
内存限制:处理大量图片时可能需要增加PHP内存限制
ini_set('memory_limit', '512M');
执行时间:处理大量数据时可能需要增加执行时间限制
set_time_limit(300); // 5分钟
图片格式:PHPExcel支持多种图片格式,包括PNG、JPEG、GIF等
PHPExcel版本:如果使用最新版的PhpSpreadsheet(PHPExcel的继任者),代码需要相应调整
性能优化:对于大量数据,考虑分批次处理或使用缓存
希望这个解决方案对您有所帮助!如需进一步优化或有其他需求,请随时提问。