Laravel-excel: Wie füge ich einen anklickbaren Hyperlink in Excel ein?

Erstellt am 8. Sept. 2016  ·  16Kommentare  ·  Quelle: Maatwebsite/Laravel-Excel

Ich habe versucht, einen Hyperlink in das Blatt einzufügen, aber es ist nur im Textformat. Wie kann ich anklickbare Hyperlinks einfügen?

Hilfreichster Kommentar

Wenn Sie v3.* verwenden, können Sie dies mögen, um einen Hyperlink zu setzen.

<?php
namespace App\Exports;

use Excel;
use Maatwebsite\Excel\Sheet;
use Maatwebsite\Excel\Events\AfterSheet;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithHeadings;
use PhpOffice\PhpSpreadsheet\Cell\Hyperlink;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;

class CommentsExport implements FromCollection, WithHeadings, WithMapping, ShouldAutoSize
{
    // ...
    public function custom()
    {
        Excel::extend(static::class, function (CommentsExport $export, Sheet $sheet) {
            /** <strong i="7">@var</strong> Worksheet $sheet */
            foreach ($sheet->getColumnIterator('H') as $row) {
                foreach ($row->getCellIterator() as $cell) {
                    if (str_contains($cell->getValue(), '://')) {
                        $cell->setHyperlink(new Hyperlink($cell->getValue(), '点击查看图片'));
                    }
                }
            }
        }, AfterSheet::class);
    }
    // ...
}

(new CommentsExport)->custom()); Excel::download(CommentsExport::class);

Hilfreiche Lösung, aber Sie können es mit Refactoring verständlicher machen

<?php
namespace App\Exports;

use Excel;
use Maatwebsite\Excel\Sheet;

// add event support
use Maatwebsite\Excel\Concerns\WithEvents;

use Maatwebsite\Excel\Events\AfterSheet;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithHeadings;
use PhpOffice\PhpSpreadsheet\Cell\Hyperlink;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;

class CommentsExport implements FromCollection, WithHeadings, WithMapping, ShouldAutoSize, WithEvents
{
    // ...
    /**
     * <strong i="13">@return</strong> array
     */
    public function registerEvents(): array
    {
        return [
            AfterSheet::class    => function(AfterSheet $event) {
                /** <strong i="14">@var</strong> Worksheet $sheet */
                foreach ($event->sheet->getColumnIterator('H') as $row) {
                    foreach ($row->getCellIterator() as $cell) {
                        if (str_contains($cell->getValue(), '://')) {
                            $cell->setHyperlink(new Hyperlink($cell->getValue(), 'Read'));

                             // Upd: Link styling added
                             $event->sheet->getStyle($cell->getCoordinate())->applyFromArray([
                                'font' => [
                                    'color' => ['rgb' => '0000FF'],
                                    'underline' => 'single'
                                ]
                            ]);
                        }
                    }
                }
            },
        ];
    }
    // ...
}

Verwendung, nur:

Excel::download(CommentsExport::class);

Alle 16 Kommentare

Zeigen Sie uns bitte, wie Sie es versucht haben, und verwenden Sie bitte die Github-Ausgabevorlage, die automatisch bereitgestellt wird.

   `$candidate; //Collection object from model
    foreach ($candidates as $key => $model) {
        if($model->grade == 'Z') {
            $model->grade="Reject";
        }
        $model->access_token=url('static-access/'.$model->access_token);`

Ich ersetze nur das access_token durch die vollständige URL. Konvertieren Sie dann das Sammlungsobjekt in ein Array wie unten,

    `foreach ($candidates as $candidate) {
        $candidatesArray[] = $candidate->toArray();
    }`

Erstellen Sie dann ein Blatt aus einem Array wie unten,

   `$sheet=$excel->sheet('sheet1', function($sheet) use ($candidatesArray,$jd) {
            $sheet->fromArray($candidatesArray, null, 'A1', false, false);
    });`

aus diesem Skript exportiert es tatsächlich Daten nach Bedarf, aber der Hyperlink wird als Textformat exportiert, nicht als anklickbarer Link. @PatrickBrouwers

Ich denke, Sie müssen es mit PHPExcel-nativen Methoden so machen:

$sheet->getCell('E26')
    ->getHyperlink()
    ->setUrl('http://examle.com/uploads/cv/' . $cellValue)
    ->setTooltip('Click here to access file');

https://github.com/PHPOffice/PHPExcel/blob/develop/Documentation/markdown/Overview/08-Recipes.md#change -a-cell-into-a-clickable-url

Danke @patrickbrouwers , aber setTooltip funktioniert nicht (leere Zelle).
Zumindest für die Version "maatwebsite/excel": "~2.1.0" .

Ich verwende setValue, um etwas als Text anzuzeigen.

Außerdem ist mein Text eine ID und wurde als numerisches Feld (mit E-Notation) interpretiert. Um es zu beheben verwende ich:

->setValueExplicit($fbId, PHPExcel_Cell_DataType::TYPE_STRING)

setTooltip ist der Text, der angezeigt wird, wenn Sie mit der Maus über die Zelle fahren. Sie müssen in der Tat setValue oder setValueExplicit tun, bevor Sie das verwenden.

Ich habe viel zu lange versucht, herauszufinden, warum in meiner Excel-Datei keine Links generiert wurden. Es stellt sich heraus, dass $sheet->cell("A1") und $sheet->getCell("A1") nicht dasselbe sind. Ich hatte viele Fälle, in denen ich etwas wie das Folgende tat:

$sheet->cell($cellLetter.$rowIndex, $url)
->getHyperlink()
->setUrl($url);

Was nicht funktionierte, aber auch keine Fehler generierte, wie z. B. Method [...] doesn't exist for ... . Ändern meines Codes zu:

$sheet->getCell($cellLetter.$rowIndex) // A1, B2
->setValueExplicit("Click Here", \PHPExcel_Cell_DataType::TYPE_STRING);

$sheet->getStyle($cellLetter.$rowIndex)
->applyFromArray($urlStyle); // Blue, Bold

$sheet->getCell($cellLetter.$rowIndex)
->getHyperlink()
->setUrl($url);

Mein Problem wurde gelöst. Könnte in Zukunft jemandem mit dem gleichen Problem helfen.

löse mein Problem, das ist mein Code

$sheet->getCell($cell) ->getHyperlink() ->setUrl($url); $sheet->getStyle($cell) ->applyFromArray(array( 'font' => array( 'color' => ['rgb' => '0000FF'], 'underline' => 'single' ) ));

screen shot 2017-07-19 at 2 47 40 pm

Danke Bruder @TimothyDLewis

@TimothyDLewis oder @herarya könnte ich Sie beunruhigen, wie Sie über das Blatt iterieren? - Vielleicht posten Sie einfach ein bisschen mehr Code für die vollständige Methode, die Sie verwendet haben? (dh $cellLetter.$rowIndex oder $cell bekommen?)

Ich exportiere ein einfaches Array mit 5 Spalten aus einer Datenbank, - dies ist ein Blatt und es hat eine Kopfzeile. Sobald ich es gepackt habe, habe ich diesen Code, der natürlich funktioniert:

//$trademark = [an array of data with 5 columns and a header row];
Excel::create('trademarks', function($excel) use($trademarks) {
  $excel->sheet('trademarks', function($sheet) use($trademarks) {
     $sheet->fromArray($trademarks,null,'A1',false,false);
     //need to iterate over $sheet, get each row, and find column 1 in that row and set a URL
})->export('xlsx');

Ich möchte über $sheet iterieren und eine Zelle in jeder Zeile (außer der ersten Zeile) mit einer URL ändern. Ich habe bis zu einer 3 tiefen Foreach-Schleife versucht (ich erhalte immer wieder eine Fehlermeldung, dass das Ergebnis ein Objekt, ein Array ist, oder ich bekomme "PHPExcel_Exception Ungültige Zellenkoordinate CREATOR in Cell.php (Zeile 590)", und ich habe versucht $sheet- >each (was anscheinend eine Methode ist, die nur beim Laden in eine Datei verfügbar ist, da es irrt, dass es keine Methode für jeden gibt).

setUrl("sheet://'test'!A1")
aber der Dateilink ist sheet://test!A1
warum?

Wenn Sie v3.* verwenden, können Sie dies mögen, um einen Hyperlink zu setzen.

<?php
namespace App\Exports;

use Excel;
use Maatwebsite\Excel\Sheet;
use Maatwebsite\Excel\Events\AfterSheet;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithHeadings;
use PhpOffice\PhpSpreadsheet\Cell\Hyperlink;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;

class CommentsExport implements FromCollection, WithHeadings, WithMapping, ShouldAutoSize
{
    // ...
    public function custom()
    {
        Excel::extend(static::class, function (CommentsExport $export, Sheet $sheet) {
            /** <strong i="6">@var</strong> Worksheet $sheet */
            foreach ($sheet->getColumnIterator('H') as $row) {
                foreach ($row->getCellIterator() as $cell) {
                    if (str_contains($cell->getValue(), '://')) {
                        $cell->setHyperlink(new Hyperlink($cell->getValue(), '点击查看图片'));
                    }
                }
            }
        }, AfterSheet::class);
    }
    // ...
}
(new CommentsExport)->custom());
Excel::download(CommentsExport::class);

Wenn Sie v3.* verwenden, können Sie dies mögen, um einen Hyperlink zu setzen.

<?php
namespace App\Exports;

use Excel;
use Maatwebsite\Excel\Sheet;
use Maatwebsite\Excel\Events\AfterSheet;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithHeadings;
use PhpOffice\PhpSpreadsheet\Cell\Hyperlink;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;

class CommentsExport implements FromCollection, WithHeadings, WithMapping, ShouldAutoSize
{
    // ...
    public function custom()
    {
        Excel::extend(static::class, function (CommentsExport $export, Sheet $sheet) {
            /** <strong i="7">@var</strong> Worksheet $sheet */
            foreach ($sheet->getColumnIterator('H') as $row) {
                foreach ($row->getCellIterator() as $cell) {
                    if (str_contains($cell->getValue(), '://')) {
                        $cell->setHyperlink(new Hyperlink($cell->getValue(), '点击查看图片'));
                    }
                }
            }
        }, AfterSheet::class);
    }
    // ...
}

(new CommentsExport)->custom()); Excel::download(CommentsExport::class);

Hilfreiche Lösung, aber Sie können es mit Refactoring verständlicher machen

<?php
namespace App\Exports;

use Excel;
use Maatwebsite\Excel\Sheet;

// add event support
use Maatwebsite\Excel\Concerns\WithEvents;

use Maatwebsite\Excel\Events\AfterSheet;
use Maatwebsite\Excel\Concerns\WithMapping;
use Maatwebsite\Excel\Concerns\WithHeadings;
use PhpOffice\PhpSpreadsheet\Cell\Hyperlink;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\ShouldAutoSize;
use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet;

class CommentsExport implements FromCollection, WithHeadings, WithMapping, ShouldAutoSize, WithEvents
{
    // ...
    /**
     * <strong i="13">@return</strong> array
     */
    public function registerEvents(): array
    {
        return [
            AfterSheet::class    => function(AfterSheet $event) {
                /** <strong i="14">@var</strong> Worksheet $sheet */
                foreach ($event->sheet->getColumnIterator('H') as $row) {
                    foreach ($row->getCellIterator() as $cell) {
                        if (str_contains($cell->getValue(), '://')) {
                            $cell->setHyperlink(new Hyperlink($cell->getValue(), 'Read'));

                             // Upd: Link styling added
                             $event->sheet->getStyle($cell->getCoordinate())->applyFromArray([
                                'font' => [
                                    'color' => ['rgb' => '0000FF'],
                                    'underline' => 'single'
                                ]
                            ]);
                        }
                    }
                }
            },
        ];
    }
    // ...
}

Verwendung, nur:

Excel::download(CommentsExport::class);

Du hast recht. das ist eine bessere Lösung als ich. @AlexMcDee

@TimothyDLewis oder @herarya könnte ich Sie beunruhigen, wie Sie über das Blatt iterieren? - Vielleicht posten Sie einfach ein bisschen mehr Code für die vollständige Methode, die Sie verwendet haben? (dh $cellLetter.$rowIndex oder $cell bekommen?)

Ich exportiere ein einfaches Array mit 5 Spalten aus einer Datenbank, - dies ist ein Blatt und es hat eine Kopfzeile. Sobald ich es gepackt habe, habe ich diesen Code, der natürlich funktioniert:

//$trademark = [an array of data with 5 columns and a header row];
Excel::create('trademarks', function($excel) use($trademarks) {
  $excel->sheet('trademarks', function($sheet) use($trademarks) {
     $sheet->fromArray($trademarks,null,'A1',false,false);
     //need to iterate over $sheet, get each row, and find column 1 in that row and set a URL
})->export('xlsx');

Ich möchte über $sheet iterieren und eine Zelle in jeder Zeile (außer der ersten Zeile) mit einer URL ändern. Ich habe bis zu einer 3 tiefen Foreach-Schleife versucht (ich erhalte immer wieder eine Fehlermeldung, dass das Ergebnis ein Objekt, ein Array ist, oder ich bekomme "PHPExcel_Exception Ungültige Zellenkoordinate CREATOR in Cell.php (Zeile 590)", und ich habe versucht $sheet- >each (was anscheinend eine Methode ist, die nur beim Laden in eine Datei verfügbar ist, da es irrt, dass es keine Methode für jeden gibt).

HABE DIES HEUTE nach Befunden bekommen....

https://stackoverflow.com/questions/41053636/laravel-excel-export-each-cell-style

wie das Sammelmodul für Fehlermeldungen zurückgeben?

Nur eine kurze Anmerkung für alle, die von Google hierher kommen, danke @mouyong @AlexMcDee für die bereitgestellte Lösung.

Bei der Verwendung $sheet->getColumnIterator('H') ist es wichtig, den zweiten Parameter anzugeben, nämlich die Endspalte $sheet->getColumnIterator('H', 'H') .

Ohne die Endspalte iteriert der Iterator über jede Spalte bis zur letzten Spalte .

Dies ist mir aufgefallen, als ich einen Hyperlink für eine Spalte in der Mitte des Blattes erstellen wollte, nicht wie üblich für die letzte Spalte.

Ein anderer Ansatz, dem ich schließlich gefolgt bin, ist die Verwendung der Hyperlink -Funktion von Excel.
Zum Beispiel wollte ich einen Hyperlink von Blatt2 zu Zellen auf Blatt1 (Bereich A1:A20) mit demselben Text erstellen:
In meinem Blatt2
public function array(): array { $data = [ ['Id'], ]; foreach ($this->data as $id) { $idformula = '=HYPERLINK("#"&CELL("address", INDEX(Sheet1!A1:A20, MATCH("'.$id.'",Sheet1!A1:A20,0), 1)),"'.$id.'")'; array_push($data, [$idformula]); } return $data; }
und um sie zu stylen:
public function styles(Worksheet $sheet) { return [ 'A' => ['font' => [ 'color' => ['rgb' => '0000FF'], 'underline' => 'single', ]], ]; }

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen