Laravel-excel: ¿Cómo insertar un hipervínculo en el que se puede hacer clic en Excel?

Creado en 8 sept. 2016  ·  16Comentarios  ·  Fuente: Maatwebsite/Laravel-Excel

Intenté insertar un hipervínculo en la hoja, pero solo está en formato de texto. ¿Cómo puedo insertar un hipervínculo en el que se puede hacer clic?

Comentario más útil

cuando use v3.*, le puede gustar esto para establecer un hipervínculo.

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

Solución útil, pero puede hacerlo más comprensible con refactorizado

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

Uso, solo:

Excel::download(CommentsExport::class);

Todos 16 comentarios

Muéstrenos cómo lo probó y envíenos la plantilla de problema de github como se proporciona automáticamente.

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

Solo estoy reemplazando access_token con la URL completa. Luego, convirtiendo el objeto de colección en una matriz como se muestra a continuación,

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

Luego, creando una hoja a partir de una matriz como se muestra a continuación,

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

de este script, en realidad exporta datos según sea necesario, pero el hipervínculo se exporta como formato de texto, no como enlace en el que se puede hacer clic. @patrickbrouwers

Creo que tienes que hacerlo así con los métodos nativos de 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

Gracias @patrickbrouwers , pero setTooltip no funciona (celda vacía).
Al menos para la versión "maatwebsite/excel": "~2.1.0" .

Estoy usando setValue para mostrar algo como texto.

Además, mi texto es una identificación y se interpretó como un campo numérico (con notación E). Para arreglarlo estoy usando:

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

setTooltip es el texto que se muestra si pasa el cursor sobre la celda. De hecho, debe hacer setValue o setValueExplicit antes de usar eso.

Pasé demasiado tiempo tratando de averiguar por qué los enlaces no se generaban en mi archivo de Excel. Resulta que $sheet->cell("A1") y $sheet->getCell("A1") no son lo mismo. Tuve muchos casos en los que estaba haciendo algo como lo siguiente:

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

Lo cual no funcionaba, pero tampoco generaba ningún error, como Method [...] doesn't exist for ... . Cambiando mi código a:

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

Resolvió mi problema. Podría ayudar a alguien en el futuro con el mismo problema.

resuelve mi problema, este es mi código

$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

gracias hermano @TimothyDLewis

@TimothyDLewis o @herarya , ¿puedo molestarte por cómo estás iterando sobre la hoja? - ¿Tal vez solo publique un poco más de código en cuanto al método completo que usó? (es decir, obtener $cellLetter.$rowIndex o $cell ?)

Estoy exportando una matriz simple que tiene 5 columnas de una base de datos: esta es una hoja y tiene una fila de encabezado. Una vez que lo agarro, tengo este código que funciona, por supuesto:

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

Me gustaría iterar sobre $ hoja y cambiar una celda en cada fila (que no sea la primera fila) con una URL. He intentado hasta un bucle foreach de 3 profundidades (sigo recibiendo un error de que el resultado es un objeto, una matriz o aparece "PHPExcel_Exception Coordenada de celda no válida CREADOR en Cell.php (línea 590)", y probé $ hoja- >cada uno (que aparentemente es un método disponible solo al cargar un archivo, ya que es un error que no haya ningún método cada uno).

setUrl("hoja://'prueba'!A1")
pero el enlace del archivo es sheet://test!A1
¿por qué?

cuando use v3.*, le puede gustar esto para establecer un hipervínculo.

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

cuando use v3.*, le puede gustar esto para establecer un hipervínculo.

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

Solución útil, pero puede hacerlo más comprensible con refactorizado

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

Uso, solo:

Excel::download(CommentsExport::class);

Tienes razón. esta es una mejor solución que yo. @AlexMcDee

@TimothyDLewis o @herarya , ¿puedo molestarte por cómo estás iterando sobre la hoja? - ¿Tal vez solo publique un poco más de código en cuanto al método completo que usó? (es decir, obtener $cellLetter.$rowIndex o $cell ?)

Estoy exportando una matriz simple que tiene 5 columnas de una base de datos: esta es una hoja y tiene una fila de encabezado. Una vez que lo agarro, tengo este código que funciona, por supuesto:

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

Me gustaría iterar sobre $ hoja y cambiar una celda en cada fila (que no sea la primera fila) con una URL. He intentado hasta un bucle foreach de 3 profundidades (sigo recibiendo un error de que el resultado es un objeto, una matriz o aparece "PHPExcel_Exception Coordenada de celda no válida CREADOR en Cell.php (línea 590)", y probé $ hoja- >cada uno (que aparentemente es un método disponible solo al cargar un archivo, ya que es un error que no haya ningún método cada uno).

TENGO ESTO HOY después de los hallazgos....

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

¿Cómo devolver el módulo de recopilación de mensajes de error?

Solo una nota rápida para cualquiera que venga aquí desde Google, gracias @mouyong @AlexMcDee por la solución proporcionada.

Al usar $sheet->getColumnIterator('H') , es importante especificar el segundo parámetro, que es la columna final $sheet->getColumnIterator('H', 'H') .

Sin la columna final, el iterador iterará sobre cada columna hasta la última columna .

Me di cuenta de esto cuando quería hacer un hipervínculo para una columna en el medio de la hoja, no la última columna como de costumbre.

Otro enfoque, que terminé siguiendo, es usar la función de hipervínculo de Excel.
Por ejemplo, quería crear hipervínculos desde la hoja 2 a las celdas de la hoja 1 (rango A1: A20) con el mismo texto:
en mi hoja2
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; }
y para darles estilo:
public function styles(Worksheet $sheet) { return [ 'A' => ['font' => [ 'color' => ['rgb' => '0000FF'], 'underline' => 'single', ]], ]; }

¿Fue útil esta página
0 / 5 - 0 calificaciones