Laravel-excel: Как в Excel вставить кликабельную гиперссылку?

Созданный на 8 сент. 2016  ·  16Комментарии  ·  Источник: Maatwebsite/Laravel-Excel

Я пытался вставить гиперссылку в лист, но она только в текстовом формате. Как я могу вставить кликабельную гиперссылку?

Самый полезный комментарий

при использовании v3.* вам может понравиться это, чтобы установить гиперссылку.

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

Полезное решение, но вы можете сделать его более понятным с рефакторингом

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

Использование, просто:

Excel::download(CommentsExport::class);

Все 16 Комментарий

Покажите нам, как вы это пробовали, пожалуйста, и, пожалуйста, нам автоматически предоставляется шаблон проблемы github.

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

Я просто заменяю access_token полным URL. Затем преобразование объекта коллекции в массив, как показано ниже,

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

Затем создайте лист из массива, как показано ниже,

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

из этого скрипта он фактически экспортирует данные по мере необходимости, но гиперссылка экспортируется в текстовом формате, а не как интерактивная ссылка. @патрикбрауэрс

Я думаю, вам нужно сделать это с помощью собственных методов 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-in-a-clickable-url

Спасибо @patrickbrouwers , но setTooltip не работает (пустая ячейка).
По крайней мере для версии "maatwebsite/excel": "~2.1.0" .

Я использую setValue, чтобы показать что-то в виде текста.

Кроме того, мой текст является идентификатором и интерпретируется как числовое поле (с обозначением E). Чтобы исправить это, я использую:

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

setTooltip — это текст, который отображается при наведении курсора на ячейку. Вам действительно нужно сделать setValue или setValueExplicit , прежде чем использовать это.

Я потратил слишком много времени, пытаясь понять, почему ссылки не генерируются в моем файле Excel. Оказывается, $sheet->cell("A1") и $sheet->getCell("A1") — это не одно и то же. У меня было много случаев, когда я делал что-то вроде следующего:

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

Что не работало, но и не вызывало никаких ошибок, таких как Method [...] doesn't exist for ... . Изменение моего кода на:

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

Решил мою проблему. Может поможет кому-то в будущем с такой же проблемой.

решить мою проблему, это мой код

$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

спасибо братан @TimothyDLewis

@TimothyDLewis или @herarya , могу я побеспокоить вас о том, как вы перебираете лист? - может быть, просто опубликуйте немного больше кода для полного метода, который вы использовали? (т.е. получить $cellLetter.$rowIndex или $cell ? )

Я экспортирую из базы данных простой массив с 5 столбцами — это один лист и строка заголовка. Как только я его хватаю, у меня есть этот код, который, конечно же, работает:

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

Я хотел бы перебрать $sheet и изменить одну ячейку в каждой строке (кроме первой строки) с помощью URL-адреса. Я пробовал до 3 глубоких циклов foreach (я продолжаю получать сообщение об ошибке, что результатом является объект, массив или я получаю «PHPExcel_Exception Неверная координата ячейки CREATOR в Cell.php (строка 590)», и я попробовал $sheet- > каждый (который, по-видимому, является методом, доступным только при загрузке в файл, поскольку ошибочно, что метода каждого нет).

setUrl("лист://'тест'!A1")
но ссылка на файл - sheet://test!A1
Зачем?

при использовании v3.* вам может понравиться это, чтобы установить гиперссылку.

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

при использовании v3.* вам может понравиться это, чтобы установить гиперссылку.

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

Полезное решение, но вы можете сделать его более понятным с рефакторингом

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

Использование, просто:

Excel::download(CommentsExport::class);

Ты прав. это лучшее решение, чем я. @АлексМакДи

@TimothyDLewis или @herarya , могу я побеспокоить вас о том, как вы перебираете лист? - может быть, просто опубликуйте немного больше кода для полного метода, который вы использовали? (т.е. получить $cellLetter.$rowIndex или $cell ? )

Я экспортирую из базы данных простой массив с 5 столбцами — это один лист и строка заголовка. Как только я его хватаю, у меня есть этот код, который, конечно же, работает:

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

Я хотел бы перебрать $sheet и изменить одну ячейку в каждой строке (кроме первой строки) с помощью URL-адреса. Я пробовал до 3 глубоких циклов foreach (я продолжаю получать сообщение об ошибке, что результатом является объект, массив или я получаю «PHPExcel_Exception Неверная координата ячейки CREATOR в Cell.php (строка 590)», и я попробовал $sheet- > каждый (который, по-видимому, является методом, доступным только при загрузке в файл, поскольку ошибочно, что метода каждого нет).

ПОЛУЧИЛ ЭТО СЕГОДНЯ после находок....

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

как вернуть модуль сбора сообщений об ошибках?

Небольшое примечание для всех, кто приходит сюда из Google. Спасибо @mouyong @AlexMcDee за предоставленное решение.

При использовании $sheet->getColumnIterator('H') важно указать второй параметр, который является конечным столбцом $sheet->getColumnIterator('H', 'H') .

Без конечного столбца итератор будет перебирать каждый столбец до последнего столбца .

Я заметил это, когда хотел сделать гиперссылку на столбец в середине листа, а не на последний столбец, как обычно.

Другой подход, который я выбрал, заключается в использовании функции гиперссылки Excel.
Например, я хотел создать гиперссылки с листа 2 на ячейки на листе 1 (диапазон A1: A20) с одинаковым текстом:
В моем листе2
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; }
и стилизовать их:
public function styles(Worksheet $sheet) { return [ 'A' => ['font' => [ 'color' => ['rgb' => '0000FF'], 'underline' => 'single', ]], ]; }

Была ли эта страница полезной?
0 / 5 - 0 рейтинги

Смежные вопросы

matthewslouismarie picture matthewslouismarie  ·  3Комментарии

contifico picture contifico  ·  3Комментарии

rossjcooper picture rossjcooper  ·  3Комментарии

amine8ghandi8amine picture amine8ghandi8amine  ·  3Комментарии

thearabbit picture thearabbit  ·  3Комментарии