You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中用phpspreadsheet在Excel两单元格间绘制直线的方法

在Laravel中用PhpSpreadsheet绘制Excel单元格间直线的解决方案

你之前用Drawing类的方式有误,这个类是用于插入图片的,要绘制直线需使用PhpSpreadsheet内置的Line形状类。以下是具体实现方案:

直接使用PhpSpreadsheet的实现代码

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Worksheet\Shape\Line;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;

// 初始化Spreadsheet和工作表
$spreadsheet = new Spreadsheet();
$worksheet = $spreadsheet->getActiveSheet();

// 设置单元格内容
$worksheet->setCellValue('A1', 'Cell 1');
$worksheet->setCellValue('D4', 'Cell 2');

// 定义要连接的两个单元格
$startCell = 'B4';
$endCell = 'F9';

// 解析单元格的列和行
[$startCol, $startRow] = Coordinate::coordinateFromString($startCell);
[$endCol, $endRow] = Coordinate::coordinateFromString($endCell);

// 计算起点像素坐标(单元格左上角)
$startX = 0;
for ($col = 'A'; $col < $startCol; $col++) {
    // 默认1单位列宽对应9.5像素
    $startX += $worksheet->getColumnDimension($col)->getWidth() * 9.5;
}
$startY = 0;
for ($row = 1; $row < $startRow; $row++) {
    $startY += $worksheet->getRowDimension($row)->getRowHeight();
}

// 计算终点像素坐标(单元格左上角)
$endX = 0;
for ($col = 'A'; $col < $endCol; $col++) {
    $endX += $worksheet->getColumnDimension($col)->getWidth() * 9.5;
}
$endY = 0;
for ($row = 1; $row < $endRow; $row++) {
    $endY += $worksheet->getRowDimension($row)->getRowHeight();
}

// 如需连接单元格中心,取消下面注释
// $startX += ($worksheet->getColumnDimension($startCol)->getWidth() * 9.5) / 2;
// $startY += $worksheet->getRowDimension($startRow)->getRowHeight() / 2;
// $endX += ($worksheet->getColumnDimension($endCol)->getWidth() * 9.5) / 2;
// $endY += $worksheet->getRowDimension($endRow)->getRowHeight() / 2;

// 创建直线并设置样式
$line = new Line();
$line->setStartPoint($startX, $startY);
$line->setEndPoint($endX, $endY);
// 设置线条颜色为黑色
$line->getStyle()->getLine()->setColor(new Color(Color::COLOR_BLACK));
// 设置线条粗细
$line->getStyle()->getLine()->setWidth(2);

// 将直线添加到工作表
$worksheet->addShape($line);

// 保存Excel文件
$writer = new Xlsx($spreadsheet);
$writer->save('map.xlsx');

推荐的Laravel友好封装包

可以使用maatwebsite/laravel-excel(Laravel Excel),它基于PhpSpreadsheet开发,对Laravel做了更友好的封装,适合Laravel项目快速实现导出需求。

示例导出类代码

namespace App\Exports;

use Maatwebsite\Excel\Concerns\WithEvents;
use Maatwebsite\Excel\Events\AfterSheet;
use PhpOffice\PhpSpreadsheet\Worksheet\Shape\Line;
use PhpOffice\PhpSpreadsheet\Style\Color;
use PhpOffice\PhpSpreadsheet\Cell\Coordinate;

class MapExport implements WithEvents
{
    public function registerEvents(): array
    {
        return [
            AfterSheet::class => function(AfterSheet $event) {
                $worksheet = $event->sheet->getDelegate();

                // 定义要连接的单元格
                $startCell = 'B4';
                $endCell = 'F9';

                // 解析单元格列和行
                [$startCol, $startRow] = Coordinate::coordinateFromString($startCell);
                [$endCol, $endRow] = Coordinate::coordinateFromString($endCell);

                // 计算起点坐标
                $startX = 0;
                for ($col = 'A'; $col < $startCol; $col++) {
                    $startX += $worksheet->getColumnDimension($col)->getWidth() * 9.5;
                }
                $startY = 0;
                for ($row = 1; $row < $startRow; $row++) {
                    $startY += $worksheet->getRowDimension($row)->getRowHeight();
                }

                // 计算终点坐标
                $endX = 0;
                for ($col = 'A'; $col < $endCol; $col++) {
                    $endX += $worksheet->getColumnDimension($col)->getWidth() * 9.5;
                }
                $endY = 0;
                for ($row = 1; $row < $endRow; $row++) {
                    $endY += $worksheet->getRowDimension($row)->getRowHeight();
                }

                // 创建直线
                $line = new Line();
                $line->setStartPoint($startX, $startY);
                $line->setEndPoint($endX, $endY);
                $line->getStyle()->getLine()->setColor(new Color(Color::COLOR_BLACK));
                $line->getStyle()->getLine()->setWidth(2);

                $worksheet->addShape($line);

                // 设置单元格值
                $worksheet->setCellValue('A1', 'Cell 1');
                $worksheet->setCellValue('D4', 'Cell 2');
            },
        ];
    }
}

控制器中调用导出

use App\Exports\MapExport;
use Maatwebsite\Excel\Facades\Excel;

public function export()
{
    return Excel::download(new MapExport(), 'map.xlsx');
}

内容的提问来源于stack exchange,提问作者Mina Zakaria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 21:06:01