PHPexcel:多sheet上傳和下載

来源:http://www.cnblogs.com/gaojianli/archive/2016/03/01/5230464.html
-Advertisement-
Play Games

excel表格上傳和下載,斷斷續續寫了很久,趕緊記下來萬一以後忘記就虧大了= = 資料庫有三張表: 上傳一張表格,每個sheet對應一個if_table_n,if_user_table記錄上傳信息,if_column_map記錄每個if_table_n的列名與資料庫列名對應,if_system_co


excel表格上傳和下載,斷斷續續寫了很久,趕緊記下來萬一以後忘記就虧大了= =

資料庫有三張表:

上傳一張表格,每個sheet對應一個if_table_n,if_user_table記錄上傳信息,if_column_map記錄每個if_table_n的列名與資料庫列名對應,if_system_config記錄表格數目。

 

  1 public function uploadFile() {
  2 
  3         if(!empty($_FILES)) {
  4             $upload = new \Think\Upload();// 實例化上傳類
  5             $upload->maxSize   =     1000000000  ;// 設置附件上傳大小
  6             $upload->rootPath  =     './Uploads/'; // 設置附件上傳根目錄
  7             // $upload->savePath  =     $filePath.'/'; // 設置附件上傳(子)目錄
  8             $info   =   $upload->upload();
  9 
 10             if($info === false) {// 上傳錯誤提示錯誤信息
 11                 $this->error("上傳錯誤:".$upload->getError(),"http://192.168.151.175/basicinfo",3);
 12             }
 13 
 14             //判斷文件是否為excel格式
 15             $fileName = $info["file"]['name'];
 16 
 17 
 18             $fileType = substr($fileName,strrpos($fileName, '.') + 1);
 19 
 20             if(strtolower($fileType) !== "xls" && strtolower($fileType) !== "xlsx") {
 21                $this->error("文件格式錯誤!");
 22             }
 23 
 24             //文件名
 25             $filen=substr($fileName,0,strrpos($fileName, '.'));
 26 
 27             //判斷引入何種格式的phpexcel 對應兩種版本的excel
 28             import("Org.Util.PHPExcel");
 29 
 30             $PHPExcel = new \PHPExcel();
 31 
 32             if($fileType === "xlsx") {
 33                 //如果excel文件尾碼名為.xlsx,導入類
 34                 import("Org.Util.PHPExcel.Reader.Excel2007");
 35                 $PHPReader=new \PHPExcel_Reader_Excel2007();
 36             }
 37             else {
 38                 import("Org.Util.PHPExcel.Reader.Excel5"); 
 39                 $PHPReader=new \PHPExcel_Reader_Excel5();
 40             }
 41 
 42             
 43             $PHPExcel=$PHPReader->load(SITE_PATH."Uploads/".$info["file"]["savepath"].$info["file"]['savename']);            
 44             // 確定當前excel文件的數量
 45             $res = D('IfSystemConfig')->getValueByKey('table_count');
 46 
 47             //獲取工作表個數
 48             $sheetCount = $PHPExcel->getSheetCount();
 49 
 50             //獲取sheet的名字
 51             $sheetname = $PHPExcel->getSheetNames();
 52 
 53             // 當前表數量欄位,加上工作表的數量
 54             $result = D('IfSystemConfig')
 55             ->setValueByKey("table_count",intval($res[0]['value'])+ $sheetCount);
 56 
 57             if($result === false) {
 58                 $this->error("數據上傳失敗!");
 59             }
 60 
 61             $unique_name_id = $res[0]['value'];
 62 
 63             for($s = 0;$s<$sheetCount;$s++) 
 64             {
 65                 /**
 66                 * 保存表的信息
 67                 * @access public
 68                 * @param string $tablename 表名
 69                 * @param string $filename 文件名(全路徑)
 70                 * @return null
 71                 */
 72                 $PHPExcel=$PHPReader->load($filename);
 73 
 74                 //選擇工作表
 75                 $currentSheet = $PHPExcel->getSheet($sheetnum);
 76     
 77                 //獲取總列數
 78                 $allColumn=$currentSheet->getHighestColumn();
 79 
 80                 //獲取總行數
 81                 $allRow=$currentSheet->getHighestRow();
 82 
 83                 //獲取整張表,寫入二維數組arr中 arr[行][列]
 84                 for($currentRow=1;$currentRow<=$allRow;$currentRow++){
 85                     //從哪列開始,A表示第一列
 86                     for($currentColumn='A';$currentColumn<=$allColumn;$currentColumn++){
 87                         //數據坐標
 88                         $address=$currentColumn.$currentRow;
 89                         $cvalue = $currentSheet->getCell($address)->getValue();
 90 
 91                         //讀取到的數據,保存到數組$arr中
 92                         $arr[$currentRow][$currentColumn]=$cvalue;
 93                     }
 94                 }
 95 
 96                 // 表、列、代表含義的映射  
 97                 // 列位自定義  
 98                 //field_0 為自增形id
 99                 $j = 1;
100                 $data['map_table'] = $tablename;
101                 $data['col_name'] = "field_".'0';
102                 $data['col_meaning'] = "";
103 
104                 //從field_1 .... field_n,對應excel列名
105                 $res = D('IfColumnMap')->saveData($data);
106                 foreach ($arr[1] as $key => $value) {    
107                     $data['col_name'] = "field_".$j;
108                     $data['col_meaning'] = $arr[1][$key];
109                     $res = D('IfColumnMap')->saveData($data);
110                     $j++;
111                 } 
112 
113                 // 查找每個欄位數據的最大長度
114                 // 用來確定每個欄位的長度
115                 $t = 0;
116                 foreach ($arr[2] as $key => $value) {
117                     $ml = 0;
118                     for($i = 2;$i <= count($arr);$i++) {
119                         if(strlen($arr[$i][$key]) > $ml) {
120                             $ml =  strlen($arr[$i][$key]);
121                         }
122                     }   
123                     $maxLenght[$t] = $ml; 
124                     $t++;
125                 }
126             
127                 // 如果長度大於256,就將欄位類型設置為text類型
128                 for($i = 0;$i < count($maxLenght); $i++) {
129 
130                     if($maxLenght[$i] > 256) {
131                     $type[$i] = "text";
132                     }
133                     else {
134                         $type[$i] = "varchar(".($maxLenght[$i]+15).")";
135                     }   
136                 }
137 
138                 //建立if_table_n的sql語句 
139                 //utf-8編碼 default charset=utf8
140                 //自增類型 int primary key not  null  auto_increment
141                 $sqlString = "CREATE TABLE ".$tablename." ( ";
142                 $sqlString .= "field_0"." "."int primary key not  null  auto_increment,";
143                 $sqlString .= "field_1"." ".$type[0];
144                 for($i = 1;$i < count($maxLenght);$i++) {
145                     $sqlString .= ","."field_".($i+1)." ".$type[$i];
146                 }
147                 $sqlString .= ") default charset=utf8";
148 
149                 // 數據表創建
150                 $Model = new \Think\Model(); // 實例化一個model對象 沒有對應任何數據表
151                 $Model->execute($sqlString);
152                    
153                 // 為新建的數據表if_table_n添加數據 
154                 for($i = 2;$i <= count($arr);$i++) {
155                     $k = 1;
156                     foreach ($arr[$i] as $key => $value) {
157                         $info['field_'.$k] = $arr[$i][$key];
158                         $k++;
159                     }
160                     M($tablename)->add($info);
161                 }
162                 
163                 // 插入 用戶、表 數據之間的關係
164                 //if_user_table
165                 $data = array(
166                     'userid' => session('if_userid'),
167                     'unique_name' => 'if_table_'.$unique_name_id,
168                     'file_name' => $filen,
169                     'save_name' => $info["file"]['savename'],
170                     'save_path' => $info["file"]["savepath"],
171                     'submit_time' => date("Y-m-d h:i:s"),
172                     'tag' => 1,
173                     'file_id' => $res[0]['value'],
174                     'sheet' => $s,
175                     'sheetname' => $sheetname[$s]
176                 );
177 
178                 $result = D('IfUserTable')->saveData($data);
179  
180                 if($result === false) {
181                     $this->error("數據上傳失敗!");
182                 }
183                 $unique_name_id++;
184             }
185 
186             $this->success("上傳成功!",__APP__."/Home/Index/index");
187           
188         }

 下載此表格:

還有一些未用到的設置:

設置單元格寬度

$objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(20);

設置單元格高度

$objPHPExcel->getActiveSheet()->getRowDimension($i)->setRowHeight(40);

合併單元格

$objPHPExcel->getActiveSheet()->mergeCells('A18:E22');

拆分單元格

$objPHPExcel->getActiveSheet()->unmergeCells('A28:B28');

設置保護cell,保護工作表

$objPHPExcel->getActiveSheet()->getProtection()->setSheet(true); 
$objPHPExcel->getActiveSheet()->protectCells('A3:E13', 'PHPExcel');

設置格式

$objPHPExcel->getActiveSheet()->getStyle('E4')->getNumberFormat()->setFormatCode(PHPExcel_Style_NumberFormat::FORMAT_CURRENCY_EUR_SIMPLE);
$objPHPExcel->getActiveSheet()->duplicateStyle( $objPHPExcel->getActiveSheet()->getStyle('E4'), 'E5:E13' );

設置加粗

$objPHPExcel->getActiveSheet()->getStyle('B1')->getFont()->setBold(true);

設置垂直居中

$objPHPExcel->getActiveSheet()->getStyle('A18')->getAlignment()->setVertical(PHPExcel_Style_Alignment::VERTICAL_CENTER);

設置字型大小

$objPHPExcel->getActiveSheet()->getDefaultStyle()->getFont()->setSize(10);

設置邊框

$objPHPExcel->getActiveSheet()->getStyle('A1:I20')->getBorders()->getAllBorders()->setBorderStyle(\PHPExcel_Style_Border::BORDER_THIN); 

設置邊框顏色

複製代碼
$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getLeft()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getTop()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('D13')->getBorders()->getBottom()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getTop()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getBottom()->getColor()->setARGB('FF993300');
$objPHPExcel->getActiveSheet()->getStyle('E13')->getBorders()->getRight()->getColor()->setARGB('FF993300');
複製代碼

插入圖像

複製代碼
$objDrawing = new PHPExcel_Worksheet_Drawing();
/*設置圖片路徑 切記:只能是本地圖片*/ 
$objDrawing->setPath('圖像地址');
/*設置圖片高度*/ 
$objDrawing->setHeight(180);//照片高度
$objDrawing->setWidth(150); //照片寬度
/*設置圖片要插入的單元格*/
$objDrawing->setCoordinates('E2');
 /*設置圖片所在單元格的格式*/
$objDrawing->setOffsetX(5);
$objDrawing->setRotation(5);
$objDrawing->getShadow()->setVisible(true);
$objDrawing->getShadow()->setDirection(50);
$objDrawing->setWorksheet($objPHPExcel->getActiveSheet());
複製代碼

設置單元格背景色

$objPHPExcel->getActiveSheet(0)->getStyle('A1')->getFill()->setFillType(\PHPExcel_Style_Fill::FILL_SOLID);
$objPHPExcel->getActiveSheet(0)->getStyle('A1')->getFill()->getStartColor()->setARGB('FFCAE8EA');
 1 public function downloadFile() {
 2         $file_id = I('file_id');
 3         $tablename = D('IfUserTable')->getNameByFileid($file_id);
 4 
 5         import("Org.Util.PHPExcel");
 6         //不清楚為什麼\PHPExcel()前要加\,不加會報錯,大哥也沒解釋清楚
 7         $objPHPExcel = new \PHPExcel();
 8         import("Org.Util.PHPExcel.Reader.Excel5"); 
 9 
10         //或者include 'PHPExcel/Writer/Excel5.php'; 用於輸出.xls的
11 
12         // 實例化Create new PHPExcel object    
13           
14         /* @func 設置文檔基本屬性 */    
15         $objPHPExcel->getProperties()
16             ->setCreator("ctos")       //設置創建人
17             ->setLastModifiedBy("ctos")     //最後修改人
18 	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 繼續,前面已經實現了C#調用Windows API實現了彈出對話框功能。使用了User32.dll文件,主要代碼如下:[DllImport("User32.dll")]public static extern int MessageBox(int h, string m, string c, int
  • 以下為本次實踐代碼: 1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Linq; 5 using System.Reflection; 6 using
  • 最近項目中有用到Webservice,研究了Spring與CXF整合的官方文檔(其實官方文檔說的清楚了,建議大伙還是看官方文檔,都是很簡單英文單詞),所以就有了下麵的demo,相信大伙都能看懂 用的主要架構為Maven + Spring + CXF + IDEA,廢話就不多說了,先看下整個個項目結構...
  • Jetty是一個用 Java 實現、開源、基於標準的,並且具有豐富功能的 Http 伺服器和 Web 容器。Jetty中應用最廣泛的一項功能就是可以作為嵌入式Web容器。 在開發階段,可以使用Jetty在Eclipse里直接啟動應用,而不是像Tomcat那樣繁瑣,先把幾十兆應用打包,然後再複製到某個
  • 因為公司項目線上人數的增加,隨著現在硬體成本越來越低,大多數的生產環境記憶體大多都已經達到 16G,尤其最新的阿裡雲,客戶的機器都是配置超高的java主機,但是Java的運行環境,記憶體使用有限 ,這樣就造成了這台伺服器資源的浪費,所以單機的多Tomcat集群就很有必要!當然有客戶有多台伺服器,這樣更好
  • 首先純html頁要用meta標簽聲明編碼<meta http-equiv="Content-Type" content="text/html; charset="utf-8" />有php輸出的頁要使用header函數聲明編碼header("Content-Type:text/html; chars
  • 相信String這個類是Java中使用得最頻繁的類之一,並且又是各大公司面試喜歡問到的地方,今天就來和大家一起學習一下String、StringBuilder和StringBuffer這幾個類,分析它們的異同點以及瞭解各個類適用的場景。下麵是本文的目錄大綱: 一.你瞭解String類嗎? 二.深入理
  • 語法 它通過{}和:來代替%。“映射”示例 通過位置 In [1]: '{0},{1}'.format('kzc',18) Out[1]: 'kzc,18' In [2]: '{},{}'.format('kzc',18) Out[2]: 'kzc,18' In [3]: '{1},{0},{1}'
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...