当前位置:网站首页>第3章业务功能开发(导入市场活动,apache-poi)
第3章业务功能开发(导入市场活动,apache-poi)
2022-07-15 22:56:00 【做一道光】
客户需求
用户在市场活动主页面,点击"导入"按钮,弹出导入市场活动的模态窗口;
用户在导入市场活动的模态窗口选择要上传的文件,点击"导入"按钮,完成导入市场活动的功能.
*只支持.xls
*文件大小不超过5MB
*导入成功之后,提示成功导入记录条数,关闭模态窗口,刷新市场活动列表,显示第一页数据,保持每页显示条数不变
*导入失败,提示信息,模态窗口不关闭,列表也不刷新
功能开发知识点
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
2,文件上传:上传的文件跟用户约定好的。
3,js截取字符串:
str.substr(startIndex,length)
str.substr(startIndex)//从下标为startIndex的字符开始截取,截取到字符串的最后
str.substring(startIndex,endIndex)
功能开发
1.根据客户需求,画出导入市场活动功能开发UML图

2.mapper层
activitymapper接口

activitymapper.xml文件
<insert id="insertActivityByList" parameterType="com.it.crm.workbench.entity.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>
3.service层
activityService接口

activityServiceImpl实现类

4.controller层
activityController类
@RequestMapping(value = "/workbench/activity/importActivity.do")
public @ResponseBody Object importActivity(MultipartFile activityFile, HttpSession session){
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.setReturnData(ret);
}catch (Exception e){
e.printStackTrace();
returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
returnObject.setMessage("系统忙,请稍后重试....");
}
return returnObject;
}5.activity的index.jsp页面
//给导入按钮添加单击事件
$("#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);
//发送请求
$.ajax({
url:'workbench/activity/importActivity.do',
data:formData,
processData:false,//设置ajax向后台提交参数之前,是否把参数统一转换成字符串:true--是,false--不是,默认是true
contentType:false,//设置ajax向后台提交参数之前,是否把所有的参数统一按urlencoded编码:true--是,false--不是,默认是true
type:'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");
}
}
});
});6.配置文件applicationContext-mvc.xml
<!-- 配置文件上传解析器 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>7.HSSFUtils类
package com.it.crm.commons.utils;
import org.apache.poi.hssf.usermodel.HSSFCell;
public class HSSFUtils {
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;
}
}
功能测试
进入市场活动列表页面,点击导入市场活动按钮

选择导入的文件
当导入文件不是xls结尾的文件时,系统弹出提示
当导入文件是xls结尾的文件,但文件大于5M时, 弹出提示不能大于5M。

当导入文件为xls结尾的文件,且文件大小小于5M时,导入的文件数据应该遵循一定规则。本功能导入文件时,文件数据有多少列,每列是什么数据都做了严格规定。

选择符合规则的文件

点击导入

边栏推荐
- class path resource [xxx.properties] cannot be opened because it does not exist
- Istio组件Mixer介绍
- 【vulnhub】FIVE86: 1
- PHP版本新特性摘选 - PHP7.2.x 到 PHP7.4.x
- ACL+ANT综合案例(7.15)
- Advanced process: the independence of programmers to do projects
- 上下文对象实例
- 一文读懂软件测试的常见分类
- [2023 approval in advance] Haier
- npm ERR! cb() never called 处理办法
猜你喜欢

标准化研究院云迁移相关能力要求发布,万博智云参与能力要求和白皮书编写

Kbpc2510w-asemi welding machine special rectifier bridge kbpc2510w

IP静态路由综合实验

Redis - redis list function explanation and industrial application

手机浏览器扫一扫的花样玩法,识万物还能答疑翻译

Asemi rectifier bridge gbj2510 specification, gbj2510 package, gbj2510 characteristics
![Nc19910 [cqoi2007] rectangular rect](/img/92/49ec3a079a5e8bf61c0bd4bcb669af.gif)
Nc19910 [cqoi2007] rectangular rect

ASEMI整流桥GBJ2510规格,GBJ2510封装,GBJ2510特性

Super easy to use screenshot software snipaste (including installation package), how to set snipaste to start automatically

注册表实用技能【持续更新】
随机推荐
Several gorgeous development methods
Loam_livox 代码阅读与总结
Repent of greed stonk
[detailed tutorial] a thorough article on mongodb aggregation query
NC19910 [CQOI2007]矩形RECT
Reinforcement learning (II)
数据治理项目调研环节思考
11 digits of mobile phone number and format verification rules
以太网开发与测试,这一步你做对了吗 (1)
Codeforces Round #787 (Div. 3)
Mersenne prime
传输层 ------ UDP
PHP版本新特性摘选 - PHP5.6.X
想学硬件,该学什么啊?
Go+mysql+redis+vue3 simple chat room, the second bullet: database links and operations
spfa变式题
Five reasons why developers use helix QAC to achieve static code test compliance
keil MDK5,ARM-CC--->的使用
Istio组件Mixer介绍
fastadmin自定义拖拽排序