Saya mencoba memasukkan hyperlink di sheet, tetapi hanya dalam format teks. Bagaimana saya bisa memasukkan Hyperlink yang dapat diklik?
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'
)
));
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',
]],
];
}
Komentar yang paling membantu
Solusi yang membantu, tetapi Anda dapat melakukannya dengan lebih mudah dipahami dengan refactored
Penggunaan, cukup: