您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
Task相关的数据结构及关系定义(laravel11的导出excel附带图片)
发布时间:2024-11-05 20:36:05编辑:雪饮阅读()
-
在构建 Web 应用程序时,您可能有一些任务(例如解析和存储上传的 CSV 文件),这些任务在典型的 Web 请求期间需要很长时间才能完成。值得庆幸的是,Laravel 允许您轻松创建可在后台处理的排队作业。通过将时间密集型任务移动到队列中,您的应用程序可以以极快的速度响应 Web 请求,并为您的客户提供更好的用户体验。
Laravel 队列在各种不同的队列后端上提供统一的排队 API,例如亚马逊 SQS,雷迪斯,甚至是关系数据库。
Laravel 的队列配置选项存储在应用程序的配置文件中。在此文件中,您将找到框架中包含的每个队列驱动程序的连接配置,包括数据库、config/queue.php亚马逊 SQS,雷迪斯和豆茎驱动程序,以及将立即执行作业的同步驱动程序(用于本地开发)。还包括一个队列驱动程序,用于丢弃排队的作业。null
Laravel 现在提供 Horizon,这是一个漂亮的仪表板和配置系统,适用于您的 Redis 支持的队列。查看完整内容Horizon 文档了解更多信息。
那么这里就先建立一个比较耗时的传统web请求,就以导出excel为例
首先安装依赖
./vendor/bin/sail composer require phpoffice/phpexcel
./vendor/bin/sail composer require phpoffice/phpspreadsheet
然后由于我们导出项目的图像的时候是图片,是需要知道图片的路径的,根据我们之前的环境,这里应该是需要文件系统的路径,而不是之前数据库中存储的访问路径,且laravel是做了一些限制,如果直接file_get_contents时候好像是不能,所以最见到的就是项目创建的同时就记录图像的文件系统路径。
这里就是所谓的今天所说的Task相关的数据结构要调整了。
alter table project add column `avatar_fs_path` char(100) NOT NULL;
那么project模型我还想实现一个categoryInfo的hasOne关联
public function categoryInfo(): HasOne
{
return $this->hasOne(project_category::class,"id","category");
}
因为我发现如果我不以inertia响应时候,category关联和project本身的字段category情况下,with的时候其实还是project的category,也就是分类id,而并没有返回关联模型关联到的category对象。
所以ProjectRepository中的update方法中需要也添加保存图像相对于文件系统的路径的逻辑
public function update($request)
{
$id=$request->input("id");
$project=new Project();
if($id){
$project=Project::find($id);
if (! Gate::allows('update-post', $project)) {
abort(403);
}
}
$file=$request->file('avatar');
if($file){
$path=$file->store('','public');
$fsPath=Storage::disk('public')->path($path);
$url = Storage::url($path);
$project->avatar=$url;
$project->avatar_fs_path=$fsPath;
}
if(!$file){
$project->avatar="/images/1.gif";
$avatar=$request->input("avatar");
if($avatar){
$project->avatar=$avatar;
}
}
$uid=$request->user()->id;
$name=$request->input("name");
$category=$request->input("category");
$project->uid=$uid;
$project->name=$name;
$project->category=$category;
$project->save();
}
那么接下来咱们实现project中导出excel的逻辑如:
public function export(Request $request){
$spreadsheet = new Spreadsheet();
$sheet = $spreadsheet->getActiveSheet();
$projects=Project::with(["user","categoryInfo"])->orderBy('id',"desc")->get();
$sheet->setCellValue('A1', 'ID');
$sheet->setCellValue('B1', '项目名称');
$sheet->setCellValue('C1', '项目封面');
$sheet->setCellValue('D1', '所属用户');
$sheet->setCellValue('E1', '所属分类');
$lastColumnWidth=null;
foreach ($projects as $key=>$val){
$currentRowNum=$key+2;
$sheet->setCellValue('A'.$currentRowNum, $val->id);
$sheet->setCellValue('B'.$currentRowNum, $val->name);
//echo $val->avatar."<br/>";
// 使用正则表达式匹配文件名
$avatarPath=null;
$tmpNames=[];
if($val->avatar_fs_path){
echo "正在绘制图像<br/>";
$drawing = new Drawing();
$drawing->setName('Sample Image');
$drawing->setDescription('Sample Image Description');
$drawing->setPath($val->avatar_fs_path); // 这里是你的图片路径
// 图片高度,单位为像素
//$drawing->setHeight(100);
// 图片宽度,单位为像素
// $drawing->setWidth(100);
$drawing->setCoordinates('C'.$currentRowNum); // 图片插入的单元格位置
$drawing->setWorksheet($sheet);
// 获取图片的尺寸
list($imageWidth, $imageHeight) = getimagesize($val->avatar_fs_path);
// 调整列宽以适应图片(这里假设图片在C列)
// 注意:Excel的列宽单位是以字符的1/256为单位的,这里我们将像素宽度转换为Excel的列宽单位
// 通常,一个字符的宽度大约是7像素(这取决于字体和字号),但这里我们为了简化,使用一个近似的转换比例
// 你可能需要根据实际情况调整这个比例
// 假设字符宽度为7像素,并除以10来得到一个较宽的列(这是一个近似值)
$excelColumnWidth = ($imageWidth / 1) * 256 / 10;
$excelColumnWidth=4*7;
if($lastColumnWidth==null || $excelColumnWidth>$lastColumnWidth){
$sheet->getColumnDimension('C')->setWidth($excelColumnWidth);
}
}
if($val->user){
$sheet->setCellValue('D'.$currentRowNum, $val->user->name);
}
if($val->categoryInfo){
$sheet->setCellValue('E'.$currentRowNum, $val->categoryInfo->name);
}
}
$sheet->setTitle('Demo Sheet');
$writer = new Xlsx($spreadsheet);
$filename = "excel/".date("Y_m_d_H_i_s").'.xlsx';
$writer->save($filename);
return "导出成功:".$filename;
}
也别忘了添加路由
Route::get('/project/export', [ProjectController::class, 'export'])->name('project.export');
那么最后访问导出url如:
http://localhost/project/export
导出excel如
这种怎么解决?图片宽度和高度都超过了单元格宽高,但单元格宽高不自动撑开,也不挤压图片让图片正好缩放。。。暂时还没有找到更好的办法。
本期词汇
Scheme:计划,方案
Gracefully:优雅地;温文地
Horizon:地平线;眼界
关键字词:
相关文章
-
无相关信息