Laravel-excel: Bagaimana cara memasukkan hyperlink yang dapat diklik di excel?

Dibuat pada 8 Sep 2016  ·  16Komentar  ·  Sumber: Maatwebsite/Laravel-Excel

Saya mencoba memasukkan hyperlink di sheet, tetapi hanya dalam format teks. Bagaimana saya bisa memasukkan Hyperlink yang dapat diklik?

Komentar yang paling membantu

saat menggunakan v3.*, Anda dapat menyukai ini untuk mengatur tautan hiper.

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

Solusi yang membantu, tetapi Anda dapat melakukannya dengan lebih mudah dipahami dengan refactored

<?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'
                                ]
                            ]);
                        }
                    }
                }
            },
        ];
    }
    // ...
}

Penggunaan, cukup:

Excel::download(CommentsExport::class);

Semua 16 komentar

Tunjukkan pada kami bagaimana Anda mencobanya dan tolong beri kami templat masalah github seperti yang disediakan secara otomatis.

   `$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);`

Saya baru saja mengganti access_token dengan URL lengkap. Kemudian konversi objek koleksi menjadi array seperti di bawah ini,

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

Kemudian buat sheet dari array seperti di bawah ini,

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

dari skrip ini sebenarnya mengekspor data sesuai kebutuhan tetapi hyperlink diekspor sebagai format teks bukan sebagai tautan yang dapat diklik. @patrickbrouwers

Saya pikir Anda harus melakukannya seperti ini dengan metode asli PHPExcel:

$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

Terima kasih @patrickbrouwers , tetapi setTooltip tidak berfungsi (sel kosong).
Setidaknya untuk versi "maatwebsite/excel": "~2.1.0" .

Saya menggunakan setValue untuk menampilkan sesuatu sebagai teks.

Selain itu, teks saya adalah ID dan ditafsirkan sebagai bidang numerik (dengan notasi E). Untuk memperbaikinya saya menggunakan:

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

setTooltip adalah teks yang ditampilkan jika Anda mengarahkan kursor ke sel. Anda memang perlu melakukan setValue atau setValueExplicit sebelum menggunakannya.

Saya menghabiskan waktu terlalu lama untuk mencari tahu mengapa tautan tidak dibuat di file Excel saya. Ternyata $sheet->cell("A1") dan $sheet->getCell("A1") tidak sama. Saya memiliki banyak contoh di mana saya melakukan sesuatu seperti berikut:

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

Yang tidak berfungsi, tetapi juga tidak menghasilkan kesalahan apa pun, seperti Method [...] doesn't exist for ... . Mengubah kode saya menjadi:

$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);

Memecahkan masalah saya. Mungkin membantu seseorang di masa depan dengan masalah yang sama.

selesaikan masalah saya, ini kode saya

$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

terima kasih gan @TimothyDLewis

@TimothyDLewis atau @herarya dapatkah saya menyusahkan Anda tentang bagaimana Anda mengulangi lembar itu? - mungkin hanya memposting sedikit lebih banyak kode untuk metode lengkap yang Anda gunakan? (yaitu mendapatkan $cellLetter.$rowIndex atau $cell ? )

Saya mengekspor array sederhana yang memiliki 5 kolom dari database, - ini adalah satu lembar dan memiliki baris header. Setelah saya mengambilnya, saya memiliki kode ini yang tentu saja berfungsi:

//$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');

Saya ingin mengulangi lebih dari $sheet, dan mengubah satu sel di setiap baris (selain baris pertama) dengan URL. Saya telah mencoba hingga 3 loop foreach dalam (saya terus mendapatkan kesalahan bahwa hasilnya adalah objek, array atau saya mendapatkan "PHPExcel_Exception CREATOR koordinat sel tidak valid di Cell.php (baris 590)", dan saya mencoba $sheet- >each (yang tampaknya merupakan metode yang hanya tersedia dalam memuat dalam file karena kesalahan bahwa tidak ada metode masing-masing).

setUrl("sheet://'test'!A1")
tetapi tautan file adalah sheet://test!A1
mengapa?

saat menggunakan v3.*, Anda dapat menyukai ini untuk mengatur tautan hiper.

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

saat menggunakan v3.*, Anda dapat menyukai ini untuk mengatur tautan hiper.

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

Solusi yang membantu, tetapi Anda dapat melakukannya dengan lebih mudah dipahami dengan refactored

<?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'
                                ]
                            ]);
                        }
                    }
                }
            },
        ];
    }
    // ...
}

Penggunaan, cukup:

Excel::download(CommentsExport::class);

Kamu benar. ini adalah solusi yang lebih baik dari saya. @AlexMcDee

@TimothyDLewis atau @herarya dapatkah saya menyusahkan Anda tentang bagaimana Anda mengulangi lembar itu? - mungkin hanya memposting sedikit lebih banyak kode untuk metode lengkap yang Anda gunakan? (yaitu mendapatkan $cellLetter.$rowIndex atau $cell ? )

Saya mengekspor array sederhana yang memiliki 5 kolom dari database, - ini adalah satu lembar dan memiliki baris header. Setelah saya mengambilnya, saya memiliki kode ini yang tentu saja berfungsi:

//$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');

Saya ingin mengulangi lebih dari $sheet, dan mengubah satu sel di setiap baris (selain baris pertama) dengan URL. Saya telah mencoba hingga 3 loop foreach dalam (saya terus mendapatkan kesalahan bahwa hasilnya adalah objek, array atau saya mendapatkan "PHPExcel_Exception CREATOR koordinat sel tidak valid di Cell.php (baris 590)", dan saya mencoba $sheet- >each (yang tampaknya merupakan metode yang hanya tersedia dalam memuat dalam file karena kesalahan bahwa tidak ada metode masing-masing).

DAPAT HARI INI setelah temuan ....

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

bagaimana mengembalikan modul pengumpulan pesan kesalahan?

Hanya catatan singkat untuk siapa pun yang datang ke sini dari google, Terima kasih @mouyong @AlexMcDee untuk solusi yang diberikan.

Saat menggunakan $sheet->getColumnIterator('H') , penting untuk menentukan parameter kedua, yang merupakan kolom akhir $sheet->getColumnIterator('H', 'H') .

Tanpa kolom akhir, iterator akan mengulangi setiap kolom hingga kolom terakhir .

Saya perhatikan ini ketika saya ingin membuat hyperlink untuk kolom di tengah lembar bukan kolom terakhir seperti biasanya.

Pendekatan lain, yang akhirnya saya ikuti, adalah dengan menggunakan fungsi hyperlink Excel.
Misalnya saya ingin membuat hyperlink dari sheet2 ke sel pada sheet1 (rentang A1:A20) yang memiliki teks yang sama:
Di lembar saya2
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; }
dan untuk menatanya:
public function styles(Worksheet $sheet) { return [ 'A' => ['font' => [ 'color' => ['rgb' => '0000FF'], 'underline' => 'single', ]], ]; }

Apakah halaman ini membantu?
0 / 5 - 0 peringkat