批量导出市场活动
需求分析
用户在市场活动主页面,点击"批量导出"按钮,把所有市场活动生成一个excel文件,弹出文件下载的对话框;
用户选择要保存的目录,完成导出市场活动的功能.
*导出成功之后,页面不刷新
时序&流程
Mapper层
ActivityMapper.java
查询所有市场活动数据
/*** 查询所有的市场活动* @return*/List<Activity> selectAllActivitys();
ActivityMapper.xml
<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>
Service层
ActivityService.java
创建查询所有活动的业务
List<Activity> queryAllActivitys();
ActivityServiceImpl.java
调用activityMapper的selectAllActivitys方法实现ActivityService的queryAllActivitys业务
@Overridepublic List<Activity> queryAllActivitys() {return activityMapper.selectAllActivitys();}
Controller层
笔记1 导出数据
导出市场活动:
1)给"批量导出"按钮添加单击事件,发送导出请求
2)查询所有的市场活动
3)创建一个excel文件,并且把市场活动写到excel文件中
4)把生成的excel文件输出到浏览器(文件下载)
笔记2 数据写入excel文件
1)使用java生成excel文件:iText,apache-poi
关于办公文档插件使用的基本思想:把办公文档的所有元素封装成普通的Java类,程序员通过操作这些类达到操作办公文档目的。
文件---------HSSFWorkbook
页-----------HSSFSheet
行-----------HSSFRow
列-----------HSSFCell
样式---------HSSFCellStyle
使用apache-poi生成excel:
a)添加依赖:
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency>
b)使用封装类生成excel文件:
2)文件下载:
filedownloadtest.jsp
ActivityController
|->fileDownload()
*所有文件下载的请求只能发送同步请求。
b)使用封装类生成excel文件:
@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;//第一行表头String[] titles = {"ID","所有者","名称","开始日期","结束日期","成本","描述","创建时间","创建者","修改时间","修改者"};for (int i = 0 ; i < titles.length ; i ++){cell=row.createCell(i);cell.setCellValue(titles[i]);}//遍历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中获取String[] contents = {activity.getId(),activity.getOwner(),activity.getName(),activity.getStartDate(),activity.getEndDate(),activity.getCost(),activity.getDescription(),activity.getCreateTime(),activity.getCreateBy(),activity.getEditTime(),activity.getEditBy()};for (int j = 0 ; j < contents.length ; j ++){cell=row.createCell(j);cell.setCellValue(contents[j]);}}}//把生成的excel文件下载到客户端response.setContentType("application/octet-stream;charset=UTF-8");response.addHeader("Content-Disposition","attachment;filename=activityList.xls");OutputStream out=response.getOutputStream();wb.write(out);//关闭资源wb.close();out.flush();}
前台页面
index.jsp
给“批量导出”按钮加id选择器
<button id="exportActivityAllBtn" type="button" class="btn btn-default"><span class="glyphicon glyphicon-export"></span> 下载列表数据(批量导出)</button>
单击事件向后台发起导出请求
//给"批量导出"按钮添加单击事件$("#exportActivityAllBtn").click(function () {//发送同步请求window.location.href="workbench/activity/exportAllActivitys.do";});
选择导出市场活动
需求分析
用户在市场活动主页面,选择要导出的市场活动,点击"选择导出"按钮,把所有选择的数据生成一个excel文件,弹出文件下载的对话框;
用户选择要保存的目录,完成选择导出市场活动的功能.
*每次至少选择导出一条记录
*导出成功之后,页面不刷新
时序&流程
与批量导出类似
Mapper层
ActivityMapper.java
/*** 根据ids查询市场活动* @param ids* @return*/List<Activity> selectActivityByIds(String[] ids);
ActivityMapper.xml
<select id="selectActivityByIds" resultMap="BaseResultMap">select<include refid="Base_Column_List"/>from tbl_activitywhere id in<foreach collection="array" item="id" separator="," open="(" close=")">#{id}</foreach></select>
Service层
ActivityService.java
List<Activity> queryActivityByIds(String[] ids);
ActivityServiceImpl.java
@Overridepublic List<Activity> queryActivityByIds(String[] ids) {return activityMapper.selectActivityByIds(ids);}
Controller层
@RequestMapping("/workbench/activity/exportActivitysByIds.do")public void exportActivitysByIds(HttpServletResponse response, HttpServletRequest request) throws Exception {String checkId=request.getParameter("checkId");System.out.println("接收的checkid:"+checkId);String[] ids=checkId.split(",");//切割字符串返回数组//调用service层方法,根据id查询市场活动List<Activity> activityList = activityService.queryActivityByIds(ids);//创建exel文件,并且把activityList写入到excel文件中HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet=wb.createSheet("市场活动列表");HSSFRow row=sheet.createRow(0);HSSFCell cell;//第一行表头String[] titles = {"ID","所有者","名称","开始日期","结束日期","成本","描述","创建时间","创建者","修改时间","修改者"};for (int i = 0 ; i < titles.length ; i ++){cell=row.createCell(i);cell.setCellValue(titles[i]);}//遍历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中获取String[] contents = {activity.getId(), activity.getOwner(), activity.getName(), activity.getStartDate(), activity.getEndDate(), activity.getCost(),activity.getDescription(), activity.getCreateTime(), activity.getCreateBy(), activity.getEditTime(), activity.getEditBy()};for (int j = 0 ; j < contents.length ; j ++){cell=row.createCell(j);cell.setCellValue(contents[j]);}}}//把生成的excel文件下载到客户端response.setContentType("application/octet-stream;charset=UTF-8");response.addHeader("Content-Disposition","attachment;filename=activityList.xls");OutputStream out=response.getOutputStream();wb.write(out);//关闭资源wb.close();out.flush();}
前端页面
index.jsp
//给"选择导出"按钮添加单击事件$("#exportActivityXzBtn").click(function () {//收集参数//获取列表中所有被选中的checkboxvar chekkedIds=$("#tBody input[type='checkbox']:checked");if(chekkedIds.size()==0){alert("请选择要导出的市场活动");return;}//拼接字符串var checkId=[];$("input[type='checkbox']:checked").each(function (i){checkId[i]=$(this).val();//选中额框的值给定义的数组})//发送同步请求window.location.href="workbench/activity/exportActivitysByIds.do?checkId="+checkId;});
导入市场活动数据
需求分析
用户在市场活动主页面,点击市场活动名称超级链接,跳转到明细页面,完成查看市场活动明细的功能.
*在市场活动明细页面,展示:
-市场活动的基本信息
-该市场活动下所有的备注信息
时序&流程
Mapper层
ActivityMapper.java
/*** 批量保存创建的市场活动* @param activityList* @return*/int insertActivityByList(List<Activity> activityList);
ActivityMapper.xml
<insert id="insertActivityByList" parameterType="com.yyp.crm.workbench.domain.Activity">insert into tbl_activity(id, owner, name, start_date, end_date, cost, description, create_time, create_by)values<foreach collection="list" item="obj" separator=",">(#{obj.id},#{obj.owner},#{obj.name},#{obj.startDate},#{obj.endDate},#{obj.cost},#{obj.description},#{obj.createTime},#{obj.createBy})</foreach></insert>
Service层
ActivityService.java
int saveCreateActivityByList(List<Activity> activityList);
ActivityServiceImpl.java
@Overridepublic int saveCreateActivityByList(List<Activity> activityList) {return activityMapper.insertActivityByList(activityList);}
准备工作
配置springmvc的文件上传解析器
applicationContext-mvc.xml
<!-- 配置文件上传解析器 id:必须是multipartResolver--><bean id="multipartResolver" class="org.springframework.monsMultipartResolver"><property name="maxUploadSize" value="#{1024*1024*5}"/><property name="defaultEncoding" value="utf-8"/></bean>
关于excel文件操作的工具类
HSSFUtils.java
public static String getCellValueForStr(HSSFCell cell){String ret="";if(cell.getCellType()==HSSFCell.CELL_TYPE_STRING){ret=cell.getStringCellValue();}else if(cell.getCellType()==HSSFCell.CELL_TYPE_NUMERIC){ret=cell.getNumericCellValue()+"";}else if(cell.getCellType()==HSSFCell.CELL_TYPE_BOOLEAN){ret=cell.getBooleanCellValue()+"";}else if(cell.getCellType()==HSSFCell.CELL_TYPE_FORMULA){ret=cell.getCellFormula();}else{ret="";}return ret;}
Controller层
笔记3 导入市场活动
1)把用户计算机上的excel文件上传到服务器(文件上传)
2)使用java解析excel文件,获取excel文件中的数据
3)把解析出来的数据添加数据库中
4)返回响应信息
笔记4 解析excel文件数据
1)文件上传:fileuploadtest.jspActivityController|->fileUpload()2)使用java解析excel文件:iText,apache-poi关于办公文档插件使用的基本思想:把办公文档的所有元素封装成普通的Java类,程序员通过操作这些类达到操作办公文档目的。 文件---------HSSFWorkbook页-----------HSSFSheet行-----------HSSFRow列-----------HSSFCell
@RequestMapping("/workbench/activity/exportActivitysByIds.do")public void exportActivitysByIds(HttpServletResponse response, HttpServletRequest request) throws Exception {String checkId=request.getParameter("checkId");System.out.println("接收的checkid:"+checkId);String[] ids=checkId.split(",");//切割字符串返回数组//调用service层方法,根据id查询市场活动List<Activity> activityList = activityService.queryActivityByIds(ids);//创建exel文件,并且把activityList写入到excel文件中HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet=wb.createSheet("市场活动列表");HSSFRow row=sheet.createRow(0);HSSFCell cell;//第一行表头String[] titles = {"ID","所有者","名称","开始日期","结束日期","成本","描述","创建时间","创建者","修改时间","修改者"};for (int i = 0 ; i < titles.length ; i ++){cell=row.createCell(i);cell.setCellValue(titles[i]);}//遍历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中获取String[] contents = {activity.getId(), activity.getOwner(), activity.getName(), activity.getStartDate(), activity.getEndDate(), activity.getCost(),activity.getDescription(), activity.getCreateTime(), activity.getCreateBy(), activity.getEditTime(), activity.getEditBy()};for (int j = 0 ; j < contents.length ; j ++){cell=row.createCell(j);cell.setCellValue(contents[j]);}}}//把生成的excel文件下载到客户端response.setContentType("application/octet-stream;charset=UTF-8");response.addHeader("Content-Disposition","attachment;filename=activityList.xls");OutputStream out=response.getOutputStream();wb.write(out);//关闭资源wb.close();out.flush();}
@RequestMapping("/workbench/activity/importActivity.do")public @ResponseBody Object importActivity(MultipartFile activityFile, String userName, HttpSession session){System.out.println("userName="+userName);User user=(User) session.getAttribute(Contants.SESSION_USER);ReturnObject returnObject=new ReturnObject();try {InputStream is=activityFile.getInputStream();HSSFWorkbook wb=new HSSFWorkbook(is);//根据wb获取HSSFSheet对象,封装了一页的所有信息HSSFSheet sheet=wb.getSheetAt(0);//页的下标,下标从0开始,依次增加//根据sheet获取HSSFRow对象,封装了一行的所有信息HSSFRow row=null;HSSFCell cell=null;Activity activity=null;List<Activity> activityList=new ArrayList<>();for(int i=1;i<=sheet.getLastRowNum();i++) {//sheet.getLastRowNum():最后一行的下标row=sheet.getRow(i);//行的下标,下标从0开始,依次增加activity=new Activity();activity.setId(UUIDUtils.getUUID());activity.setOwner(user.getId());activity.setCreateTime(DateUtils.formateDateTime(new Date()));activity.setCreateBy(user.getId());for(int j=0;j<row.getLastCellNum();j++) {//row.getLastCellNum():最后一列的下标+1//根据row获取HSSFCell对象,封装了一列的所有信息cell=row.getCell(j);//列的下标,下标从0开始,依次增加//获取列中的数据String cellValue= HSSFUtils.getCellValueForStr(cell);if(j==0){activity.setName(cellValue);}else if(j==1){activity.setStartDate(cellValue);}else if(j==2){activity.setEndDate(cellValue);}else if(j==3){activity.setCost(cellValue);}else if(j==4){activity.setDescription(cellValue);}}//每一行中所有列都封装完成之后,把activity保存到list中activityList.add(activity);}//调用service层方法,保存市场活动int ret=activityService.saveCreateActivityByList(activityList);returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);returnObject.setRetData(ret);}catch (Exception e){e.printStackTrace();returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);returnObject.setMessage("系统忙,请稍后重试....");}return returnObject;}
前端页面
//给"导入"按钮添加单击事件$("#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");}}});});