php实现下载模板与上传模板解析
<?
//下载模板的请求
if(isset($_GET['action']) && $_GET['action'] =='down_group_excel'){
$code = down_excel_templates('t_group');
} //下载excel模板
function down_excel_templates($type = 't_group_member'){
if(strcasecmp($type, 't_group_member') === 0){
$filename = 'student模板';
}else{
$filename = 'group模板';
}
header("Content-type:application/vnd.ms-excel");
header("Content-Disposition:filename=".$filename.".xls");
$data = get_execl_template($type);
$strexport = '';
foreach($data AS $v){
$strexport .= $v . "\t";
}
$strexport=iconv('UTF-8',"GB2312//IGNORE",$strexport);
exit($strexport);
} //获取模板数据
function get_execl_template($type = 't_group_member'){
$data = [
't_group_member' => [
'student_id' => '学号', //key对应数据表wp_t_group_member的字段
'user_name' => '姓名',
'pinyin' => '拼音',
'user_email' => '邮箱',
'group_name' => '组织名称',
'role' => '角色(填学生*或讲师)'
],
't_group' => [
'group_name' => '开课班名', //key对应数据表wp_t_group的字段
'org_name' => '组织名',
'course_name'=> '课程名',
'start_time' => '开始时间',
'end_time' => '结束时间',
],
];
if(!array_key_exists($type, $data)){
//key不存在
$type = 't_group_member';
}
return $data[$type];
} //上传文件的请求
if(isset($_POST['action']) && $_POST['action'] =='import_group'){
import_excel('group');
}
/**
* 验证上传的文件
* @param FILES $filename; $_FILES
* @param FILES $tmp_name; $_FILES
* @param string $type; 二级目录
* @param string $root_path; 指定目录
**/
function validate_upload_file($filename, $tmp_name, $type = 'excel', $root_path = '' ){
if(!$filename || !$tmp_name){
return false;
}
//判断文件格式
$path_parts = pathinfo($filename);
$extension = strtolower($path_parts['extension']) ;
if ( !in_array($extension, array('xls','xlsx'))) {
echo json_encode( ['code' => 1, 'msg' => "文件格式不正确,请重新选择" ]);exit;
}
//判断目录是否指定,不指定为默认
$type = 'excel';
if(!$root_path) {
$root_path = "./upload/$type/" . date('Y-m-d', time()) . "/";
}
//检查文件或目录是否存在
if(!file_exists($root_path)) {
@mkdir($root_path,0777,true);
@chmod($root_path,0777);
}
//上传后的文件名
$rand_name = substr(md5(rand(10,99)), 0,4) ;
$name = date('YmdHis').$rand_name.'.'.$extension ;
$real_file = $root_path.$name; //上传后的文件名地址
//移动上传文件
$result = move_uploaded_file($tmp_name, $real_file);
return ['name' => $name, 'real_file' => $real_file, 'result' => $result];
}
/**
* 导入数据
* @param string $name <input>控件的名称
* @param string $type; 二级目录
* @param string $root_path; 指定目录
**/
function import_excel($name = '', $type = 'excel', $root_path = ''){
if($_FILES && isset($_FILES[$name]['name'])){
$filename = $_FILES[$name]['name'];
$tmp_name = $_FILES[$name]['tmp_name'];
//验证文件并导入
$table = 't_group_member';
if(strcasecmp($name,'group') === 0){
$table = 't_group';
}
$result = importdata( $filename, $tmp_name,$table, $type, $root_path);
if(is_array($result)){
echo json_encode(['code' => 1,'data' => $result, 'msg' => '有部分上传失败!详情按F12查看']);exit;
}
echo json_encode(['code' => 0, 'msg' => 'success']);exit;
}else{
echo json_encode(['code' => 1, 'msg' => '请选择文件!']);exit;
}
} /**
* 验证上传的文件
* @param FILES $filename; $_FILES
* @param FILES $tmp_name; $_FILES
* @param string $type; 二级目录
* @param string $root_path; 指定目录
**/
function importdata ($filename, $tmp_name ,$table = '',$type = 'excel', $root_path = '') {
//设置超时时间
set_time_limit(0);
//引入phpexcel
require_once(__LIB__ . "PHPExcel/Classes/PHPExcel.php");
require_once(__LIB__ . "PHPExcel/Classes/PHPExcel/IOFactory.php");
require_once(__LIB__ . "PHPExcel/Classes/PHPExcel/Reader/Excel5.php");
//验证
$msg = [];
$data = validate_upload_file( $filename, $tmp_name ,$type, $root_path);
$result = $data['result'];
$real_file = $data['real_file'];
if ( $result ) {
$PHPExcel = new PHPExcel() ;
$PHPReader = new PHPExcel_Reader_Excel2007();
if( !$PHPReader->canRead($real_file) ){
$PHPReader = new PHPExcel_Reader_Excel5();
if( !$PHPReader->canRead( $real_file ) ){
echo json_encode( ['code' => 1, 'msg' => "文件不可读,请重新选择" ]);exit;
}
}
$_excelData = array() ;
//读取excel
$PHPExcel = $PHPReader->load( $real_file );
//获取工作表的数目
$sheet_count = $PHPExcel->getSheetCount();
for ( $i = 0; $i < $sheet_count; $i++ ) {
$_currentSheet = $PHPExcel->getSheet( $i ) ;
$_allRow = $_currentSheet->getHighestRow(); //获取Excel中信息的行数
$_allColumn = $_currentSheet->getHighestColumn();//获取Excel的列数
$highestRow = intval( $_allRow ) ;
$highestColumn = PHPExcel_Cell::columnIndexFromString($_allColumn);//有效总列数
$field = array_keys(get_execl_template($table)); //获取模板的字段顺序
for( $row = 2; $row <= $highestRow; $row++ ) {
for ($col = 0; $col < count($field); $col++) { //列只获取模板的字段个数
$_excelData[$field[$col]] = $_currentSheet->getCellByColumnAndRow($col, $row)->getValue();
}
if (empty($_excelData)) {
$msg[] = array('s_type' => "导入失败", 'do_content' => $filename . " 下 Sheet" . ($i + 1) . " 中第 " . $row . " 行导入失败", 'do_time' => date("Y-m-d H:i:s"));
unset($_excelData);
continue;
}
if ($_excelData) {
//插入数据库
$code = insert_table($table, $_excelData);
if($code !== true){
$msg[] = array('s_type' => "插入失败", 'do_content' => $filename . " 下 Sheet" . ($i + 1) . " 中第 " . $row . " 行插入失败:".$code, 'do_time' => date("Y-m-d H:i:s"));
};
}
unset($_excelData);
}
}
if($msg) {
return $msg;
}
}else{
echo json_encode( ['code' => 1, 'msg' => "文件上传失败,请重新选择" ]);exit;
}
} /**
* 将数据添加到对应的表中
* @param string $table ; 数据表名
* @param array $data ; 添加的数据
* @return string true添加成功,其他是错误信息
**/
function insert_table($table = '', $data = []){
global $db;
if(!$table || !$data || !is_array($data)){
return false;
}
//验证是否数据正确
switch($table){
case 't_group_member':
//验证t_group_member模板的数据,然后保存
//出错可根据需要,是否还继续。不继续 return '错误信息';
break;
case 't_group':
//验证t_group模板的数据,然后保存
break;
default:
return '没有该模板的数据!';
break;
}
return true;
}
php实现下载模板与上传模板解析的更多相关文章
- 2019.06.05 ABAP EXCEL 操作类代码 OLE方式(模板下载,excel上传,内表下载)
一般使用标准的excel导入方法9999行,修改了标准的excel导入FM 整合出类:excel的 模板下载,excel上传,ALV内表下载功能. 在项目一开始可以SE24创建一个类来供整体开发使用, ...
- shopex后台上传模板漏洞
看到有人找这个拿SHELL的方法.就本地搭建试了下.很简单的. 首先是WIN下.需要WIN主机IIS解析漏洞. 进入后台.点页面管理.点模板列表.默认模板是紫气东来(ShopEx4.8).点编辑模板. ...
- Java下载https文件上传到阿里云oss服务器
Java下载https文件上传到阿里云oss服务器 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** ...
- ssh 下载文件以及上传文件到服务器
https://blog.csdn.net/jackghq/article/details/64124062 scp john@192.168.1.100:~/Desktop/MHN_error_so ...
- salesforce lightning零基础学习(十七) 实现上传 Excel解析其内容
本篇参考: https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader https://github.com/SheetJS/sheetjs ...
- IT轮子系列(六)——Excel上传与解析,一套代码解决所有Excel业务上传,你Get到了吗
前言 在日常开发当中,excel的上传与解析是很常见的.根据业务不同,解析的数据模型也都不一样.不同的数据模型也就需要不同的校验逻辑,这往往需要写多套的代码进行字段的检验,如必填项,数据格式.为了避免 ...
- php文件上传代码解析
php文件上传代码解析 is_uploaded_file() //函数判断指定的文件是否是通过 HTTP POST 上传的,返回一个布尔值. $_FILES['upfile']['tmp_name' ...
- Web攻防系列教程之文件上传攻防解析(转载)
Web攻防系列教程之文件上传攻防解析: 文件上传是WEB应用很常见的一种功能,本身是一项正常的业务需求,不存在什么问题.但如果在上传时没有对文件进行正确处理,则很可能会发生安全问题.本文将对文件上传的 ...
- springMVC:为MultipartFilte配置了上传文件解析器,报错或不能使用
一.问题描述为支持restful风格请求,并且应对可能上传文件的情况,需要在配置hiddenHttpMethodFilter过滤器之前配置MultipartFilter.目的是让MultipartFi ...
随机推荐
- Spring MVC配置实例
1.下载Jar文件,添加到项目 lib文件夹中. 使用eclipse新建 Web 项目.下载导入相关的 jar 和 Tomcat.我的java版本是JDK1.8 对应的 Tomcat 版本是 8.0. ...
- 10Linux_firewalld-Linux就该这么学
firewalld: runtime:当前生效,重启后失效(默认) permanent:当前不生效,重启后永久生效. A:重启,B:执行firewall-cmd --reload 数据链路层:ipta ...
- jeecg之弹窗插件lhgdialog小结
说到弹窗,在jeecg中弹窗用到最多的地方无非是新增/编辑的弹窗. 1.列表页面新增编辑按钮触发的弹窗即lhgdialog,不论是add/update,最终走的都是curdtools.js中的crea ...
- Linux su命令
本人以前一直习惯直接使用root,很少使用su,前几天才发现su与su -命令是有着本质区别的! 大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行, ...
- U3D 设置帧率与垂直同步
1,设置帧率: Application.targetFrameRate = 60: //-1为无限制 2,垂直同步 project settings -> quality,任何level的垂直同 ...
- php解决高并发问题
我们通常衡量一个Web系统的吞吐率的指标是QPS(Query Per Second,每秒处理请求数),解决每秒数万次的高并发场景,这个指标非常关键.举个例子,我们假设处理一个业务请求平均响应时间为10 ...
- [Linux] umask 从三类人群的权限中拿走权限数字
作用 umask 用来设置用户创建文件.目录的默认权限,通过从权限中拿走相应的位,格式 `umask nnn`. 理解 rwx rwx rwx 权限对应三类人群,所属人,所属组,其 ...
- less-loader编译calc异常解决方法
问题: width:calc(100% - 200px);最后编译成calc(-100%) 解决方法 width: calc(~"100% - 200px"); 加上 ~ 并加上引 ...
- 阿里云消息队列的C#使用http接口发送消息实例
app.config <appSettings> <clear/> <add key="Ons_Topic" value="XXX_Fini ...
- angular1时间控件之时间比较大小,比如入住日期和离店日期,入住不能晚于离店时间
功能可能是大家有时遇到的,不过angluar1现在用的人很少了,希望帮上和我一样掉坑里的朋友吧,之前自己也在网上找过几乎没找到angluar1和我代码需求一样的控件,没办法自己造 了,看代码图 就差不 ...