您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
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