摘要:一普遍導出方法在或是系統中導出是常有的事,做過的此功能人都知道,其主要操作其實是循環數據列表,然后一格一格地添加數據到固定的單元格中。
一.普遍導出方法
在crm或是oa系統中導出excel是常有的事,做過的此功能人都知道,其主要操作其實是循環數據列表,然后一格一格地添加數據到固定的單元格中。只要做好了一次,其后只要復制相關代碼修改修改,其他地方導出功能也就完成了。
但是這樣會有兩個問題:
1.當列表數據字段修改時,需要修改大量的代碼,維護艱難,改著難受;
2.多次出現導出功能時,需要在多個地方復制大量的重復冗余代碼,看著難受;
因此,有必要統一一個導出excel的方法,使用時,只需要傳入數據的表頭,表頭字段名,數據列表,以及數據表名稱,就能導出excel了。
二.使用通用的導出方法如下圖所示,只要傳入4個參數,就能完成導出,使用和維護就變得簡單多了。
好的,目標已經明確了,接下來就是代碼實現了。
顯然,要實現此功能,最大的一個難題是,根據單條數據的索引和表頭字段次序,自動計算出每條數據中的每個字段在excel中的坐標值(如A1,B3)。
那么我們就來分析下excel的單元格坐標吧,從A1開始,縱向遞增數字的值,橫向遞增字母,當橫向字母變為Z后,下一個字母為AA,然后AB,...,ZZ,...,AAA...
這樣的話,我們就知道了,縱向坐標簡單,根據每條數據的索引值就可以計算得出,難的是橫向坐標,該怎么計算?再仔細分析下橫向坐標,可以發現是一種類似26進制的字母數字,A如果看作0,那Z表示25。但是這種數字與我們常見的16進制,8進制等又不太一樣,因為當Z進位的時候,下一個數不是BA,而是AA。常見的進制中,如十進制9進位,變成10,而不是00;16進制0xF進位,變為0x10,而不是0x00。
因此可以參考進制轉換的算法,然后變化一下,得出計算excel的橫向坐標的方法(10進制轉偽26進制):
//AAA轉換 public static function toAAA($dec) { if ($dec < 0) return ""; $y = $dec % 26; $x = floor($dec / 26); return self::toAAA($x - 1) . chr($y + 65); }
2018-01-19 更新:翻看php manual發現新的簡單解決方法,字符遞增:
最后,附上完整代碼
框架為Yii2,excel導出組件為moonlandsoft/yii2-phpexcel;
其他類似
//導出xls public static function exportXls($array) { set_time_limit(0); include(Url::to("@vendor/moonland/phpexcel/PHPExcel.php")); include(Url::to("@vendor/moonland/phpexcel/PHPExcel/Writer/Excel2007.php")); $titles = $array["titles"]; $fields = $array["fields"]; $list = $array["list"]; $name = $array["name"]; $count = count($titles); $keys = [];//A=>chr(65) foreach ($titles as $k => $v) { $keys[] = self::toAAA($k); } $objPHPExcel = new PHPExcel(); $objWriter = new PHPExcel_Writer_Excel2007($objPHPExcel); $objPHPExcel->setActiveSheetIndex(0); $activeSheet = $objPHPExcel->getActiveSheet(); $activeSheet->setTitle($name); $activeSheet->getStyle("A1:{$keys[$count-1]}1")->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_CENTER); $activeSheet->mergeCells("A1:{$keys[$count-1]}1"); $activeSheet->setCellValue("A1", $name); //設置title,樣式 foreach ($titles as $key => $title) { $activeSheet->setCellValue($keys[$key] . "2", $title); $activeSheet->getColumnDimension($keys[$key])->setWidth(20); $activeSheet->getRowDimension(($key + 1))->setRowHeight(18); } $i = 3; foreach ($list as &$item) { foreach ($keys as $k => $v) { $val = isset($item[$fields[$k]]) ? $item[$fields[$k]] . " " : " "; $activeSheet->setCellValue($v . $i, $val); } $i++; } $fileName = $name . "_" . date("Y_m_d_His") . ".xlsx"; header("Cache-Control: public"); header("Pragma: public"); header("Content-type:application/vnd.ms-excel"); header("Content-Disposition:attachment;filename=" . iconv("utf-8", "GB2312//TRANSLIT", $fileName)); header("Content-Type:APPLICATION/OCTET-STREAM"); ob_clean(); ob_start(); $objWriter->save("php://output"); ob_end_flush(); } //AAA轉換 public static function toAAA($dec) { if ($dec < 0) return ""; $y = $dec % 26; $x = floor($dec / 26); return self::toAAA($x - 1) . chr($y + 65); }三.導出結果示例
導出結果:
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26270.html
摘要:本文經授權轉自社區說明是一款強大的文件處理擴展包能夠快速完成文件的的導出解析等功能本項目由團隊成員整理發布首發地為社區文章的項目截圖運行代碼請見請參照此文檔運行文章概覽安裝基礎用法更多功能接下來是詳細解說安裝使用安裝該擴展包安裝完成后, 本文經授權轉自 PHPHub 社區 說明 maatwebsite/excel 是一款強大的 Excel 文件處理擴展包, 能夠快速完成 Excel 文...
摘要:能不能單獨設置某個單元格的值這個目前并沒有實現,現在數據的寫入都是逐行寫入的,不支持這么細的粒度,不過折中的做法是把不需要填充的單元格寫入即可如果有什么使用問題,可以在下面留言,一起探討使用方式 二者有何區別? PHPExcel 是一個處理Excel,CVS文件的開源框架,它基于微軟的OpenXML標準和PHP語言。可以使用它來讀取、寫入不同格式的電子表格,這也是PHP至今最通用的Ex...
摘要:本文非原創,基于學院在中使用實現文件導入導出功能這篇文章在實際中測試調整。簡介在中集成套件中的,從而方便我們以優雅的富有表現力的代碼實現文件的導入和導出。 本文非原創,基于laravel 學院《在 Laravel 5 中使用 Laravel Excel 實現 Excel/CSV 文件導入導出功能》 這篇文章在實際中測試調整。 showImg(https://segmentfault.c...
摘要:本篇文章主要講述,如何在中使用中導出文件,是博主在實踐了好多篇別人的帖子之后,總結歸納出來的文章,親測可用。我的博客歡迎騷擾原文地址用導出文件。將文件,重命名成。文章結束,歡迎轉載。 本篇文章主要講述,如何在thinkPHP中使用PHPExcel中導出Excel文件,是博主在實踐了好多篇別人的帖子之后,總結歸納出來的文章,親測可用。thinkPHP版本是3.2。 我的博客:Mine-...
關于 PHP 導出 excel csv 常用的有 PHPexcel ,本文整理了一些其他方案。 高性能 Excel 擴展 sudo apt-get install -y zlib1g-dev git clone https://github.com/jmcnamara/libxlsxwriter.git cd libxlsxwriter make && sudo make install // ...
閱讀 2171·2021-11-11 16:55
閱讀 1695·2019-08-30 15:54
閱讀 2825·2019-08-30 15:53
閱讀 2220·2019-08-30 15:44
閱讀 1158·2019-08-30 15:43
閱讀 972·2019-08-30 11:22
閱讀 1950·2019-08-29 17:20
閱讀 1574·2019-08-29 16:56