php 使用phpoffice導出導出excel

荊軻刺秦王

在PHP中,可以使用 PhpSpreadsheet 庫來創建和導出Excel文件。PhpSpreadsheet 是一個純PHP 編寫的組件庫,它使用現代 PHP 寫法,代碼質量和性能比 PHPExcel 高不少,完全可以替代PHPExcel(PHPExcel已不再維護)。使用 PhpSpreadsheet 可以輕松讀取和寫入Excel文檔,支持Excel的所有操作。PhpSpreadsheet 是 PHPExcel 的下一個版本,

首先,通過 Composer 安裝 PhpSpreadsheet 庫:

composer require phpoffice/phpspreadsheet

需要注意的是,具體引入那個適合自己的版本

PhpSpreadsheet 1.x 系列:這個版本系列是基于 PHP 5.x 的。

PhpSpreadsheet 2.x 系列:這是第一個支持 PHP 7.x 的版本,引入了許多性能改進和新功能。

當然最新的版本已經支持到了php8 這里不做說明。

如果想指定版本則可以,以我本地的 php 5.6 為例:

composer require phpoffice/phpspreadsheet:^1.5

需要注意的是:phpoffice 必須要用 composer 安裝,這也更加符合規范,不可以將本地文件夾復制到服務器環境,這是不生效的。

使用起來就更加輕松:

use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Spreadsheet;

結合實際案例,本次的需求是部分列 如果沒有數據(合計為0,則不顯示):

/*** @return void* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception* @throws \think\db\exception\DataNotFoundException* @throws \think\db\exception\ModelNotFoundException* @throws \think\exception\DbException* */public function ext_hr_tb(){$year_month=$_SESSION['hr_trim']['year_month'];$year=date('Y',strtotime($year_month));$month=(int)date('m',strtotime($year_month));$where_str=" 1=1 ";//月份過濾$where_str .= " and year=" . $year . " and month=" . $month;//考勤計算數據獲取$hr_cal_arr = db('hr_cal')->alias('c')->join('sys_user u', 'c.user_id=u.id')->where($where_str)->order('u.site_id asc')->field('c.id,u.user_gh,u.nickname,c.user_id,c.year,c.month,c.last_annual_num,c.last_repair_num,c.holiday_hour,c.local_note_hour,c.local_annual_num,c.tw_out_work_time,c.local_repair_num,c.local_num,c.intern_day,abs(c.casual_leave) as casual_leave,c.sick_leave,c.marry_leave,c.baby_leave,c.over_leave,c.work_err_leave,c.f_baby_leave,c.l_baby_leave,c.work_leave,c.abs_hour,c.bf_num,c.lunch_num,c.remark,c.is_lock')->select();$total_arr = ['holiday_hour_total' => 0,'abs_hour_total' => 0,'marry_leave_total' => 0,'baby_leave_total' => 0,'over_leave_total' => 0,'work_err_leave_total' => 0,'f_baby_leave_total' => 0,'l_baby_leave_total' => 0,];$data = array();foreach ($hr_cal_arr as $key => $val) {$temp_arr = array();$temp_arr['user_gh'] = get_cache_data('user_info', $val['user_id'], 'user_gh');$temp_arr['nickname'] = get_cache_data('user_info', $val['user_id'], 'nickname');$temp_arr['last_annual_num'] = c_z($val['last_annual_num']);$temp_arr['last_repair_num'] = c_z($val['last_repair_num']);$temp_arr['holiday_hour'] = c_z($val['holiday_hour']);$temp_arr['local_note_hour'] = c_z($val['local_note_hour']);$temp_arr['local_annual_num'] = c_z($val['local_annual_num']);$temp_arr['local_repair_num'] = c_z($val['local_repair_num']);$temp_arr['local_num'] = c_z($val['local_num']);$temp_arr['casual_leave'] = c_z($val['casual_leave']);$temp_arr['sick_leave'] = c_z($val['sick_leave']);$temp_arr['marry_leave'] = c_z($val['marry_leave']);$temp_arr['baby_leave'] = c_z($val['baby_leave']);$temp_arr['over_leave'] = c_z($val['over_leave']);$temp_arr['work_err_leave'] = c_z($val['work_err_leave']);$temp_arr['f_baby_leave'] = c_z($val['f_baby_leave']);$temp_arr['l_baby_leave'] = c_z($val['l_baby_leave']);$temp_arr['abs_hour'] = c_z($val['abs_hour']);$temp_arr['intern_day'] = $val['intern_day'];$temp_arr['remark'] = $val['remark'];array_push($data, $temp_arr);$total_arr['holiday_hour_total'] += $temp_arr['holiday_hour'];$total_arr['abs_hour_total'] += $temp_arr['abs_hour'];$total_arr['marry_leave_total'] += $temp_arr['marry_leave'];$total_arr['baby_leave_total'] += $temp_arr['baby_leave'];$total_arr['over_leave_total'] += $temp_arr['over_leave'];$total_arr['work_err_leave_total'] += $temp_arr['work_err_leave'];$total_arr['f_baby_leave_total'] += $temp_arr['f_baby_leave'];$total_arr['l_baby_leave_total'] += $temp_arr['l_baby_leave'];}
//        $header = [
//            'A1'=>'員工工號', 'B1'=>'員工姓名', 'C1'=>'上月結算年休', 'D1'=>'上月結算補休', 'E1'=>'節假日結加班費時數',
//            'F1'=>'本月申請休假', 'G1'=>'本次結算年休時數', 'H1'=>'本次結算補休時數', 'I1'=>'本次年休+補休', 'J1'=>'事假時數',
//            'K1'=>'病假時數', 'L1'=>'曠職時數', 'M1'=>'實習生出勤天數', 'N1'=>'備註', 'O1'=>'婚假',
//            'P1'=>'產假', 'Q1'=>'喪假', 'R1'=>'工傷假', 'S1'=>'陪產假', 'T1'=>'哺乳假'
//        ];//生成header頭算法// 使用array_filter篩選出值為0的變量$variablesWithZero = array_filter($total_arr, function ($value) {return $value === 0;});$zeroCount = count($variablesWithZero);$asciiValue = ord('T'); // 輸出 84$endCode = chr($asciiValue - $zeroCount);$letters = $this->generateRange('A', $endCode);$b = ['員工工號', '員工姓名', '上月結算年休', '上月結算補休', '節假日結加班費時數','本月申請休假', '本次結算年休時數', '本次結算補休時數', '本次年休+補休', '事假時數','病假時數', '曠職時數', '實習生出勤天數', '備註', '婚假','產假', '喪假', '工傷假', '陪產假', '哺乳假'];if($total_arr['holiday_hour_total'] == 0){unset($b[4]);$data = $this->array_column_remove($data, 'holiday_hour');}if($total_arr['abs_hour_total'] == 0){unset($b[11]);$data = $this->array_column_remove($data, 'abs_hour');}if($total_arr['marry_leave_total'] == 0){unset($b[14]);$data = $this->array_column_remove($data, 'marry_leave');}if($total_arr['baby_leave_total'] == 0){unset($b[15]);$data = $this->array_column_remove($data, 'baby_leave');}if($total_arr['over_leave_total'] == 0){unset($b[16]);$data = $this->array_column_remove($data, 'over_leave');}if($total_arr['work_err_leave_total'] == 0){unset($b[17]);$data = $this->array_column_remove($data, 'work_err_leave');}if($total_arr['f_baby_leave_total'] == 0){unset($b[18]);$data = $this->array_column_remove($data, 'f_baby_leave');}if($total_arr['l_baby_leave_total'] == 0){unset($b[19]);$data = $this->array_column_remove($data, 'l_baby_leave');}$b = array_values($b);$data = array_values($data);$header = array_combine($letters, $b);$this->downExcel($year_month, $header, $data);}/*** @param Request $request* @throws \PhpOffice\PhpSpreadsheet\Writer\Exception*/public function downExcel($year_month, $header, $list_data){//實例化Spreadsheet對象$spreadsheet = new Spreadsheet();//獲取活動工作薄$sheet = $spreadsheet -> getActiveSheet();//定義一個excel的header表頭//$header = ['A1'=>'ID','B1'=>'昵稱','C1'=>'登錄名','D1'=>'手機號','E1'=>'郵箱'];foreach ($header as $key=>$value) {$sheet->setCellValue($key,$value);}$i = 2;//excel表格從第2行開始填入數據$keys = array_keys($list_data[0]);foreach ($list_data as $k => $v) {for ($index=1; $index<=count($keys); $index++){$sheet->setCellValueByColumnAndRow($index,$i,$v[$keys[$index-1]]);}//            $sheet->setCellValueByColumnAndRow(1,$i,$v['user_gh']);
//            $sheet->setCellValueByColumnAndRow(2,$i,$v['nickname']);
//            $sheet->setCellValueByColumnAndRow(3,$i,$v['last_annual_num']);
//            $sheet->setCellValueByColumnAndRow(4,$i,$v['last_repair_num']);
//            $sheet->setCellValueByColumnAndRow(5,$i,$v['holiday_hour']);
//
//            $sheet->setCellValueByColumnAndRow(6,$i,$v['local_note_hour']);
//            $sheet->setCellValueByColumnAndRow(7,$i,$v['local_annual_num']);
//            $sheet->setCellValueByColumnAndRow(8,$i,$v['local_repair_num']);
//            $sheet->setCellValueByColumnAndRow(9,$i,$v['local_num']);
//            $sheet->setCellValueByColumnAndRow(10,$i,$v['casual_leave']);
//
//            $sheet->setCellValueByColumnAndRow(11,$i,$v['sick_leave']);
//            $sheet->setCellValueByColumnAndRow(12,$i,$v['abs_hour']);
//            $sheet->setCellValueByColumnAndRow(13,$i,$v['intern_day']);
//            $sheet->setCellValueByColumnAndRow(14,$i,$v['remark']);
//            $sheet->setCellValueByColumnAndRow(15,$i,$v['marry_leave']);
//
//            $sheet->setCellValueByColumnAndRow(16,$i,$v['baby_leave']);
//            $sheet->setCellValueByColumnAndRow(17,$i,$v['over_leave']);
//            $sheet->setCellValueByColumnAndRow(18,$i,$v['work_err_leave']);
//            $sheet->setCellValueByColumnAndRow(19,$i,$v['f_baby_leave']);
//            $sheet->setCellValueByColumnAndRow(20,$i,$v['l_baby_leave']);$i++;//$i從2累加}//定義文件名稱,需要帶有定義的后綴名$filename = $year_month . '_hr_tb.xlsx';ob_end_clean(); //清除緩沖區,避免亂碼//將輸出重定向到客戶端的web瀏覽器header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');header('Content-Disposition: attachment;filename="' . $filename . '"');header('Cache-Control: max-age=0');//如果瀏覽器為IE9header('Cache-Control: max-age=1');//如果通過SSL向IE提供服務header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');header('Cache-Control: cache, must-revalidate');//HTTP/1.1header('Pragma: public');//HTTP/1.0$writer = IOFactory ::createWriter($spreadsheet, 'Xlsx');$writer -> save('php://output');exit;}/*** @param $start* @param $end* @param $startNum* @param $endNum* @return array* $range = generateRange('A', 'Z', 1, 1);* print_r($range);*/function generateRange($start = 'A', $end = 'Z', $startNum = 1, $endNum = 1){$results = [];for ($letter = $start; strcmp($letter, $end) <= 0; $letter++) {for ($num = $startNum; $num <= $endNum; $num++) {$results[] = $letter . $num;}}return $results;}function array_column_remove($input, $column_key) {return array_map(function ($item) use ($column_key) {unset($item[$column_key]);return $item;}, $input);}

前面數據列表不再多言,各家業務盡不相同,主要說一下我的思路,首先拿到所有列,然后根據合計是否為0判斷 是否刪除列。這個時候表頭就要做成動態的,動態生成 A1 到 XX 生成函數也放在下面了,題外話:對于 thinkphp5 而言,凡是 composer 安裝的插件 一律放到 vendor 目錄下,而手動下載的安裝包(非composer管理)的,則放到?extend 目錄下。

代碼篩選列部分還需優化

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/16912.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16912.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16912.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【HDFS】FSImage加載過程之loadINode過程

普通的loadINode方法(即不是root inode): 根據inode的類型:文件、目錄、鏈接,做不同的加載處理。 // 根據傳入的PB INode的type做不同處理。// 我們下面關注FILE和DIRECTORY兩種類型:private INode loadINode(INodeSection.INode n) {switch (n.getType()) {<

【云原生】Kubernetes中的List-Watch機制詳解與容器生命周期

目錄 引言 一、List-Watch機制概述 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;工作機制 1.List操作 2.Watch操作 &#xff08;三&#xff09;數據流向 1.按模塊劃分 2.按整體總結 二、Pod生命周期 &#xff08;一&#xff09;生命周期 1.創建…

CMake-1 cmake簡介及安裝使用

文章目錄 1. CMake 簡單介紹2. CMake 安裝使用 1. CMake 簡單介紹 為什么需要CMake 寫過C語言的都知道&#xff0c;C語言項目使用Makefile進行管理&#xff0c;而隨著項目復雜度的增加 Makefile編寫的難度也隨之增加&#xff0c;而且在不同平臺Makefile 語法規則是不一樣的&am…

5款好用的AI寫作軟件,一鍵生成高質量文章

在當今信息快速發展的時代&#xff0c;AI寫作軟件逐漸成為創作者們的得力助手。它們能夠憑借先進的技術和算法&#xff0c;一鍵生成高質量的文章&#xff0c;為創作者們節省大量的創作時間和精力。以下是5款備受好評的AI寫作軟件&#xff0c;下面在本文中分享給大家&#xff0c…

20240522金融讀報:出口信用保險提效蘇易融碳中和機票貸款差異化投放替代數據征信培育壯大數字經濟

1、印發通知從響應速度、承保力度、承包評審要素、產業鏈范圍、定制化、線上化、便利化等方面去充分發揮出口信用保險作用。&#xff08;這也可以作為這個貸款業務擔保時的一個考慮項吧&#xff09; 2、蘇易融&#xff1a;匯集江蘇轄內特定客群信貸產品&#xff0c;可一站式查…

BitConverter類型,Byte數組與其他基本類型數據之間的轉換

BitConvert對于byte數組轉換為其他的基本變量很方便&#xff0c;是我們開發必須要學會的類型轉換&#xff0c;因為我在使用中使用的比較多&#xff0c;創作不易&#xff0c;大家點贊關注收藏。 GetBytes(XX)將基本變量轉換成字節數組&#xff0c;C#在數據存儲在計算機中的方式…

kettle學習之表的輸入輸出

需求 把表A里的數據傳送到表B中&#xff0c;在此之前&#xff0c;清空表B內的數據 表輸入 執行SQL腳本 表輸出

一文帶你學會如何部署個人博客到云服務器,并進行域名備案與解析!

哈嘍&#xff0c;大家好呀&#xff01;這里是碼農后端。之前我給大家介紹了如何快速注冊一個自己的域名&#xff0c;并創建一臺自己的阿里云ECS云服務器。本篇將介紹如何將個人博客部署到云服務器&#xff0c;并進行域名備案與解析。 1、域名備案 注冊了域名并購買了云服務器之…

探索自動化辦公的新境界:批量操作與智能管理

新書上架~&#x1f447;全國包郵奧~ python實用小工具開發教程http://pythontoolsteach.com/3 歡迎關注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目錄 一、自動化辦公的必要性與價值 二、基礎操作與自動化腳本 三、Python在自動化辦公中的應用…

Meme幣總市值突破630億美元 以太坊ETF獲批意味著代幣化資產“完全安全”

近日&#xff0c;數字貨幣市場再次掀起軒然大波。一方面&#xff0c;Meme幣總市值突破了630億美元&#xff0c;令人瞠目結舌&#xff1b;另一方面&#xff0c;以太坊ETF的獲批也引發了市場的廣泛關注&#xff0c;被視為代幣化資產的“完全安全”標志。 Meme幣總市值飆升 Meme幣…

深圳比創達電子EMC|EMC電磁兼容性行業:挑戰與機遇并存

隨著電子技術的迅猛發展&#xff0c;電磁兼容性&#xff08;EMC&#xff09;已成為各行各業不可忽視的關鍵問題。EMC是指設備或系統在其電磁環境中能正常工作且不對該環境中任何事物構成不能承受的電磁騷擾的能力。 一、EMC電磁兼容性行業的現狀 EMC電磁兼容性行業作為電子技…

[數據集][目標檢測]道路井蓋下水道井蓋開關閉和檢測數據集VOC+YOLO格式407張2類別

數據集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路徑的txt文件&#xff0c;僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數)&#xff1a;407 標注數量(xml文件個數)&#xff1a;407 標注數量(txt文件個數)&#xff1a;407 標注類別…

構建php環境、安裝、依賴、nginx配置、ab壓力測試命令

目錄 php簡介 官網php安裝包 選擇下載穩定版本 &#xff08;建議使用此版本&#xff0c;文章以此版本為例&#xff09; 安裝php解析環境 準備工作 安裝依賴 zlib-devel 和 libxml2-devel包。 安裝擴展工具庫 安裝 libmcrypt 安裝 mhash 安裝mcrypt 安裝php 選項含…

深入理解一下棧

1、棧&#xff1a;數據結構 為什么 main()方法 最先執行&#xff0c;最后結束&#xff1f; 當然是因為 main()方法入棧啦。 2、棧&#xff1a;棧內存&#xff0c;主管程序的運行&#xff0c;生命周期和現成同步&#xff1b; 線程結束&#xff0c;棧內內存也就釋放了&#xff0c…

STM32_RCC

1、RCC RCC即Reset and Clock Control&#xff0c;復位和時鐘控制。通過stm32f10x結構圖可以看出RCC控制著stm32的AHB系統總線&#xff0c;而AHB總線又橋接APB1和APB2&#xff0c;分別通過它們控制不同的片上外設。如果要使用某個片上外設的功能&#xff0c;必須先通過…

SpringBoot集成騰訊IM流程

1.application.yaml中添加IM配置信息 #im模塊 im: identifier: admin sdkappid: 1400888888 key: ccf2dc88c1ca232cfabbd24906d5091ab81ba0250224abc 2.封裝IM工具類 Component Getter RefreshScope public class ImAdminSignConfig {/*** 簽名*/private String usersig;…

Apache Doris 基礎(一) -- Getting Started

Apache Doris 開源、實時數據倉庫 Apache Doris是一個用于實時分析的現代數據倉庫。 它提供大規模閃電般的實時數據分析。 實時獲取和存儲 在一秒鐘內基于推的微批處理和基于拉的流數據獲取。實時更新&#xff0c;追加和預聚合的存儲引擎閃電般的查詢 使用列式存儲引擎、MPP架構…

CDGP|數據治理策略揭秘:因企制宜,實現精準管控新高度

隨著信息化、數字化的深入推進&#xff0c;數據已經成為企業最重要的資產之一。如何高效、安全地管理和利用數據&#xff0c;成為企業面臨的重要課題。數據治理策略的制定與實施&#xff0c;成為解決這一問題的關鍵所在。本文將探討如何因企制宜&#xff0c;制定符合企業實際情…

23種設計模式全面總結 | 快速復習(附PDF+MD版本)

本篇文章是對于23種設計模式的一個全面的總結&#xff0c;受限于文章篇幅無法對每個設計模式做到全面的解析&#xff0c;但幾乎每個設計模式都提供了案例和類圖結構&#xff0c;非常適合快速復習和在學習設計模式之前的全預習把握。 &#x1f4a1;文章的 pdf markdown 版本可通…

Mysql的復制技術

一、異步復制&#xff1a; 主服務器上的事務更新了數據后&#xff0c;就不管從服務器是否立刻跟上&#xff0c;主服務器繼續處理其他事務&#xff0c;而從服務器會在它空閑的時候去檢查并應用這些更新。 ——老師&#xff08;源服務器&#xff09;給學生&#xff08;從服務器&…