主页

PHP数据导出表格资产登记,多工作表格和自定义样式插入图片

无愧任何分合   IP属地: 青海
0 点赞 0阅读 1551

导出效果

自定义表格排版和多工作表

代码:


<?php
require 'vendor/autoload.php';

use PhpOffice\PhpSpreadsheet\Spreadsheet;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use PhpOffice\PhpSpreadsheet\Style\Alignment;
use PhpOffice\PhpSpreadsheet\Style\Border;
use PhpOffice\PhpSpreadsheet\Style\Fill;

class xlsxclass {
	
	public function index($sqlData)
    {
        //$sql=model('goods')->order('number asc')->select();
        //$sqlData = collection($sql)->toArray();
        $grouped = [];
        foreach ($sqlData as $item) {
            $grouped[$item['brand']][] = $item;
        }
       
        
        // 设置表头样式
        $headerStyle = [
            'font' => [
                'bold' => true,
                'size' => 12,
            ],
            'alignment' => [
                'horizontal' => Alignment::HORIZONTAL_CENTER,
                'vertical' => Alignment::VERTICAL_CENTER,
            ],
            'fill' => [
                'fillType' => Fill::FILL_SOLID,
                'startColor' => ['argb' => 'FFC6EFCE'],
            ],
            'borders' => [
                'allBorders' => [
                    'borderStyle' => Border::BORDER_THIN,
                    'color' => ['argb' => 'FF000000'],
                ],
            ],
        ];
        
        // 设置数据样式
        $dataStyle = [
        	'font' => [
                'bold' => true,  // 添加这行来设置文字加粗
            ],
            'alignment' => [
                'horizontal' => Alignment::HORIZONTAL_JUSTIFY,
        		'vertical' => Alignment::VERTICAL_CENTER,
            ],
            'borders' => [
                'allBorders' => [
                    'borderStyle' => Border::BORDER_THIN,
                    'color' => ['argb' => 'FF000000'],
                ],
            ],
        ];
        // 创建新的Spreadsheet对象
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $numCount = 0;
        foreach ($grouped as $kk=>$vv) {
            if($numCount){
               $sheet2 =$spreadsheet->createSheet();
            }else{
               $sheet2 = $sheet; 
            }
            $numCount = $numCount+1;
            $sheet2->setTitle($kk);
            $arrABC=$this->arrHandle($vv);
            foreach ($arrABC as $key1 => $val1) {
            	foreach ($val1['mergeCells'] as $key2 => $val2) {
            		$sheet2->mergeCells($val2[0].':'.$val2[1]);
            		if(!$key2){
            			$sheet2->getStyle($val2[0].':'.$val2[1])->applyFromArray($headerStyle);
            		}else{
            			$sheet2->getStyle($val2[0].':'.$val2[1])->applyFromArray($dataStyle);
            		}
            		
            	}
            	
            	$sheet2->setCellValue($val1['setCellValue'][0], '北京好利来科技有限公司');
            	$sheet2->setCellValue($val1['setCellValue'][1], '资产名称:'.$val1['data']['brand']);
            	$sheet2->setCellValue($val1['setCellValue'][2], '资产编号:'.$val1['data']['number']);
            	$sheet2->setCellValue($val1['setCellValue'][3], '管理日期:'.$val1['data']['collection_time']);
            	$sheet2->setCellValue($val1['setCellValue'][4], '规格型号:'.$val1['data']['specification']);
            	
            	$sheet2->getColumnDimension($val1['letter'][0])->setWidth(8);
            	$sheet2->getColumnDimension($val1['letter'][1])->setWidth(8);
            	$sheet2->getColumnDimension($val1['letter'][2])->setWidth(8);
            	$sheet2->getColumnDimension($val1['letter'][3])->setWidth(13);
            	$sheet2->getColumnDimension($val1['letter'][4])->setWidth(2);
            	
            	foreach ($val1['number'] as $key3 => $val3) {
            		$sheet2->getRowDimension($val3)->setRowHeight(23);
            	}
            	//加载图片
				$isImg = $val1['data']['qrcode'];
            	$orImg = pathinfo($isImg);
            	//$isImg = ROOT_PATH.'public'.'/wxcode/wxcode_'.$val1['data']['id'].'.png';
                //$orImg = pathinfo($isImg);
            	if (isset($orImg['extension']) && (($orImg['extension'] == 'jpg') || ($orImg['extension'] == 'png') || ($orImg['extension'] == 'gif'))){
            		$drawing = new \PhpOffice\PhpSpreadsheet\Worksheet\Drawing();
            		$drawing->setName( 'Logo');
            		$drawing->setDescription( 'Logo');
            		$drawing->setPath($isImg);
            		$drawing->setWidth(80);
            		$drawing->setHeight(80);
            		$drawing->setCoordinates($val1['letter'][3] . $val1['number'][1]);
            		$drawing->setOffsetX(10);
            		$drawing->setOffsetY(23);
            		$drawing->setWorksheet($sheet2);
            // 		$sheet2->getStyle($val1['letter'][3] . $val1['number'][1])->applyFromArray($headerStyle);
            	}
            }
        }
        // 输出文件
        $writer = new Xlsx($spreadsheet);
        $filename = '资产信息表.xlsx';
        $writer->save($filename);
        
        // 下载文件
        header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
        header('Content-Disposition: attachment;filename="' . $filename . '"');
        header('Cache-Control: max-age=0');
        $writer->save('php://output');
        exit;
    }
    // 类的内容将在这里定义
	public function arrHandle($assets){
        $alphabet = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
        $loopValue = [0, 5, 10];
        $loopValueLength = count($loopValue);
        $Y = 0;
        $X = 4;
        $arrABC = [];
        $lengthX = 0;
        $lengthY = 6;
        $unmber = 0;
        $letterStatrt = 0;
        for ($i = 0; $i <= count($assets)-1; $i++) {
        	$letter = $loopValue[$i % $loopValueLength];
        	$arrABC[$i]['head'] = [$alphabet[$letter],$letter+1];
        	if(!$letter){
        		$unmber = $unmber+1;
        		$lengthX= ($lengthX+5);
        		$lengthY = ($unmber*5)-4;
        		$letterStatrt = 0;
        	}
        	$forStart = 1;
        	$qrArr = [];
        	$arrABC[$i]['data'] = $assets[$i];
        	for ($o = $lengthX-4; $o <= $lengthX; $o++) {
        		
        		if($forStart==1){
        			$arrABC[$i]['mergeCells'][] = [$alphabet[$letter].$o,$alphabet[$letter+3].($lengthY)];//头
        		}else if($forStart==2){
        			$arrABC[$i]['mergeCells'][] = [$alphabet[$letter].$o,$alphabet[$letter+2].($o)];//头
        			$qrArr[0] = $alphabet[$letter+3].$o;
        		}else if($forStart==3){
        			$arrABC[$i]['mergeCells'][] = [$alphabet[$letter].$o,$alphabet[$letter+2].($o)];//头
        		}else if($forStart==4){
        			$arrABC[$i]['mergeCells'][] = [$alphabet[$letter].$o,$alphabet[$letter+2].($o)];//头
        		}else if($forStart==5){
        			$arrABC[$i]['mergeCells'][] = [$alphabet[$letter].$o,$alphabet[$letter+2].($o)];//头
        			$qrArr[1] = $alphabet[$letter+3].$o;
        		}else if($forStart==6){
        			$arrABC[$i]['mergeCells'][] = [$alphabet[$letter].$o,$alphabet[$letter+2].($o)];//头
        			
        		}else{
        			
        		}
        		$arrABC[$i]['setCellValue'][] = $alphabet[$letter].$o;
        		$arrABC[$i]['letter'][] = $alphabet[$letterStatrt];
        		$arrABC[$i]['number'][] = $o;
        		$letterStatrt = $letterStatrt+1;
        		//print_r($qrArr);
        		if(count($qrArr)==2){
        			$arrABC[$i]['mergeCells'][] = $qrArr;
        		}
        		$forStart++;
        		
        	}
        	
        }
        // print_r($arrABC);
        return $arrABC;
    }
}

$xlsxclass = new xlsxclass();
//生成测试数据
$sqlData = [];
$brand = ['台式机','笔记本','一体机'];
for($i=0;$i<=20;$i++){
	    $arr = [
            "id"=> $i+1, 
            "number"=> "XY-BJB0".$i, 
            "name"=> "测试名称".$i, 
            "good_name"=> "联想", 
            "section"=> "财务部", 
            "brand"=> $brand[array_rand($brand)], 
            "category"=> "联想", 
            "specification"=> "联想Y700", 
            "status"=> 1, 
            "images"=> [
                "/uploads\/20230829\/d61391a4c83ced7378aea3c60d52e546.jpg"
            ], 
            "remark"=> "", 
            "situation"=> "", 
            "qrcode"=> "wxcode_20.png", 
            "collection_time"=> "", 
            "createtime"=> 1693298539, 
            "updatetime"=> 1718940889, 
            "deletetime"=> null
        ];
        $sqlData[] = $arr;
}
print_r($xlsxclass->index($sqlData));
?>


源代码:下载地址

© 著作权归作者所有,转载或内容合作请联系作者