这篇使用的是Struts2上传方式,承接上篇
https://blog.csdn.net/tt336798/article/details/82150577
思路: 1.选着正确的模板数据
2. 检查是否有单元格为空 --> 记录–>移除
3.检查导入数据是否已存在–>记录 -->移除
4.保存 筛选后的数据
页面文件上传格式验证可供参考:
https://blog.csdn.net/tt336798/article/details/85235167
后台代码:
//struts文件上传的属性
private File file;
private String fileName;
private String contentType;
//doc是页面 input file 的name="doc"
public void setDoc(File file){
this.file=file;
}
public void setDocFileName(String fileName){
this.fileName=fileName;
}
public void setDocContentType(String contentType){
this.contentType=contentType;
}
//导入
public String uploadExcel() throws Exception {
//初始化 request
request=ServletActionContext.getRequest();
HttpSession session=request.getSession();
//文件上传
String realPath=ServletActionContext.getServletContext().getRealPath("/upload_file/file");
String newFileName=generateFileName(fileName);
File destFile=new File(realPath+"//"+newFileName);
FileUtils.copyFile(file, destFile);
//对上传Excel文件进行解析
InputStream in = new FileInputStream(file);
List<List<Object>> listobj=new ImpExcelUtils().getBankListByExcel(in,fileName);
BankBillModel bbm=new BankBillModel();
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd HH:mm:ss");
String title3=String.valueOf(listobj.get(0).get(3))==null?null:String.valueOf(listobj.get(0).get(3));
if(title0.contains("交易时间")){
//1.检测如果有数据不完整,就进行记录改错误在哪一行(从标题下面第一行数起),存入一个集合中,并记录总共有多少条不完整数据和重复数据
int num=0;
List<Integer> rowList=new ArrayList<Integer>();
for(int i=0;i<listobj.size();i++){
//不完整数据:根据标题,填写的内容少于标题数
if(listobj.get(i).size()<listobj.get(0).size()){
num++;
rowList.add(i);
}
}
boolean flag=false;
int excelCount=listobj.size()-1;
//1-1如果检测到所有数据不完整,则导入失败
if(num==excelCount){
String msg="该表单共有"+excelCount+"条数据,有"+num+"数据不完整,请填充完整!";
session.setAttribute("allMsg", msg);
flag=true;
forward="error";
}else{
//1-2.移除不完整数据
if(!rowList.isEmpty()){
//1).再次将行数据组装成 第几行、第几行... 最后存入session中
int row=0;
StringBuffer rowNum=new StringBuffer();
for(int n=0;n<rowList.size();n++){
row=rowList.get(n)+2;
if(n==rowList.size()-1){
rowNum.append("第"+row+"行");
}else{
rowNum.append("第"+row+"行、");
}
}
//2).声明一变量,记录原有中所有数据(listobj)的下标,根据rowList标记的值来移除数据
int count1=0;
Iterator it=listobj.iterator();
while(it.hasNext()){
it.next();
for(int j=0;j<rowList.size();j++){
if(count1==(rowList.get(j))){
it.remove();
}
}
count1++;
}
//不完整数据总数、第几行...,存入session
session.setAttribute("countRow", num);
session.setAttribute("rowIndex", rowNum);
}
flag=false;
}
if(flag==false){
//2.在Excel数据进行保存之前,查询导入数据是否已存在
int length=listobj.size();
double incomeMoney=0.0;
String tradeTime=null;
String userAccount=null;
//记录重复数据,集合记录行数
int repeatCount=0;
List<Integer> repeatList=new ArrayList<Integer>();
for(int h=1;h<length;h++){
List<Object> list=listobj.get(h);
//查询的条件
tradeTime=String.valueOf(list.get(0))==null?null:String.valueOf(list.get(0));
String newTime=strToDateFormat(tradeTime);
incomeMoney=String.valueOf(list.get(1))==null?null:Double.parseDouble(String.valueOf(list.get(1)));
userAccount=String.valueOf(list.get(5))==null?null:String.valueOf(list.get(5));
//查询
BankBillModel bank=bankBillDao.queryRepeatDB(incomeMoney,userAccount,newTime);
if(bank!=null){
repeatCount++;
repeatList.add(h);
}
}
if(repeatCount==listobj.size()-1){
//2-1.如果检测到所有数据已存在,则导入失败
String reaptMsg="需导入数据都已存在!";
session.setAttribute("repeatAllMsg", reaptMsg);
forward="error";
}else{
//2-2.如果有数据重复,把重复的数据移除【去重复】
if(!repeatList.isEmpty()){
//1).前面把不完整数据已移除,后面listobj的重复行数就需要重新计算出现的行数
List<Integer> disRepeatList=new ArrayList<Integer>();
for (Integer rep: repeatList) {
disRepeatList.add(rep + disCount(rowList, rep));
}
//2).把记录重复的数据,组装第几行、第几行.......
int repeat=0;
StringBuffer repeatNum=new StringBuffer();
for(int t=0;t<disRepeatList.size();t++){
repeat=disRepeatList.get(t)+2;
if(t==disRepeatList.size()-1){
repeatNum.append("第"+repeat+"行");
}else{
repeatNum.append("第"+repeat+"行、");
}
}
//3).声明一变量,记录原有中所有数据(listobj)的下标,根据rowList标记的值来移除数据
int count2=0;
Iterator it=listobj.iterator();
while(it.hasNext()){
it.next();
for(int j=0;j<repeatList.size();j++){
if(count2==(repeatList.get(j))){
it.remove();
}
}
count2++;
}
//重复数据总数、第几行....,存入session
session.setAttribute("repeatRow", repeatCount);
session.setAttribute("repeatIndex", repeatNum);
}
//3.把 --缺失数据,重复数据 --去掉后,剩下数据就是需要保存的数据
for(int k=1;k<listobj.size();k++){
List<Object> list=listobj.get(k);
//在这里将数据执行保存
String str=String.valueOf(list.get(0))==null?null:String.valueOf(list.get(0));
//......................
}
forward="input";
}
}
}else{
String errorInfo="选择导入的模板错误,请先确认再导入!";
session.setAttribute("errorTemp", errorInfo);
forward="error";
}
return forward;
}
//string时间格式化
private String strToDateFormat(String date) throws ParseException {
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
formatter.setLenient(false);
Date newDate= formatter.parse(date);
formatter = new SimpleDateFormat("yyyy-MM-dd");
return formatter.format(newDate);
}
//计算次数
private int disCount(List<Integer> list, Integer current) {
int count = 0;
for (Integer li : list) {
if (current >=li) {
count++;
}
}
return count;
}
js页面:file_upload.jsp
首先在页面中会隐藏获取的session
<input style="display:none;" id="errorNum" value="<%=errorNum%>"/>
<input style="display:none;" id="rowIndex" value="<%=rowIndex%>"/>
<input style="display:none;" id="allMsg" value="<%=allMsg%>"/>
<input style="display:none;" id="repeatRow" value="<%=repeatRow%>"/>
<input style="display:none;" id=reptIndex value="<%=repeatIndex%>"/>
<input style="display:none;" id="repeatMsg" value="<%=repeatAllMsg%>"/>
<input style="display:none;" id="errorTempId" value="<%=errorTemp%>"/>
js代码:
$(function (){
var errorTempId=$("#errorTempId").val()
//缺失错误信息
var errorNum=$("#errorNum").val();
var rowIndex=$("#rowIndex").val();
var allMsg=$("#allMsg").val(); //-- 导入失败
//重复错误信息
var repeatRow=$("#repeatRow").val();
var reptIndex=$("#reptIndex").val();
var repeatAllMsg=$("#repeatMsg").val(); // -- 导入失败
if(errorNum!=""&&repeatAllMsg==""&&repeatRow!=""){
var msg=">其中有"+errorNum+"条数据【不完整】,请完善再将其重新导入,位于表格中:\n"+rowIndex;
var newmsg=">有"+repeatRow+"条数据【已存在】,位于表格中:\n"+reptIndex;
alert("有以下数据导入失败:\n"+msg+"\n"+newmsg);
}else if(errorNum!=""&&repeatAllMsg!=""||errorNum==""&&repeatAllMsg!=""){ //1.有不完整,且都重复 或者 2.所有数据都完整,且都重复
alert("数据导入失败:"+repeatAllMsg);
}else if(errorNum==""&&repeatRow!=""){ //所有数据都完整,有几条重复
var msg=">其中"+repeatRow+"条数据【已存在】,位于表格中:\n"+reptIndex;
alert("有以下数据导入失败:\n"+msg);
}else if(errorNum!=""&&repeatRow==""&&repeatAllMsg==""){ //有不完整,没有重复的
var msg=">其中有"+errorNum+"条数据【不完整】,请完善在将其重新导入,位于表格中:\n"+rowIndex;
alert("有以下数据导入失败:\n"+msg);
}
if(allMsg!=""){
alert("数据导入失败:\n"+allMsg);
}
//选择模板错误
if(errorTempId!=""){
alert(errorTempId);
}
});
弹窗效果: