您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
thinkphp6(thinkcmf6.0.7)导出excel(含单个单元格的多图导出)
发布时间:2024-01-31 19:50:26编辑:雪饮阅读()
-
其它东西都还挺好处理,唯独就是图片的水平居中于单元格内以及图片垂直居中于单元格内。
那么主要解决思路就是设置列宽,该列中所有单元格实际占用宽度,列宽默认单位和图片的宽的默认单位是不同的,图片的宽度设置没有定义单位的自定义,我猜测应该是px,于是我在列宽时候就按px进行计算的。
那么这样以来,最大列宽减去当前单元格中图片的宽度的差值除以2即可使其水平居中。
这里还有一个小坑就是按比例缩放需要关闭,否则设置的图片宽度会因为某个图片宽高差距过大,导致宽度溢出单元格外面去。
当然还有一个坑就是多图,不能直接放,需要设置具体偏移值,x,y方向的偏移值。否则会重叠。
那么具体实现如:
public function download_horse_list(){ $fid=farmid(); $keyword = input('keyword'); $type = input('type',''); $horse_list=HorseModel::where("fid",$fid) ->where("del",0) ->where(function (Query $query) use($keyword,$type) { if ($keyword) { $owner_id_list=MemberModel::where("realname",'like',"%$keyword%")->column("id"); $query->where(function($query) use ($keyword,$owner_id_list){ $query->whereOr('name|owner', 'like', "%$keyword%")->whereOr(function($q) use($owner_id_list){ $q->where("owner_id","in",$owner_id_list); }); }); } if(strlen($type)>0){ $query->where(function($query) use ($type){ $query->where('type', $type); }); } }) ->order("id desc") ->field("*,( SELECT expired_time FROM farm_livery_package_horse WHERE horse_id = g_horse.id ORDER BY id DESC LIMIT 1 ) AS Livery_expired_time") ->select(); $owner_max_field_width=0; $type_max_field_wiodth=0; $expire_max_date_field_width=0; $Profile_max_field_width=0; $img_width=200; $img_height=200; $rowHeight=210; if($horse_list){ $horse_list=$horse_list->toArray(); foreach($horse_list as $key=>&$val){ $Profile_decode=json_decode($val["avatar"],true); $Profile_list=[]; if(is_array($Profile_decode) && $Profile_decode){ foreach($Profile_decode as $skey=>$sval){ $img["http_url"]=$_SERVER["REQUEST_SCHEME"]."://".$_SERVER["HTTP_HOST"]."/upload/".$sval["url"]; $local_file_path=""; $c_local_file_path=$_SERVER["DOCUMENT_ROOT"]."/upload/".$sval["url"]; $imageNotFound_file_path=$_SERVER["DOCUMENT_ROOT"]."/static/images/imageNotFound.png"; if(file_exists($c_local_file_path)){ $local_file_path=$c_local_file_path; } else{ $local_file_path=$imageNotFound_file_path; $img["http_url"]=$_SERVER["REQUEST_SCHEME"]."://".$_SERVER["HTTP_HOST"]."/static/images/imageNotFound.png"; } $img["local_file_path"]=$local_file_path; /*$Profile_list[]*/; $Profile_list[]=$img; } } if(count($Profile_list)*$img_width>$Profile_max_field_width){ $Profile_max_field_width=count($Profile_list)*$img_width; } $real_owner=""; if($val["owner_id"]>0){ $member=MemberModel::where("id",$val["owner_id"])->find(); $real_owner=$member["realname"]; } else{ $real_owner=$val["owner"]; } $type_format=""; if(intval($val["type"])===1){ $type_format="Livery Horse"; } if(intval($val["type"])===2){ $type_format="School Horse"; } if(strlen($type_format)>$type_max_field_wiodth){ $type_max_field_wiodth=strlen($type_format); } $Livery_expired_time=$val["Livery_expired_time"] ? date("Y-m-d",$val["Livery_expired_time"]):""; if(strlen($Livery_expired_time)>$expire_max_date_field_width){ $expire_max_date_field_width=strlen($Livery_expired_time); } $status_format=""; if(intval($val["status"])===1){ $status_format="Ready"; } if(intval($val["status"])===2){ $status_format="Injuried"; } if(intval($val["status"])===3){ $status_format="Others"; } if(strlen($real_owner)>$owner_max_field_width){ $owner_max_field_width=strlen($real_owner); } $val["Profile"]=$Profile_list; $val["real_owner"]=$real_owner; $val["type_format"]=$type_format; $val["Livery_expired_time"]=$Livery_expired_time; $val["status_format"]=$status_format; } Log::write('本次horse Profile最大宽度:'.$Profile_max_field_width,'notice'); /*$data=[ [ "order_id"=>1, "order_room"=>2, "order_product"=>3, "order_money"=>4, "order_product_mun"=>5, "order_money_all"=>6, "create_time"=>7 ] ];*/ // 实例化 $spreadsheet = new Spreadsheet(); // 获取活动单元格 $sheet = $spreadsheet->getActiveSheet(); // 获取单元格 $cellA = $sheet->getCell('A1'); // 设置单元格的值 $cellA->setValue('Name'); // 设置 A 列 列宽 //$sheet->getColumnDimension('A')->setWidth(10); // 设置第一行 行高 // $sheet->getRowDimension(1)->setRowHeight(20); $cellB = $sheet->getCell('B1'); $cellB->setValue('Address'); // $sheet->getColumnDimension('B')->setWidth(20); $cellC = $sheet->getCell('C1'); $cellC->setValue('Profile'); /* 设置宽度。 每个列宽单位等于默认字体中一个字符的宽度。值为-1 告诉Excel以默认宽度显示此列。 默认情况下,这将是传递值的度量单位;但是此方法也接受 可选的度量单位参数,并将使用近似方法。 设置图片宽度200,实际宽度4.23厘米 因为图片宽按像素,列宽 */ $real_profile_max_field_width=4.24/200 * $Profile_max_field_width; /* * 400 * * */ //$sheet->getColumnDimension('C')->setAutoSize(true); /* * 小一号的黑体字符宽度大约是1.33厘米 * 小二号的黑体字符宽度大约是0.98 * 在宋体下,一个字符的宽度大约是0.48厘米 * * * */ /*$sheet->getColumnDimension('C')->setWidth($Profile_max_field_width*((1.33+0.98+0.48)/3));*/ /* $sheet->getColumnDimension('C')->setWidth($Profile_max_field_width*0.2);*/ /*$sheet->getColumnDimension('C')->setWidth("AUTO");*/ /* * * 设置默认列宽 可以使用以下代码设置默认列宽: $spreadsheet->getActiveSheet()->getDefaultColumnDimension()->setWidth(12); Excel 根据将以默认字体显示的字符数,以其自己的专有单位来测量列宽。 如果您想使用不同的 UoM(测量单位)设置默认列宽,则可以通过告诉 PhpSpreadsheet 您设置的宽度值的测量单位来实现。有效单位为(pt点)、px(像素) 、pc(异食癖)、in(英寸)、 cm(厘米)和mm(毫米)。 $spreadsheet->getActiveSheet()->getDefaultColumnDimension()->setWidth(400, 'pt'); * * * */ $sheet->getColumnDimension('C')->setWidth($Profile_max_field_width,"px"); $cellD = $sheet->getCell('D1'); $cellD->setValue('Owner'); $sheet->getColumnDimension('D')->setWidth($owner_max_field_width); $cellE = $sheet->getCell('E1'); $cellE->setValue('Type'); $sheet->getColumnDimension('E')->setWidth($type_max_field_wiodth); $ExpiredateTitle="Expire date"; $cellE = $sheet->getCell('F1'); $cellE->setValue('Expire date'); if(strlen($ExpiredateTitle)>$expire_max_date_field_width){ $expire_max_date_field_width=strlen($ExpiredateTitle); } $sheet->getColumnDimension('F')->setWidth($expire_max_date_field_width); $cellF = $sheet->getCell('G1'); $cellF->setValue('Status'); //$sheet->getColumnDimension('G')->setWidth(30); // 设置样式 标题 $styleArray = [ 'alignment' => [ 'horizontal' => 'center', //水平居中 'vertical' => 'center', //垂直居中 ], 'font' => [ 'name' => '黑体', 'bold' => false, 'size' => 10 ] ]; // 设置样式 正文 $styleArrayBody = [ 'alignment' => [ 'horizontal' => 'center', //水平居中 'vertical' => 'center', //垂直居中 ], 'font' => [ 'name' => '宋体', 'bold' => false, 'size' => 10 ] ]; // 应用样式 $sheet->getStyle('A1')->applyFromArray($styleArray); $sheet->getStyle('B1')->applyFromArray($styleArray); $sheet->getStyle('C1')->applyFromArray($styleArray); $sheet->getStyle('D1')->applyFromArray($styleArray); $sheet->getStyle('E1')->applyFromArray($styleArray); $sheet->getStyle('F1')->applyFromArray($styleArray); $sheet->getStyle('G1')->applyFromArray($styleArray); // 从 A2 开始填充数据 foreach ($horse_list as $k => $v) { $n = $k + 2; /* 设置行高。 @param float$height(以点数为单位)。值-1告诉Excel以默认高度显示此列。 默认情况下,这将是传递的参数值;但是这种方法也接受一个可选的度量单位 参数,并将传递的参数值转换为指定计量单位的点 */ $sheet->getRowDimension($n)->setRowHeight($rowHeight,"px"); // 获取单元格 $cellA = $sheet->getCell('A' . $n); $cellA->getAppliedStyle()->applyFromArray($styleArrayBody); // 设置单元格的值 $cellA->setValue($v['name']); $cellB = $sheet->getCell('B' . $n); $cellB->getAppliedStyle()->applyFromArray($styleArrayBody); $cellB->setValue($v['address']); /*$cellC = $sheet->getCell('C' . $n); $cellC->setValue($v['order_product']);*/ $cellC = $sheet->getCell('C' . $n); $cellC->getAppliedStyle()->applyFromArray($styleArrayBody); if($v["Profile"]){ foreach($v["Profile"] as $sk=>$sv){ $drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing(); $drawing->setWorksheet($sheet); $drawing->setPath($sv["local_file_path"]); $drawing->setResizeProportional(false); $drawing->setWidth($img_width);//图片宽 $drawing->setHeight($img_height);//图片高 $x_offset=0; if(count($v["Profile"])===1){ $x_offset=intval(($Profile_max_field_width-$img_width)/2); } else{ $x_offset=$sk*$img_width; } //设置图片水平偏移量 $drawing->setOffsetX($x_offset); //设置图片垂直偏移量 /*$verticalOffset =\bcdiv($sheet->getRowDimension($n)->getRowHeight()-$img_height,2,2);*/ /*$verticalOffset =intval(bcdiv($rowHeight-$img_height,2,2));*/ /*$verticalOffset =intval(($rowHeight-$img_height) / 2);*/ $verticalOffset =intval(($rowHeight-$img_height) / 2); $drawing->setOffsetY($verticalOffset); $drawing->setCoordinates('C' . $n);//将图片放置于单元格 } } $cellD = $sheet->getCell('D' . $n); $cellD->getAppliedStyle()->applyFromArray($styleArrayBody); $cellD->setValue($v['real_owner']); $cellE = $sheet->getCell('E' . $n); $cellE->getAppliedStyle()->applyFromArray($styleArrayBody); $cellE->setValue($v['type_format']); $cellF = $sheet->getCell('F' . $n); $cellF->getAppliedStyle()->applyFromArray($styleArrayBody); $cellF->setValue($v['Livery_expired_time']); $cellG = $sheet->getCell('G' . $n); $cellG->getAppliedStyle()->applyFromArray($styleArrayBody); $cellG->setValue($v['status_format']); } /*foreach ($sheet->getRowIterator($row) as $row) { $cell = $sheet->getCell($column . $row->getHashCode()); $width = $cell->getWidth(); if ($width > $maxWidth) { $maxWidth = $width; } }*/ // $sheet->getColumnDimension('C')->setWidth($Profile_max_field_width*0.2); $relative='horseList_'.date("YmdHis",time()).'.xlsx'; $file_name = $_SERVER["DOCUMENT_ROOT"]."/admin/export/".$relative; // 实例化导出类 /* header('Content-Type:application/vnd.ms-excel'); header('Content-Disposition:attachment;filename=' . $file_name); header('Cache-Control:max-age=0');*/ $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save($file_name); $excel_view_url=$_SERVER["REQUEST_SCHEME"]."://".$_SERVER["HTTP_HOST"]."/admin/export/".$relative; return json(["code"=>"success","excel_view_url"=>$excel_view_url]); } else{ return json(["code"=>"fail","msg"=>"no data"]); } }
关键字词:thinkphp6,thinkcmf6,excel,导出
上一篇:opencart如何安装语言包
下一篇:tol24.com14-4