欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

PHPexcel:多sheet上传和下载,phpexcelsheet上传

程序员文章站 2022-04-23 11:34:14
...

PHPexcel:多sheet上传和下载,phpexcelsheet上传

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 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  $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  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 execute($sqlString);
152                    
153                 // 为新建的数据表if_table_n添加数据 
154                 for($i = 2;$i  $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         }