PHP导出EXCEL含合计行,设置单元格格式

news2024/11/26 4:50:49

PHP导出EXCEL含合计行,设置单元格格式,水平居中 垂直居中

public function exportSalary(Request $request)
    {
        //水平居中 垂直居中
        $styleArray = [
            'alignment' => [
                'horizontal' => Alignment::HORIZONTAL_CENTER,
                'vertical'   => Alignment::VERTICAL_CENTER
            ],
        ];
        //细边框
        $styleArray1 = [
            'borders' => [
                'allBorders' => [
                    'borderStyle' =>  Border::BORDER_THIN
                ]
            ]
        ];
        //右对齐 垂直居中
        $styleArray2 = [
            'alignment' => [
                'horizontal' => Alignment::HORIZONTAL_RIGHT,
                'vertical'   => Alignment::VERTICAL_CENTER
            ],
        ];
        $ym = $request->get('ym');
        $start_date = $ym . '-01 00:00:00';
        $month = date("Y年m月", strtotime($start_date));
        $paper_type = $request->paper_type;
        $type_id = isset($paper_type)?$paper_type:1;
        $flag = $type_id==2?'打样':'板房';
        $yyyymm = date('Y-m', strtotime($start_date));
        $data = $this->get_salary_data($yyyymm,$type_id);
        if($data){
            $name ='XXXX有限公司 (技术部)';
            $filename = $flag.'计件工资汇总表'.$ym;
            $title = $flag.'计件工资汇总表';
            $spreadsheet = new Spreadsheet();
            $sheet = $spreadsheet->getActiveSheet();
            $sheet->setTitle($title);
            $sheet->getColumnDimension('A')->setWidth(6);
            $sheet->getColumnDimension('B')->setWidth(8);
            $sheet->getColumnDimension('C')->setWidth(10);
            $sheet->getColumnDimension('D')->setWidth(10);
            $sheet->getColumnDimension('E')->setWidth(10);
            $sheet->getColumnDimension('F')->setWidth(10);
            $sheet->getColumnDimension('G')->setWidth(10);
            $sheet->getColumnDimension('H')->setWidth(10);
            $sheet->getColumnDimension('I')->setWidth(10);
            $sheet->getColumnDimension('J')->setWidth(10);
            $sheet->getColumnDimension('K')->setWidth(10);
            $sheet->getColumnDimension('L')->setWidth(10);
            $sheet->getColumnDimension('M')->setWidth(10);
            $sheet->getColumnDimension('N')->setWidth(10);
            $sheet->getColumnDimension('O')->setWidth(10);
            $sheet->getColumnDimension('P')->setWidth(15);
            //第一行
            $sheet->setCellValue('A1', $name);
            $sheet->mergeCells('A1:P1');
            $sheet->getStyle('A1:P1')->getFont()->setBold(true)->setName('Arial')->setSize(20);
            //第二行
            $sheet->setCellValue('A2', $month);
            $sheet->mergeCells('A2:B2');
            $sheet->setCellValue('C2', $title);
            $sheet->mergeCells('C2:P2');
            $sheet->getStyle('C2:P2')->getFont()->setBold(true)->setName('Arial')->setSize(18);
            $sheet->getStyle('A1:P2')->applyFromArray($styleArray);
            //第三行
            $sheet->setCellValue('A3', '序号');
            $sheet->mergeCells('A3:A4');
            $sheet->setCellValue('B3', '姓名');
            $sheet->mergeCells('B3:B4');
            $sheet->setCellValue('C3', '工资基数');
            $sheet->mergeCells('C3:F3');
            $sheet->setCellValue('G3', '薪资结算明细');
            $sheet->mergeCells('G3:L3');
            $sheet->setCellValue('M3', '出勤管理');
            $sheet->mergeCells('M3:N3');
            $sheet->setCellValue('O3', '发放合计');
            $sheet->mergeCells('O3:O4');
            $sheet->setCellValue('P3', '备注');
            $sheet->mergeCells('P3:P4');
            //第四行
            $sheet->setCellValue('C4', '底薪');
            $sheet->setCellValue('D4', '产量考核');
            $sheet->setCellValue('E4', '绩效考核');
            $sheet->setCellValue('F4', '综合收入');
            $sheet->setCellValue('G4', '及时率');
            $sheet->setCellValue('H4', '产量薪资');
            $sheet->setCellValue('I4', '绩效得分');
            $sheet->setCellValue('J4', '绩效薪资');
            $sheet->setCellValue('K4', '超产奖励');
            $sheet->setCellValue('L4', '点工');
            $sheet->setCellValue('M4', '出勤天数');
            $sheet->setCellValue('N4', '请假天数');

            $sheet->getStyle('G4')->getAlignment()->setWrapText(true);
            $sheet->getStyle('I4')->getAlignment()->setWrapText(true);
            $sheet->getRowDimension('1')->setRowHeight(28);
            $sheet->getRowDimension('2')->setRowHeight(25);
            $sheet->getRowDimension('3')->setRowHeight(23);
            $sheet->getRowDimension('4')->setRowHeight(30);
            //开始装数据
            $count = 5;
            foreach ($data as $key =>$value){
                $xh = $key + 1;
                $sheet->setCellValue('A'.$count, $xh);
                $sheet->setCellValue('B'.$count, $value['name']);//姓名
                $sheet->setCellValue('C'.$count, $value['basic_salary']);//底薪
                $sheet->setCellValue('D'.$count, $value['yield_basic_salary']);//产量考核
                $sheet->setCellValue('E'.$count, $value['merit_basic_salary']);//绩效考核
                $sheet->setCellValue('F'.$count, $value['all_basic_salary']);//综合收入
                $sheet->setCellValue('G'.$count, $value['timely_rate']/100); //及时率
                $sheet->setCellValue('H'.$count, $value['yield_salary']);//产量薪资
                $sheet->setCellValue('I'.$count, $value['merit_score']);//绩效得分
                $sheet->setCellValue('J'.$count, $value['merit_salary']); //绩效薪资
                $sheet->setCellValue('K'.$count, $value['over_salary']); //超产奖励
                $sheet->setCellValue('L'.$count, $value['timing_cut_salary']); //点工扣款
                $sheet->setCellValue('M'.$count, ""); //出勤天数
                $sheet->setCellValue('N'.$count, ""); //请假天数
                $sheet->setCellValue('O'.$count, $value['all_salary']); //发放合计
                $sheet->setCellValue('P'.$count, $value['remark']); //备注
                $sheet->getRowDimension($count)->setRowHeight(25);
                $count++;
            }

            $sheet->getStyle('A3:P'.($count))->applyFromArray($styleArray1)->applyFromArray($styleArray); //画上几线
            $sheet->getStyle('C5:O'.($count))->getNumberFormat()->setFormatCode("0.00");//保留小数2位
            $sheet->getStyle('A1:P2')->applyFromArray($styleArray);
            $sheet->getStyle('C5:O'.($count))->applyFromArray($styleArray2);//右对齐 垂直居中
            $sheet->getStyle('J5:O'.($count))->applyFromArray($styleArray2);//右对齐 垂直居中
            $sheet->getStyle('A3:P4')->getFont()->setBold(true);

            //合计行
            $sheet->setCellValue('A'.$count,'合计');
            $sheet->mergeCells('A'.$count.':B'.$count);
            $sheet->setCellValue('C'.$count,'=SUM(C5:C'.($count-1).')');
            $sheet->setCellValue('D'.$count,'=SUM(D5:D'.($count-1).')');
            $sheet->setCellValue('E'.$count,'=SUM(E5:E'.($count-1).')');
            $sheet->setCellValue('F'.$count,'=SUM(F5:F'.($count-1).')');
            $sheet->setCellValue('G'.$count,'=AVERAGE(G5:G'.($count-1).')');
            $sheet->setCellValue('H'.$count,'=SUM(H5:H'.($count-1).')');
            $sheet->setCellValue('I'.$count,'=AVERAGE(I5:I'.($count-1).')');
            $sheet->setCellValue('J'.$count,'=SUM(J5:J'.($count-1).')');
            $sheet->setCellValue('K'.$count,'=SUM(K5:K'.($count-1).')');
            $sheet->setCellValue('L'.$count,'=SUM(L5:L'.($count-1).')');
            $sheet->setCellValue('O'.$count,'=SUM(O5:O'.($count-1).')');
            //设置G列单元格格式为百分比0.00%
            $sheet->getStyle('G5:G'.$count)->getNumberFormat()->setFormatCode(\PHPExcel_Style_NumberFormat::FORMAT_PERCENTAGE_00);

            //最后一行
            $last_count = $count + 1;
            $sheet->setCellValue('A'.$last_count, '审批:');
            $sheet->mergeCells('A'.$last_count.':F'.$last_count);
            $sheet->setCellValue('G'.$last_count, '审核:');
            $sheet->mergeCells('G'.$last_count.':K'.$last_count);
            $sheet->setCellValue('L'.$last_count, '制表:');
            $sheet->mergeCells('L'.$last_count.':P'.$last_count);

            header('Content-Type:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
            header('Content-Disposition: attachment;filename="'.$filename.'.xlsx"');
            header('Cache-Control: max-age=0');
            ob_end_clean();
            $writer = IOFactory::createWriter($spreadsheet, 'Xlsx');
            $writer->save('php://output');
            exit;
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246894.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刷题计划 day22回溯(一)【组合】【组合总和 III】【电话号码的字母组合】

⚡刷题计划day22 回溯(一)开始,此期开启回溯专题,敬请期待关注,可以点个免费的赞哦~ 往期可看专栏,关注不迷路, 您的支持是我的最大动力🌹~ 目录 回溯算法理论基础 回溯法解决的…

Qt桌面应用开发 第六天(鼠标事件 定时器事件 定时器类 事件分发器 事件过滤器)

目录 1.1鼠标进入和离开enterEvent\leaveEvent 1.2鼠标按下释放和移动mousePressEvent\mouseReleaseEvent\mouseMoveEvent 1.3定时器事件timerEvent 1.4定时器类QTimer 1.5事件分发器event 1.6事件过滤器eventFilter 1.1鼠标进入和离开enterEvent\leaveEvent 事件&#x…

【Linux清空显存占用】Linux 系统中清理 GPU 显存

操作指令 # 查看NVIDIA GPU状态和进程 nvidia-smi # 查找所有包含"python"的进程 ps -ef | grep python # 强制结束进程号为3023的进程 kill -9 3023截图演示 在 Linux 系统中清理 GPU 显存可以采用以下方法: 1. 终止特定进程(常用方法&…

对撞双指针(七)三数之和

15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意:答案中不可以包含重复的三元组…

vue2-基础核心

vue简介 动态构建用户界面的渐进式 JavaScript 框架 vue的特点: 遵循MVVM模式 采用组件化模式,提高代码复用率,让代码更好维护 声明式编码,无需直接操作DOM,提高开发效率,编码简洁、体积小,运行效率高 本…

Prompting LLMs to Solve Complex Tasks: A Review

文章目录 题目简介任务分解未来方向结论 题目 促使 LLM 解决复杂任务: 综述 论文地址:https://www.intjit.org/cms/journal/volume/29/1/291_3.pdf 简介 大型语言模型 (LLM) 的最新趋势显而易见,这体现在大型科技公司的投资以及媒体和在线社…

反射、依赖注入

特性和依赖注入都是基于反射的,同时反射一般和接口配合着使用。 接口隔离原则 接口隔离原则:主张应该把客户端对一个类的需求分解成更小、更具体的接口,而不是提供一个包含所有功能的大接口。 接口中的需求是:乙方不能少给&am…

MT8768/MTK8768安卓核心板性能参数_联发科安卓智能模块开发方案

MT8768安卓核心板 是一款采用台积电12nm FinFET制程工艺的智能手机芯片。MT8768核心板不仅提供所有高级功能和出色体验,同时确保智能终端具备长电池寿命。该芯片提供了一个1600x720高清(20:9比例)分辨率显示屏,排除了清晰度和功耗之间的平衡问题。该芯片…

VBA技术资料MF229:以毫米为单位设置行高和列宽

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套,分为初级、中级、高级三大部分,教程是对VBA的系统讲解&#…

深入JMeter核心引擎:揭秘JmeterEngine、StandardJmeterEngine、ClientJmeterEngine与Remote的奥秘

引言 Apache JMeter是一款广泛使用的开源性能测试工具,它能够帮助开发者和测试人员模拟大量并发用户对应用程序进行负载测试。JMeter的强大功能和灵活性源于其精心设计的核心引擎。本文将深入探讨JMeter的核心引擎,包括JmeterEngine、StandardJmeterEng…

软件工程导论 选填题知识点总结

一 原型化方法是一种动态定义需求的方法,提供完整定义的需求不是原型化方法的特征,其特征包括尽快建立初步需求、简化项目管理以及加强用户参与和决策。 软件危机的表现包括用户对已完成的软件系统不满意的现象经常发生、软件产品的质量往往靠不住、软件…

Rust中Tracing 应用指南

欢迎来到这篇全面的Rust跟踪入门指南。Rust 的tracing是一个用于应用程序级别的诊断和调试的库。它提供了一种结构化的、异步感知的方式来记录日志和跟踪事件。与传统的日志记录相比,tracing能够更好地处理复杂的异步系统和分布式系统中的事件跟踪,帮助开…

机器学习实战:银行客户是否认购定期存款

项目结构与步骤 1. 项目概述 项目名称:葡萄牙银行电话营销活动分析与定期存款认购预测目标:通过分析银行的电话营销数据,构建模型预测客户是否会认购定期存款。数据来源:葡萄牙银行营销活动数据集关键挑战:数据不平衡…

服务器数据恢复—raid5阵列热备盘上线失败导致EXT3文件系统不可用的数据恢复案例

服务器数据恢复环境: 两组分别由4块SAS硬盘组建的raid5阵列,两组阵列划分的LUN组成LVM架构,格式化为EXT3文件系统。 服务器故障: 一组raid5阵列中的一块硬盘离线。热备盘自动上线替换离线硬盘,但在热备盘上线同步数据…

C++vector

Cvector是标准库中的一员,vector直译过来是“向量”、“矢量”的意思,在C中,是一个动态的数组容器,可以动态的开辟空间,自动实现内存的管理,不需要我们手动操作,在标准库中,写作一个…

“漫步北京”小程序及“气象景观数字化服务平台”上线啦

随着科技的飞速发展,智慧旅游已成为现代旅游业的重要趋势。近日,北京万云科技有限公司联合北京市气象服务中心,打造的“气象景观数字化服务平台“和“漫步北京“小程序已经上线,作为智慧旅游的典型代表,以其丰富的功能…

LlamaIndex+本地部署InternLM实践

LlamaIndex本地部署InternLM实践 XTuner是一个调整模型参数的小工具,通过对于给定的大模型输入有限的参数来调整同类型问题的结果输出 ‌LlamaIndex‌是一个将大语言模型(LLMs)和外部数据连接在一起的工具,主要用于增强大模型的知识获取能力…

【阵列信号处理】相干信号和非相干信号生成

文章目录 一、总结二、知识点相干(coherent)和非相干(incoherent)信号相干信号生成代码 相关信号(correlated signal)相关信号生成代码 正交信号定义 本文记录博主的科研日记。如果对博主的其他文章感兴趣&…

vue3项目部署在阿里云轻量应用服务器上

文章目录 概要整体部署流程技术细节小结 概要 vue3前端项目部署在阿里云轻量服务器 整体部署流程 首先有一个Vue3前端项目和阿里云应用服务器 确保环境准备 如果是新的服务器,在服务器内运行以下命令更新软件包 sudo apt update && sudo apt upgrade -y …

东土科技孵化的“网联汽车高速通信技术”前沿产品亮相2024WICV大会

2024世界智能网联汽车大会(WICV)于近日在北京召开。本次大会发布了由中国汽车工程学会组织全球200余位专家,联合评审遴选出未来十年对于智能网联汽车发展具有重要影响的十大技术趋势,包括“面向高级别自动驾驶的超级人工智能”“网…