Я пытался вставить гиперссылку в лист, но она только в текстовом формате. Как я могу вставить кликабельную гиперссылку?
Покажите нам, как вы это пробовали, пожалуйста, и, пожалуйста, нам автоматически предоставляется шаблон проблемы 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'
)
));
спасибо братан @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',
]],
];
}
Самый полезный комментарий
Полезное решение, но вы можете сделать его более понятным с рефакторингом
Использование, просто: