插件窝 干货文章 如何使用PHPExcel导出包含数据库图片的Excel文件?

如何使用PHPExcel导出包含数据库图片的Excel文件?

objDrawing PHPExcel 图片 sheet 553    来源:    2025-04-01

使用PHPExcel导出包含数据库图片的Excel文件

PHPExcel是一个强大的PHP库,可以用来导出包含图片的Excel文件。以下是完整的实现步骤:

准备工作

  1. 确保已安装PHPExcel库(可通过Composer安装或手动下载)
  2. 准备数据库连接信息
  3. 确保图片路径正确或图片数据已存储在数据库中

实现代码

<?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);
    }
}

注意事项

  1. 内存限制:处理大量图片时可能需要增加PHP内存限制

    ini_set('memory_limit', '512M');
    
  2. 执行时间:处理大量数据时可能需要增加执行时间限制

    set_time_limit(300); // 5分钟
    
  3. 图片格式:PHPExcel支持多种图片格式,包括PNG、JPEG、GIF等

  4. PHPExcel版本:如果使用最新版的PhpSpreadsheet(PHPExcel的继任者),代码需要相应调整

  5. 性能优化:对于大量数据,考虑分批次处理或使用缓存

希望这个解决方案对您有所帮助!如需进一步优化或有其他需求,请随时提问。