Laravel-excel: كيفية إدراج ارتباط تشعبي قابل للنقر في Excel؟

تم إنشاؤها على ٨ سبتمبر ٢٠١٦  ·  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 كومينتر

أظهر لنا كيف جربته من فضلك ويرجى لنا نموذج مشكلة جيثب مثل المقدم تلقائيًا.

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

أرغب في تكرار ما يزيد عن ورقة $ ، وتغيير خلية واحدة في كل صف (بخلاف الصف الأول) باستخدام عنوان URL. لقد جربت ما يصل إلى 3 حلقات foreach عميقة (ما زلت أتلقى خطأً يفيد بأن النتيجة هي كائن أو مصفوفة أو أحصل على "PHPExcel_Exception تنسيق خلية غير صالح CREATOR في Cell.php (السطر 590)" ، وحاولت $ sheet- > كل (والذي يبدو أنه طريقة متاحة فقط في التحميل في ملف لأنه من الخطأ عدم وجود طريقة لكل منهما).

setUrl ("sheet: // 'test'! 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');

أرغب في تكرار ما يزيد عن ورقة $ ، وتغيير خلية واحدة في كل صف (بخلاف الصف الأول) باستخدام عنوان URL. لقد جربت ما يصل إلى 3 حلقات foreach عميقة (ما زلت أتلقى خطأً يفيد بأن النتيجة هي كائن أو مصفوفة أو أحصل على "PHPExcel_Exception تنسيق خلية غير صالح CREATOR في Cell.php (السطر 590)" ، وحاولت $ sheet- > كل (والذي يبدو أنه طريقة متاحة فقط في التحميل في ملف لأنه من الخطأ عدم وجود طريقة لكل منهما).

حصلت هذا اليوم بعد النتائج ....

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

كيف عودة وحدة جمع رسائل الخطأ؟

مجرد ملاحظة سريعة لأي شخص قادم إلى هنا من google ، شكرًا mouyongAlexMcDee على الحل المقدم.

أثناء استخدام $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 التقييمات