讨论数量:
@ltw_phper 我最近遇到同样的需求,前期设计实现方案时写了一个 demo,有些细节还待完善,仅供参考。
<?php
...
public function import(string $file_path)
{
$list = [];
Excel::selectSheetsByIndex(0)->load(
$file_path,
function ($reader) use (&$list) {
$list = $this->appendImageForSheetData(
$reader->getSheet(0),
$reader->get()->toArray(),
'商品图片'
);
}
);
...
}
...
/**
* 为 excel 工作表数据集追加图片列
*
* @param PHPExcel_Worksheet $excel_worksheet
* @param array $sheet_data
* @param string $image_column_name
* @param string|null $save_dir
*
* @return array
*/
protected function appendImageForSheetData(
PHPExcel_Worksheet $excel_worksheet,
array $sheet_data,
string $image_column_name,
string $save_dir = null
): array {
$save_dir = $save_dir ?? 'excel_image/' . date('Ymd') . '/' ;
//从 excel 读取器中读取图片集合,依次循环每张图片,将其保存到磁盘后,再把图片保存路径追加到 excel 数据集中
foreach ($excel_worksheet->getDrawingCollection() as $drawing) {
if (!$drawing instanceof PHPExcel_Worksheet_Drawing) {
continue;
}
//确定图片所在的行号
preg_match('/\d+$/', $drawing->getCoordinates(), $row);
$row = ($row[0] ?? 0) - 2;
if (!isset($sheet_data[$row])) {
continue;
}
//获取图片资源并保存到磁盘
$file_name = Str::random(32). '.'. $drawing->getExtension();
$file_save_path = $save_dir . $file_name;
if (!Storage::disk('local')
->put(
$file_save_path,
file_get_contents($drawing->getPath())
)
) {
continue;
}
//将图片路径追加到 excel sheet 数据集
$sheet_data[$row][$image_column_name] = $file_save_path;
}
return $sheet_data;
}
推荐文章: