通过ajax上传excel文件

bing15 2013-10-15 09:44:27
我想通过ajax上传excel文件,然后再入库,再入库的时候,需要处理是否有相同的数据。
如果有相同的数据,则返回客户端,提示是否覆盖,点击"是"覆盖,点击'否',则不覆盖,直接跳过,继续入库,不知道大家有没有好的思路,还有ajax上传的话,服务器如何获取客户端的文件啊,目前用的是php。
...全文
5846 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
bing15 2013-10-17
  • 打赏
  • 举报
回复
引用 23 楼 showbo 的回复:
[code=javascript] for (val in password) { var subprizeId = password[val]['prizeid']; subPassword = password[val]['password'];
恩,不错,谢谢,欠缺思想,学习中。
Go 旅城通票 2013-10-17
  • 打赏
  • 举报
回复
    for (val in password) {
        var subprizeId = password[val]['prizeid'];
        subPassword = password[val]['password'];
        if (confirm('是否覆盖?!!')) { 
        //ajax提交数据
        }
        
    }
楼主好好学下js或者dom知识。。#21的也可以显示第一个div,其他的先隐藏,操作完毕后在删除当前条,显示下一条记录
bing15 2013-10-17
  • 打赏
  • 举报
回复
引用 21 楼 showbo 的回复:
不用弹窗啊,直接在页面某个容器中生成table或者div之类的就行了...
恩,你这种方法确实可行,但是业务需求是一条一条的处理,而不是把所有的全部显示出来,然后再逐一的处理;如果要弹窗出来一条一条逐步的处理,不知道有什么好的解决方法?
Go 旅城通票 2013-10-17
  • 打赏
  • 举报
回复
不用弹窗啊,直接在页面某个容器中生成table或者div之类的就行了 下面是生成div的,一次处理一条记录的
<div id="dvRepeatRcd"></div>
<script>
    for (val in password) {
        var subprizeId = password[val]['prizeid'];
        subPassword = password[val]['password'];
        /*弹出每个记录对应的值,这里不知道如何循环弹窗,显示每个记录提醒用户操作*/
        var div = document.createElement('div');
        div.innerHTML = '<span>' + subprizeId + '---' + subPassword + '</span> <a href="#" onclick="return sendAjax(this)">覆盖</a> <a href="#" onclick="DelRcd(this)">不覆盖</a>';
        $('#dvRepeatRcd').append(div);
    }




    function DelRcd(a) {//不覆盖就不需要发送到服务器了,直接从dom中删除这条记录
        $(a).parent().remove();
        return false
    }

    function sendAjax(a) {
        var div = a.parentNode; //得到该记录的div容器
        var span = div.firstChild;
        var data = span.innerHTML.split('---');
        //data[0]为subprizeId  data[1]为subPassword,然后ajax发送这个2个值去数据库入库操作

        return false;
    }
</script>
bing15 2013-10-17
  • 打赏
  • 举报
回复
引用 19 楼 showbo 的回复:
第一次请求是提交excel的...
现在有一个问题,我在客户端已经获取所有的重复记录了,但是不知道如何循环弹窗显示它们,然后再对每个记录进行操作。

function ajaxUpload()
{
	 if(arguments.length > 0){
	      var prizeid=arguments[0];
	        	password=arguments[1];
	 }else{
		 var prizeid=password=0;
	}
	$("#loading").ajaxStart(function(){
		$(this).show();
	}).ajaxComplete(function(){
		$(this).hide();
	});
	jQuery.ajaxFileUpload({
			url: '/business/exchangeInfo/AjaxSubmit/prizeid/'+prizeid+'/password/'+password+'',
			secureuri:false,
			fileElementId:'fileToUpload',
			dataType: 'json',
			data:{name:'logan', id:'id'},
			success: function (data, status)
			{
				if(data.repeat==true){
					var password=data.password;
					/*得到所有重复的记录*/
				 	for(val in password){
					 	var subprizeId=password[val]['prizeid'];
							  subPassword=password[val]['password'];
						/*弹出每个记录对应的值,这里不知道如何循环弹窗,显示每个记录提醒用户操作*/
						alert(subprizeId+'---'+subPassword);
						} 
				}else if(data.success==true){
					alert('恭喜你,成功入库');
				}
			},
			error: function (data, status, e)
			{
				alert(e);
			}
		}
	);
	return false;
}
Go 旅城通票 2013-10-17
  • 打赏
  • 举报
回复
第一次请求是提交excel的 1)如果没有重复记录就不需要客户端再干预了,所以只发送了一次 2)如果有重复记录就需要返回给客户端操作(此时第一次请求已经完毕了),客户端如果是批量选择覆盖或者不覆盖,一次发送操作结果就又发送了一次,总共2次 如果一条重复记录发送一次,那就总共需要n+1次(n为重复记录数) 不知道楼主明白了没有,批量的话服务器端逻辑就复杂一点,需要处理多条记录,一次一条就简单多了,取舍在于你自己
bing15 2013-10-16
  • 打赏
  • 举报
回复
那服务器端代码要怎么写啊,我是这么写的,这样的话,如果再提交,不上传excel文件是通过不了的

	public function actionAjaxSubmit(){
		$formModel = new ExchangeForm();
		/*上传excel文件*/
		if($this->getService()->uploadImage($formModel, 'key_password',$this->getUserInfo()->id)){
			$getData=array('id'=>$this->getParams('id'),'status'=>$this->getParams('status'),'password'=>$this->getParams('password'));
			/*将excel数据入库*/
			if ($this->getService()->PHPExcelWriteSql($getData)) {
				$json = $this->getService()->getExcelResponse();
				echo json_encode($json);
				exit();
			}
		}
	}
Go 旅城通票 2013-10-16
  • 打赏
  • 举报
回复
引用 6 楼 bing15 的回复:
目前可以连接到服务器,并返回数据,我把返回的数据放在一个层里面,然后让用户操作,是否覆盖,或者继续,那么如何保持这个连接呢?因为如果再点击覆盖的话,刚才的上传文件就没有了,也就获取不到数据。
你不是返回了数据放在层里面,用ajax重新提交用户选择的记录信息就行了,不用再提交excel文件
bing15 2013-10-16
  • 打赏
  • 举报
回复
目前可以连接到服务器,并返回数据,我把返回的数据放在一个层里面,然后让用户操作,是否覆盖,或者继续,那么如何保持这个连接呢?因为如果再点击覆盖的话,刚才的上传文件就没有了,也就获取不到数据。
bing15 2013-10-16
  • 打赏
  • 举报
回复
引用 17 楼 showbo 的回复:
已经上传后是不能挂起的服务器端的操作的,然后返回信息让客户端选择是否覆盖后服务器端继续执行
我已经明白你的意思了,但是服务器返回重复的数据,如果是多条有重复的话,客户端只是要对其中一条有重复的记录,操作是否覆盖?然后再执行另外一条有重复的数据。 还有为什么说“有重复记录要进行至少2次的请求”,比如:只有一条数据有重复的话,那么返回给客户端,客户端不是只请求这一次吗?为何有2次之说?
Go 旅城通票 2013-10-16
  • 打赏
  • 举报
回复
已经上传后是不能挂起的服务器端的操作的,然后返回信息让客户端选择是否覆盖后服务器端继续执行 要做的就是上传直接入库没有重复的,重复的输出给客户端,客户端选择后再回传给服务器端进行操作 有重复记录要进行至少2次的请求(如果没有重复记录就只有一次),一次请求无法完成你的要求
bing15 2013-10-16
  • 打赏
  • 举报
回复
引用 13 楼 u012463264 的回复:
这个你把他分开啊 在后台只要是重复的 你就跳过,执行下一个。之后把这些重复的用变量记录下来一起返到前台列出来,每条记录加上两个操作 一个是跳过,一个是覆盖。 点击跳过不处理。点击覆盖在把数据用AJAX传回做覆盖操作。
你的这种方案是可行,但需求并不是如此,而是:导入excel文件内容入库,入库的时候,如果excel文件中有一条记录与库中的记录相同,则返回客户端,提示用户操作,是否覆盖,或者直接跳过,这个操作是一连串的。
bing15 2013-10-16
  • 打赏
  • 举报
回复
引用 14 楼 showbo 的回复:
返回重复的数据内容,没重复的直接入库就行了 返回的重复内容处理成表格那样,一行提交记录,记录后放个覆盖/取消覆盖的操作,点击覆盖后发本条数据的相关信息到动态页去进行入库保存更新,取消就直接remove掉这条记录
因为有重复的记录,比如:我选择了覆盖,那么这个excel文件的内容,并没有完啊,还是继续执行入库。 所以并不是单纯的操作,重复的记录。
Go 旅城通票 2013-10-16
  • 打赏
  • 举报
回复
返回重复的数据内容,没重复的直接入库就行了 返回的重复内容处理成表格那样,一行提交记录,记录后放个覆盖/取消覆盖的操作,点击覆盖后发本条数据的相关信息到动态页去进行入库保存更新,取消就直接remove掉这条记录
别闹腰不好 2013-10-16
  • 打赏
  • 举报
回复
这个你把他分开啊 在后台只要是重复的 你就跳过,执行下一个。之后把这些重复的用变量记录下来一起返到前台列出来,每条记录加上两个操作 一个是跳过,一个是覆盖。 点击跳过不处理。点击覆盖在把数据用AJAX传回做覆盖操作。
bing15 2013-10-16
  • 打赏
  • 举报
回复
现在需要的就是,第二次操作,覆盖或者继续执行,不需要上传excel文件了,执行以前的那个。
别闹腰不好 2013-10-16
  • 打赏
  • 举报
回复
也可以用普通的方式提交 ,只要在你的页面中添加个隐藏的iframe ,表单中的target设置成这个隐藏的iframe的名字 和AJAX效果一样
别闹腰不好 2013-10-16
  • 打赏
  • 举报
回复
jquery 中有个叫表单以AJAX方式提交 可以做这个
bing15 2013-10-16
  • 打赏
  • 举报
回复
引用 7 楼 showbo 的回复:
[quote=引用 6 楼 bing15 的回复:] 目前可以连接到服务器,并返回数据,我把返回的数据放在一个层里面,然后让用户操作,是否覆盖,或者继续,那么如何保持这个连接呢?因为如果再点击覆盖的话,刚才的上传文件就没有了,也就获取不到数据。
你不是返回了数据放在层里面,用ajax重新提交用户选择的记录信息就行了,不用再提交excel文件[/quote] 客户端是不是请求错了?
fuzeqiang 2013-10-15
  • 打赏
  • 举报
回复
js有文件上传类的,自己找
加载更多回复(4)
poi解析excel功能参数说明 此项目是基于springMVC实现的,基本流程为从前台jsp页面使用Ajax文件上传导入excel文件(.xls(97-03)/.xlsx(07以后)),传到后台controller调用相应工具类解析后返回指定参数做后续处理. 1. POIUtil.java工具类 解析通过MutilpartFile导入的Excel并解析里面数据,先判断文件的类型(excel处理有两种此处为两种通用)是.xls/.xlsx,通过workbook.getNumberOfSheets()获取工作簿数量,遍历工作簿,sheet.getLastRowNum()获取最大行数,将每行数据放入List list = new Array List(),并根据excel数据类型将器转换为字符串、数字、Boolean、公式、空值类型防止出现错误,最后返回一个list. 2. ExcelUtil.java工具类 解析通过MutilpartFile导入的Excel并解析里面数据,先判断文件的类型(excel处理有两种此处为两种通用)是.xls/.xlsx,采用Apache的POI的API来操作Excel,读取内容后保存到List中,再将List转Json(使用Linked,增删快,与Excel表顺序保持一致),Sheet表1————>List1 步骤1:根据Excel版本类型创建对于的Workbook以及CellSytle 步骤2:遍历每一个表中的每一行的每一列,这里做了些小改动,因为后续可能解析过后可能会保存入数据库,这里为第一行数据添加一个自定义表头 String[] p = new String[]{"name","age","sex","tel","address","e-mail","phone"}; 遍历的列数量以p的length为准 步骤3:一个sheet表就是一个Json,多表就多Json,对应一个 List 一个sheet表的一行数据就是一个 Map 一行中的一列,就把当前列头为key,列值为value存到该列的Map中 Map 一个线性Hash Map,以Excel的sheet表顺序,并以sheet表明作为key,sheet表转换Json后的字符串作为value 最后返回一个LinkedHashMap 3. ExcelToJsonPoi.java工具类 这个与上面工具类类似,不过这个是解析本地excel文件不是使用的流,使用迭代遍历sheet工作簿与每行每列的值,将所有类型作为String类型处理返回一个json对象输出至控制台

52,797

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ajax
社区管理员
  • Ajax
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧