1.导出市场活动:
1)给”批量导出”按钮添加单击事件,发送导出请求
2)查询所有的市场活动
3)创建一个excel文件,并且把市场活动写到excel文件中
4)把生成的excel文件输出到浏览器(文件下载)
技术准备:
1)使用java生成excel文件:iText,apache-poi
关于办公文档插件使用的基本思想:把办公文档的所有元素封装成普通的Java类,<br /> 程序员通过操作这些类达到操作办公文档目的。<br /> 文件---------HSSFWorkbook<br /> 页-----------HSSFSheet<br /> 行-----------HSSFRow<br /> 列-----------HSSFCell<br /> 样式---------HSSFCellStyle使用apache-poi生成excel:<br /> a)添加依赖:<br /> <dependency><br /> <groupId>org.apache.poi</groupId><br /> <artifactId>poi</artifactId><br /> <version>3.15</version><br /> </dependency><br /> b)使用封装类生成excel文件:<br /> <br /> 2.文件下载:<br /> filedownloadtest.jsp<br /> ActivityController<br /> |->fileDownload()*所有文件下载的请求只能发送同步请求。
一、导出市场活动流程图
1.mapper层

/*** 查询所有的市场活动* @return*/List<Activity> selectAllActivitys();
<select id="selectAllActivitys" resultMap="BaseResultMap">select a.id,u1.name as owner,a.name,a.start_date,a.end_date,a.cost,a.description,a.create_time,u2.name as create_by,a.edit_time,u3.name as edit_byfrom tbl_activity ajoin tbl_user u1 on a.owner=u1.idjoin tbl_user u2 on a.create_by=u2.idleft join tbl_user u3 on a.edit_by=u3.idorder by a.create_time desc</select>
2.service层

List<Activity> queryAllActivitys();
public List<Activity> queryAllActivitys() {return activityMapper.selectAllActivitys();}
3.controller层
@RequestMapping("/workbench/activity/exportAllActivitys.do")public void exportAllActivitys(HttpServletResponse response) throws Exception{//调用service层方法,查询所有的市场活动List<Activity> activityList=activityService.queryAllActivitys();//创建exel文件,并且把activityList写入到excel文件中HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet=wb.createSheet("市场活动列表");HSSFRow row=sheet.createRow(0);HSSFCell cell=row.createCell(0);cell.setCellValue("ID");cell=row.createCell(1);cell.setCellValue("所有者");cell=row.createCell(2);cell.setCellValue("名称");cell=row.createCell(3);cell.setCellValue("开始日期");cell=row.createCell(4);cell.setCellValue("结束日期");cell=row.createCell(5);cell.setCellValue("成本");cell=row.createCell(6);cell.setCellValue("描述");cell=row.createCell(7);cell.setCellValue("创建时间");cell=row.createCell(8);cell.setCellValue("创建者");cell=row.createCell(9);cell.setCellValue("修改时间");cell=row.createCell(10);cell.setCellValue("修改者");//遍历activityList,创建HSSFRow对象,生成所有的数据行if(activityList!=null && activityList.size()>0){Activity activity=null;for(int i=0;i<activityList.size();i++){activity=activityList.get(i);//每遍历出一个activity,生成一行row=sheet.createRow(i+1);//每一行创建11列,每一列的数据从activity中获取cell=row.createCell(0);cell.setCellValue(activity.getId());cell=row.createCell(1);cell.setCellValue(activity.getOwner());cell=row.createCell(2);cell.setCellValue(activity.getName());cell=row.createCell(3);cell.setCellValue(activity.getStartDate());cell=row.createCell(4);cell.setCellValue(activity.getEndDate());cell=row.createCell(5);cell.setCellValue(activity.getCost());cell=row.createCell(6);cell.setCellValue(activity.getDescription());cell=row.createCell(7);cell.setCellValue(activity.getCreateTime());cell=row.createCell(8);cell.setCellValue(activity.getCreateBy());cell=row.createCell(9);cell.setCellValue(activity.getEditTime());cell=row.createCell(10);cell.setCellValue(activity.getEditBy());}}//根据wb对象生成excel文件/* OutputStream os=new FileOutputStream("D:\\course\\18-CRM\\阶段资料\\serverDir\\activityList.xls");wb.write(os);*///关闭资源/*os.close();wb.close();*///把生成的excel文件下载到客户端response.setContentType("application/octet-stream;charset=UTF-8");response.addHeader("Content-Disposition","attachment;filename=activityList.xls");OutputStream out=response.getOutputStream();/*InputStream is=new FileInputStream("D:\\course\\18-CRM\\阶段资料\\serverDir\\activityList.xls");byte[] buff=new byte[256];int len=0;while((len=is.read(buff))!=-1){out.write(buff,0,len);}is.close();*/wb.write(out);wb.close();out.flush();}
4.前端页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";%><html><head><base href="<%=basePath%>"><meta charset="UTF-8"><link href="jquery/bootstrap_3.3.0/css/bootstrap.min.css" type="text/css" rel="stylesheet" /><link rel="stylesheet" type="text/css" href="jquery/bootstrap-datetimepicker-master/css/bootstrap-datetimepicker.min.css"><link rel="stylesheet" type="text/css" href="jquery/bs_pagination-master/css/jquery.bs_pagination.min.css"><script type="text/javascript" src="jquery/jquery-1.11.1-min.js"></script><script type="text/javascript" src="jquery/bootstrap_3.3.0/js/bootstrap.min.js"></script><script type="text/javascript" src="jquery/bootstrap-datetimepicker-master/js/bootstrap-datetimepicker.js"></script><script type="text/javascript" src="jquery/bootstrap-datetimepicker-master/locale/bootstrap-datetimepicker.zh-CN.js"></script><script type="text/javascript" src="jquery/bs_pagination-master/js/jquery.bs_pagination.min.js"></script><script type="text/javascript" src="jquery/bs_pagination-master/localization/en.js"></script><script type="text/javascript">$(function(){//给"创建"按钮添加单击事件$("#createActivityBtn").click(function () {//初始化工作//重置表单$("#createActivityForm").get(0).reset();//弹出创建市场活动的模态窗口$("#createActivityModal").modal("show");});//给"保存"按钮添加单击事件$("#saveCreateActivityBtn").click(function () {//收集参数var owner=$("#create-marketActivityOwner").val();var name=$.trim($("#create-marketActivityName").val());var startDate=$("#create-startDate").val();var endDate=$("#create-endDate").val();var cost=$.trim($("#create-cost").val());var description=$.trim($("#create-description").val());//表单验证if(owner==""){alert("所有者不能为空");return;}if(name==""){alert("名称不能为空");return;}if(startDate!=""&&endDate!=""){//使用字符串的大小代替日期的大小if(endDate<startDate){alert("结束日期不能比开始日期小");return;}}/*正则表达式:1,语言,语法:定义字符串的匹配模式,可以用来判断指定的具体字符串是否符合匹配模式。2,语法通则:1)//:在js中定义一个正则表达式. var regExp=/...../;2)^:匹配字符串的开头位置$: 匹配字符串的结尾3)[]:匹配指定字符集中的一位字符。 var regExp=/^[abc]$/;var regExp=/^[a-z0-9]$/;4){}:匹配次数.var regExp=/^[abc]{5}$/;{m}:匹配m此{m,n}:匹配m次到n次{m,}:匹配m次或者更多次5)特殊符号:\d:匹配一位数字,相当于[0-9]\D:匹配一位非数字\w:匹配所有字符,包括字母、数字、下划线。\W:匹配非字符,除了字母、数字、下划线之外的字符。*:匹配0次或者多次,相当于{0,}+:匹配1次或者多次,相当于{1,}?:匹配0次或者1次,相当于{0,1}*/var regExp=/^(([1-9]\d*)|0)$/;if(!regExp.test(cost)){alert("成本只能为非负整数");return;}//发送请求$.ajax({url:'workbench/activity/saveCreateActivity.do',data:{owner:owner,name:name,startDate:startDate,endDate:endDate,cost:cost,description:description},type:'post',dataType:'json',success:function (data) {if(data.code=="1"){//关闭模态窗口$("#createActivityModal").modal("hide");//刷新市场活动列,显示第一页数据,保持每页显示条数不变queryActivityByConditionForPage(1,$("#demo_pag1").bs_pagination('getOption', 'rowsPerPage'));}else{//提示信息alert(data.message);//模态窗口不关闭$("#createActivityModal").modal("show");//可以不写。}}});});//当容器加载完成之后,对容器调用工具函数//$("input[name='mydate']").datetimepicker({$(".mydate").datetimepicker({language:'zh-CN', //语言format:'yyyy-mm-dd',//日期的格式minView:'month', //可以选择的最小视图initialDate:new Date(),//初始化显示的日期autoclose:true,//设置选择完日期或者时间之后,日否自动关闭日历todayBtn:true,//设置是否显示"今天"按钮,默认是falseclearBtn:true//设置是否显示"清空"按钮,默认是false});//当市场活动主页面加载完成,查询所有数据的第一页以及所有数据的总条数,默认每页显示10条queryActivityByConditionForPage(1,10);//给"查询"按钮添加单击事件$("#queryActivityBtn").click(function () {//查询所有符合条件数据的第一页以及所有符合条件数据的总条数;queryActivityByConditionForPage(1,$("#demo_pag1").bs_pagination('getOption', 'rowsPerPage'));});//给"全选"按钮添加单击事件$("#chckAll").click(function () {//如果"全选"按钮是选中状态,则列表中所有checkbox都选中/*if(this.checked==true){$("#tBody input[type='checkbox']").prop("checked",true);}else{$("#tBody input[type='checkbox']").prop("checked",false);}*/$("#tBody input[type='checkbox']").prop("checked",this.checked);});/*$("#tBody input[type='checkbox']").click(function () {//如果列表中的所有checkbox都选中,则"全选"按钮也选中if($("#tBody input[type='checkbox']").size()==$("#tBody input[type='checkbox']:checked").size()){$("#chckAll").prop("checked",true);}else{//如果列表中的所有checkbox至少有一个没选中,则"全选"按钮也取消$("#chckAll").prop("checked",false);}});*/$("#tBody").on("click","input[type='checkbox']",function () {//如果列表中的所有checkbox都选中,则"全选"按钮也选中if($("#tBody input[type='checkbox']").size()==$("#tBody input[type='checkbox']:checked").size()){$("#chckAll").prop("checked",true);}else{//如果列表中的所有checkbox至少有一个没选中,则"全选"按钮也取消$("#chckAll").prop("checked",false);}});//给"删除"按钮添加单击事件$("#deleteActivityBtn").click(function () {//收集参数//获取列表中所有被选中的checkboxvar chekkedIds=$("#tBody input[type='checkbox']:checked");if(chekkedIds.size()==0){alert("请选择要删除的市场活动");return;}if(window.confirm("确定删除吗?")){var ids="";$.each(chekkedIds,function () {//id=xxxx&id=xxx&.....&id=xxx&ids+="id="+this.value+"&";});ids=ids.substr(0,ids.length-1);//id=xxxx&id=xxx&.....&id=xxx//发送请求$.ajax({url:'workbench/activity/deleteActivityIds.do',data:ids,type:'post',dataType:'json',success:function (data) {if(data.code=="1"){//刷新市场活动列表,显示第一页数据,保持每页显示条数不变queryActivityByConditionForPage(1,$("#demo_pag1").bs_pagination('getOption', 'rowsPerPage'));}else{//提示信息alert(data.message);}}});}});//给"修改"按钮添加单击事件$("#editActivityBtn").click(function () {//收集参数//获取列表中被选中的checkboxvar chkedIds=$("#tBody input[type='checkbox']:checked");if(chkedIds.size()==0){alert("请选择要修改的市场活动");return;}if(chkedIds.size()>1){alert("每次只能修改一条市场活动");return;}//var id=chkedIds.val();//var id=chkedIds.get(0).value;var id=chkedIds[0].value;//发送请求$.ajax({url:'workbench/activity/queryActivityById.do',data:{id:id},type:'post',dataType:'json',success:function (data) {//把市场活动的信息显示在修改的模态窗口上$("#edit-id").val(data.id);$("#edit-marketActivityOwner").val(data.owner);$("#edit-marketActivityName").val(data.name);$("#edit-startTime").val(data.startDate);$("#edit-endTime").val(data.endDate);$("#edit-cost").val(data.cost);$("#edit-description").val(data.description);//弹出模态窗口$("#editActivityModal").modal("show");}});});//给"更新"按钮添加单击事件$("#saveEditActivityBtn").click(function () {//收集参数var id=$("#edit-id").val();var owner=$("#edit-marketActivityOwner").val();var name=$.trim($("#edit-marketActivityName").val());var startDate=$("#edit-startTime").val();var endDate=$("#edit-endTime").val();var cost=$.trim($("#edit-cost").val());var description=$.trim($("#edit-description").val());//表单验证(作业)//发送请求$.ajax({url:'workbench/activity/saveEditActivity.do',data:{id:id,owner:owner,name:name,startDate:startDate,endDate:endDate,cost:cost,description:description},type:'post',dataType:'json',success:function (data) {if(data.code=="1"){//关闭模态窗口$("#editActivityModal").modal("hide");//刷新市场活动列表,保持页号和每页显示条数都不变queryActivityByConditionForPage($("#demo_pag1").bs_pagination('getOption', 'currentPage'),$("#demo_pag1").bs_pagination('getOption', 'rowsPerPage'));}else{//提示信息alert(data.message);//模态窗口不关闭$("#editActivityModal").modal("show");}}});});//给"批量导出"按钮添加单击事件$("#exportActivityAllBtn").click(function () {//发送同步请求window.location.href="workbench/activity/exportAllActivitys.do";});//给"导入"按钮添加单击事件$("#importActivityBtn").click(function () {//收集参数var activityFileName=$("#activityFile").val();var suffix=activityFileName.substr(activityFileName.lastIndexOf(".")+1).toLocaleLowerCase();//xls,XLS,Xls,xLs,....if(suffix!="xls"){alert("只支持xls文件");return;}var activityFile=$("#activityFile")[0].files[0];if(activityFile.size>5*1024*1024){alert("文件大小不超过5MB");return;}//FormData是ajax提供的接口,可以模拟键值对向后台提交参数;//FormData最大的优势是不但能提交文本数据,还能提交二进制数据var formData=new FormData();formData.append("activityFile",activityFile);formData.append("userName","张三");//发送请求$.ajax({url:'workbench/activity/importActivity.do',data:formData,processData:false,//设置ajax向后台提交参数之前,是否把参数统一转换成字符串:true--是,false--不是,默认是truecontentType:false,//设置ajax向后台提交参数之前,是否把所有的参数统一按urlencoded编码:true--是,false--不是,默认是truetype:'post',dataType:'json',success:function (data) {if(data.code=="1"){//提示成功导入记录条数alert("成功导入"+data.retData+"条记录");//关闭模态窗口$("#importActivityModal").modal("hide");//刷新市场活动列表,显示第一页数据,保持每页显示条数不变queryActivityByConditionForPage(1,$("#demo_pag1").bs_pagination('getOption', 'rowsPerPage'));}else{//提示信息alert(data.message);//模态窗口不关闭$("#importActivityModal").modal("show");}}});});});function queryActivityByConditionForPage(pageNo,pageSize) {//收集参数var name=$("#query-name").val();var owner=$("#query-owner").val();var startDate=$("#query-startDate").val();var endDate=$("#query-endDate").val();//var pageNo=1;//var pageSize=10;//发送请求$.ajax({url:'workbench/activity/queryActivityByConditionForPage.do',data:{name:name,owner:owner,startDate:startDate,endDate:endDate,pageNo:pageNo,pageSize:pageSize},type:'post',dataType:'json',success:function (data) {//显示总条数//$("#totalRowsB").text(data.totalRows);//显示市场活动的列表//遍历activityList,拼接所有行数据var htmlStr="";$.each(data.activityList,function (index,obj) {htmlStr+="<tr class=\"active\">";htmlStr+="<td><input type=\"checkbox\" value=\""+obj.id+"\"/></td>";htmlStr+="<td><a style=\"text-decoration: none; cursor: pointer;\" onclick=\"window.location.href='detail.html';\">"+obj.name+"</a></td>";htmlStr+="<td>"+obj.owner+"</td>";htmlStr+="<td>"+obj.startDate+"</td>";htmlStr+="<td>"+obj.endDate+"</td>";htmlStr+="</tr>";});$("#tBody").html(htmlStr);//取消"全选"按钮$("#chckAll").prop("checked",false);//计算总页数var totalPages=1;if(data.totalRows%pageSize==0){totalPages=data.totalRows/pageSize;}else{totalPages=parseInt(data.totalRows/pageSize)+1;}//对容器调用bs_pagination工具函数,显示翻页信息$("#demo_pag1").bs_pagination({currentPage:pageNo,//当前页号,相当于pageNorowsPerPage:pageSize,//每页显示条数,相当于pageSizetotalRows:data.totalRows,//总条数totalPages: totalPages, //总页数,必填参数.visiblePageLinks:5,//最多可以显示的卡片数showGoToPage:true,//是否显示"跳转到"部分,默认true--显示showRowsPerPage:true,//是否显示"每页显示条数"部分。默认true--显示showRowsInfo:true,//是否显示记录的信息,默认true--显示//用户每次切换页号,都自动触发本函数;//每次返回切换页号之后的pageNo和pageSizeonChangePage: function(event,pageObj) { // returns page_num and rows_per_page after a link has clicked//js代码//alert(pageObj.currentPage);//alert(pageObj.rowsPerPage);queryActivityByConditionForPage(pageObj.currentPage,pageObj.rowsPerPage);}});}});}</script></head><body><!-- 创建市场活动的模态窗口 --><div class="modal fade" id="createActivityModal" role="dialog"><div class="modal-dialog" role="document" style="width: 85%;"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button><h4 class="modal-title" id="myModalLabel1">创建市场活动</h4></div><div class="modal-body"><form id="createActivityForm" class="form-horizontal" role="form"><div class="form-group"><label for="create-marketActivityOwner" class="col-sm-2 control-label">所有者<span style="font-size: 15px; color: red;">*</span></label><div class="col-sm-10" style="width: 300px;"><select class="form-control" id="create-marketActivityOwner"><c:forEach items="${userList}" var="u"><option value="${u.id}">${u.name}</option></c:forEach></select></div><label for="create-marketActivityName" class="col-sm-2 control-label">名称<span style="font-size: 15px; color: red;">*</span></label><div class="col-sm-10" style="width: 300px;"><input type="text" class="form-control" id="create-marketActivityName"></div></div><div class="form-group"><label for="create-startDate" class="col-sm-2 control-label">开始日期</label><div class="col-sm-10" style="width: 300px;"><input type="text" class="form-control mydate" name="mydate" id="create-startDate" readonly></div><label for="create-endDate" class="col-sm-2 control-label">结束日期</label><div class="col-sm-10" style="width: 300px;"><input type="text" class="form-control mydate" name="mydate" id="create-endDate" readonly></div></div><div class="form-group"><label for="create-cost" class="col-sm-2 control-label">成本</label><div class="col-sm-10" style="width: 300px;"><input type="text" class="form-control" id="create-cost"></div></div><div class="form-group"><label for="create-description" class="col-sm-2 control-label">描述</label><div class="col-sm-10" style="width: 81%;"><textarea class="form-control" rows="3" id="create-description"></textarea></div></div></form></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">关闭</button><button type="button" class="btn btn-primary" id="saveCreateActivityBtn">保存</button></div></div></div></div><!-- 修改市场活动的模态窗口 --><div class="modal fade" id="editActivityModal" role="dialog"><div class="modal-dialog" role="document" style="width: 85%;"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button><h4 class="modal-title" id="myModalLabel2">修改市场活动</h4></div><div class="modal-body"><form class="form-horizontal" role="form"><input type="hidden" id="edit-id"><div class="form-group"><label for="edit-marketActivityOwner" class="col-sm-2 control-label">所有者<span style="font-size: 15px; color: red;">*</span></label><div class="col-sm-10" style="width: 300px;"><select class="form-control" id="edit-marketActivityOwner"><c:forEach items="${userList}" var="u"><option value="${u.id}">${u.name}</option></c:forEach></select></div><label for="edit-marketActivityName" class="col-sm-2 control-label">名称<span style="font-size: 15px; color: red;">*</span></label><div class="col-sm-10" style="width: 300px;"><input type="text" class="form-control" id="edit-marketActivityName" value="发传单"></div></div><div class="form-group"><label for="edit-startTime" class="col-sm-2 control-label">开始日期</label><div class="col-sm-10" style="width: 300px;"><input type="text" class="form-control" id="edit-startTime" value="2020-10-10"></div><label for="edit-endTime" class="col-sm-2 control-label">结束日期</label><div class="col-sm-10" style="width: 300px;"><input type="text" class="form-control" id="edit-endTime" value="2020-10-20"></div></div><div class="form-group"><label for="edit-cost" class="col-sm-2 control-label">成本</label><div class="col-sm-10" style="width: 300px;"><input type="text" class="form-control" id="edit-cost" value="5,000"></div></div><div class="form-group"><label for="edit-description" class="col-sm-2 control-label">描述</label><div class="col-sm-10" style="width: 81%;"><textarea class="form-control" rows="3" id="edit-description">市场活动Marketing,是指品牌主办或参与的展览会议与公关市场活动,包括自行主办的各类研讨会、客户交流会、演示会、新产品发布会、体验会、答谢会、年会和出席参加并布展或演讲的展览会、研讨会、行业交流会、颁奖典礼等</textarea></div></div></form></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">关闭</button><button type="button" class="btn btn-primary" id="saveEditActivityBtn">更新</button></div></div></div></div><!-- 导入市场活动的模态窗口 --><div class="modal fade" id="importActivityModal" role="dialog"><div class="modal-dialog" role="document" style="width: 85%;"><div class="modal-content"><div class="modal-header"><button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span></button><h4 class="modal-title" id="myModalLabel">导入市场活动</h4></div><div class="modal-body" style="height: 350px;"><div style="position: relative;top: 20px; left: 50px;">请选择要上传的文件:<small style="color: gray;">[仅支持.xls]</small></div><div style="position: relative;top: 40px; left: 50px;"><input type="file" id="activityFile"></div><div style="position: relative; width: 400px; height: 320px; left: 45% ; top: -40px;" ><h3>重要提示</h3><ul><li>操作仅针对Excel,仅支持后缀名为XLS的文件。</li><li>给定文件的第一行将视为字段名。</li><li>请确认您的文件大小不超过5MB。</li><li>日期值以文本形式保存,必须符合yyyy-MM-dd格式。</li><li>日期时间以文本形式保存,必须符合yyyy-MM-dd HH:mm:ss的格式。</li><li>默认情况下,字符编码是UTF-8 (统一码),请确保您导入的文件使用的是正确的字符编码方式。</li><li>建议您在导入真实数据之前用测试文件测试文件导入功能。</li></ul></div></div><div class="modal-footer"><button type="button" class="btn btn-default" data-dismiss="modal">关闭</button><button id="importActivityBtn" type="button" class="btn btn-primary">导入</button></div></div></div></div><div><div style="position: relative; left: 10px; top: -10px;"><div class="page-header"><h3>市场活动列表</h3></div></div></div><div style="position: relative; top: -20px; left: 0px; width: 100%; height: 100%;"><div style="width: 100%; position: absolute;top: 5px; left: 10px;"><div class="btn-toolbar" role="toolbar" style="height: 80px;"><form class="form-inline" role="form" style="position: relative;top: 8%; left: 5px;"><div class="form-group"><div class="input-group"><div class="input-group-addon">名称</div><input class="form-control" type="text" id="query-name"></div></div><div class="form-group"><div class="input-group"><div class="input-group-addon">所有者</div><input class="form-control" type="text" id="query-owner"></div></div><div class="form-group"><div class="input-group"><div class="input-group-addon">开始日期</div><input class="form-control" type="text" id="query-startDate" /></div></div><div class="form-group"><div class="input-group"><div class="input-group-addon">结束日期</div><input class="form-control" type="text" id="query-endDate"></div></div><button type="button" class="btn btn-default" id="queryActivityBtn">查询</button></form></div><div class="btn-toolbar" role="toolbar" style="background-color: #F7F7F7; height: 50px; position: relative;top: 5px;"><div class="btn-group" style="position: relative; top: 18%;"><button type="button" class="btn btn-primary" id="createActivityBtn"><span class="glyphicon glyphicon-plus"></span> 创建</button><button type="button" class="btn btn-default" id="editActivityBtn"><span class="glyphicon glyphicon-pencil"></span> 修改</button><button type="button" class="btn btn-danger" id="deleteActivityBtn"><span class="glyphicon glyphicon-minus"></span> 删除</button></div><div class="btn-group" style="position: relative; top: 18%;"><button type="button" class="btn btn-default" data-toggle="modal" data-target="#importActivityModal" ><span class="glyphicon glyphicon-import"></span> 上传列表数据(导入)</button><button id="exportActivityAllBtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-export"></span> 下载列表数据(批量导出)</button><button id="exportActivityXzBtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-export"></span> 下载列表数据(选择导出)</button></div></div><div style="position: relative;top: 10px;"><table class="table table-hover"><thead><tr style="color: #B3B3B3;"><td><input type="checkbox" id="chckAll"/></td><td>名称</td><td>所有者</td><td>开始日期</td><td>结束日期</td></tr></thead><tbody id="tBody"><%--<tr class="active"><td><input type="checkbox" /></td><td><a style="text-decoration: none; cursor: pointer;" onclick="window.location.href='detail.html';">发传单</a></td><td>zhangsan</td><td>2020-10-10</td><td>2020-10-20</td></tr><tr class="active"><td><input type="checkbox" /></td><td><a style="text-decoration: none; cursor: pointer;" onclick="window.location.href='detail.html';">发传单</a></td><td>zhangsan</td><td>2020-10-10</td><td>2020-10-20</td></tr>--%></tbody></table><div id="demo_pag1"></div></div><%--<div style="height: 50px; position: relative;top: 30px;"><div><button type="button" class="btn btn-default" style="cursor: default;">共<b id="totalRowsB">50</b>条记录</button></div><div class="btn-group" style="position: relative;top: -34px; left: 110px;"><button type="button" class="btn btn-default" style="cursor: default;">显示</button><div class="btn-group"><button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">10<span class="caret"></span></button><ul class="dropdown-menu" role="menu"><li><a href="#">20</a></li><li><a href="#">30</a></li></ul></div><button type="button" class="btn btn-default" style="cursor: default;">条/页</button></div><div style="position: relative;top: -88px; left: 285px;"><nav><ul class="pagination"><li class="disabled"><a href="#">首页</a></li><li class="disabled"><a href="#">上一页</a></li><li class="active"><a href="#">1</a></li><li><a href="#">2</a></li><li><a href="#">3</a></li><li><a href="#">4</a></li><li><a href="#">5</a></li><li><a href="#">下一页</a></li><li class="disabled"><a href="#">末页</a></li></ul></nav></div></div>--%></div></div></body></html>
二、导入市场活动
1.文件上传演示
1,导入市场活动:
1)把用户计算机上的excel文件上传到服务器(文件上传)
2)使用java解析excel文件,获取excel文件中的数据
3)把解析出来的数据添加数据库中
4)返回响应信息
技术准备:
1)文件上传:
fileuploadtest.jsp
ActivityController
|->fileUpload()
2)使用java解析excel文件:iText,apache-poi
关于办公文档插件使用的基本思想:把办公文档的所有元素封装成普通的Java类,
程序员通过操作这些类达到操作办公文档目的。
文件————-HSSFWorkbook
页—————-HSSFSheet
行—————-HSSFRow
列—————-HSSFCell
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";%><html><head><base href="<%=basePath%>"><title>演示文件上传</title></head><body><!--文件上传的表单三个条件:1.表单组件标签必须用:<input type="file"><input type="text|password|radio|checkbox|hidden|button|submit|reset|file"><select>,<textarea>等2.请求方式只能用:postget:参数通过请求头提交到后台,参数放在URL后边;只能向后台提交文本数据;对参数长度有限制;数据不安全;效率高post:参数通过请求体提交到后台;既能能提交文件数据,又能够提交二进制数据;理论上对参数长度没有限制;相对安全;效率相对较低3.表单的编码格式只能用:multipart/form-data根据HTTP协议的规定,浏览器每次向后台提交参数,都会对参数进行统一编码;默认采用的编码格式是urlencoded,这种编码格式只能对文本数据进行编码;浏览器每次向后台提交参数,都会首先把所有的参数转换成字符串,然后对这些数据统一进行urlencoded编码;文件上传的表单编码格式只能用multipart/form-data:enctype="multipart/form-data"--><form action="workbench/activity/fileUpload.do" method="post" enctype="multipart/form-data"><input type="file" name="myFile"><br><input type="text" name="userName"><br><input type="submit" value="提交"></form></body></html>
/*** 配置springmvc的文件上传解析器**/@RequestMapping("/workbench/activity/fileUpload.do")public @ResponseBody Object fileUpload(String userName, MultipartFile myFile) throws Exception{//把文本数据打印到控制台System.out.println("userName="+userName);//把文件在服务指定的目录中生成一个同样的文件String originalFilename=myFile.getOriginalFilename();File file=new File("D:\\course\\18-CRM\\阶段资料\\serverDir\\",originalFilename);//路径必须手动创建好,文件如果不存在,会自动创建myFile.transferTo(file);//返回响应信息ReturnObject returnObject=new ReturnObject();returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);returnObject.setMessage("上传成功");return returnObject;}
<!-- 配置文件上传解析器 id:必须是multipartResolver--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><property name="maxUploadSize" value="#{1024*1024*5}"/><property name="defaultEncoding" value="utf-8"/></bean>
