这个功能也是我以前项目中经常用到的,感觉很实用,必须拿来分享下:

excel进行批量导入数据,结合struts2+ajax

导入的视图:batchAdd.ftl(视图无关紧要的,可以换成其他任何视图,就是普通的form表单的提交,就是这里是调用ajax)

<div class="controltitle">当前操作:excel批量导入学生信息</div>
<div>
<form action="excelUploadAction.action" method="post" enctype="multipart/form-data" id="uploadInfor"onSubmit="return validateuploadInforFile(this);"><input type="file" name="uploadExcel"><input type="submit" value="提交"/><a href = "download/stuExcel.xls">[点击下载excel样例]</a>
</form>
</div>
<div><div>下面是导入的excel的样式<font color = "red">[上传的excel中的内容必须按照这个顺序就行排版,否则存储内容的位置会错乱的]</font></div><table class="tablefirst" id="radioSubStyle"><tr><th>姓名</th><th>学号</th><th>性别</th><th>籍贯</th><th>专业</th><th>学制</th><th>入学年份</th><th>毕业年份</th><th>工作省市</th><th>工作单位</th><th>工作岗位</th><th>职务职称</th><th>电话</th><th>手机</th><th>qq</th><th>邮箱</th><th>通信地址</th><th>家庭地址</th></tr><tr><td>沈浪</td><td>1006010054</td><td>男</td><td>汉</td><td>眼7</td><td>7</td><td>2009-11-11</td><td>2011-11-11</td><td>浙江</td><td>医院</td><td>临床</td><td>主任</td><td>642</td><td>159</td><td>5449</td><td>544@qq.com</td><td>杭州</td><td>杭州</td></tr><tr><td>沈浪</td><td>1006010024</td><td>男</td><td>汉</td><td>眼7</td><td>7</td><td>2009-11-11</td><td>2011-11-11</td><td>浙江</td><td>医院</td><td>临床</td><td>主任</td><td>642</td><td>159</td><td>5449</td><td>544@qq.com</td><td>杭州</td><td>杭州</td></tr><tr><td>沈浪</td><td>1006010034</td><td>男</td><td>汉</td><td>眼7</td><td>7</td><td>2009-11-11</td><td>2011-11-11</td><td>浙江</td><td>医院</td><td>临床</td><td>主任</td><td>642</td><td>159</td><td>5449</td><td>544@qq.com</td><td>杭州</td><td>杭州</td></tr></table><div><font color="red">注:①excel各列的顺序必须按样式的顺序,而内容可依实际内容而定;这里不支持照片的导入,照片可在修改中进行上传②性别只能为‘男’与‘女’;③专业只能填:眼视光七年制;眼视光本科;眼视光专科;否则会影响后面的查询</font></div>
</div>
<div id="excelUploadMsg"></div>

传入的js(ajax+文件的验证):这里涉及到的ajax可以去阅读:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452670.html

/*** 以下是上传excel的一系列方法* */
function validateuploadInforFile(form){if(!validateExcelUpLoadFile(form)) return false;var options = { dataType: 'json',success: showResponse };$("#uploadInfor").ajaxSubmit(options); return false;
}function showResponse(responseText){$("#excelUploadMsg").empty();$("#excelUploadMsg").append(responseText.msg);}
//导入考试时进行文件格式校验
function validateExcelUpLoadFile(form) {var fileName = form.uploadExcel.value;if (fileName != "" ) {var fileType = (fileName.substring(fileName.lastIndexOf(".") + 1, fileName.length)).toLowerCase();var suppotFile = ["xls", "XLS", "xlsx", "XLSX"];for (var i = 0; i < suppotFile.length; i++) {if (suppotFile[i] == fileType) {return true;} else {continue;}}alert("文件格式不正确!");return false;} else {alert("请选择你需要的导入 的文件");return false;}
}

struts.xml:

<!-- excel导入 --><action name="excelUploadAction" class="xidian.sl.action.StuInforAction" method = "excelUpload"><interceptor-ref name="fileUpload"/><interceptor-ref name="defaultStack" /><result name="success">/WEB-INF/responseMsg.jsp</result></action>

action中的方法处理:再次进行文件的验证和调用服务层进行excel的处理和数据持久化

//以下为单文件上传,即excelprivate File uploadExcel;                                                //文件private String uploadExcelFileName;                                        //文件名private static String[] allowFileType = { "xls", "XLS", "xlsx", "XLSX" };     //控制文件类型/*** excel批量导入* */public String excelUpload(){try{if ((uploadExcelFileName == null) || (uploadExcelFileName.equals(""))) {response = "{success:false,msg:'文件名不能为空!'}";}if (!(FileUtil.validateFileType(uploadExcelFileName, allowFileType))) {   //validateFileType方法在FileUtil中,返回的是boolean值response = "{success:false,msg:'文件类型不正确!'}";}excelBatchInput.uploadStu(uploadExcel);                                    //只传入一个excel文件response = "{success:true,msg:'"+excelBatchInput.getFinalMsg()+"'}";    //得到结果的回复}catch (Exception e) {e.printStackTrace();response = "{success:true,msg:'sorry: 导入失败'}";}return SUCCESS;}

serviceInterface:

package xidian.sl.service.admin;import java.io.File;public interface ExcelBatchInput {/*** excel导入的主要逻辑* */public String uploadStu(File upload);/*** 导入后的消息* */public String getFinalMsg();
}

ServiceImpl:(这里对excel的内容没有做过多的验证,只是验证了学号为不重复,大家可以自行对其进行添加)

package xidian.sl.service.impl.admin;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.LabelCell;
import jxl.Sheet;
import jxl.Workbook;
import xidian.sl.dao.admin.StuInforDAO;
import xidian.sl.entity.StuInfor;
import xidian.sl.service.admin.ExcelBatchInput;public class ExcelBatchInputImpl implements ExcelBatchInput {private Sheet sheet;private String[][] excelValue;private int successRow;private int failRow;private StringBuilder msg=new StringBuilder();private String finalMsg;private StuInforDAO stuInforDAO;/*** excel导入的总方法*/public String uploadStu(File upload) {initExcel(upload);        //初始化readExcel();            //读取insertIntoDB();            //插入return msg.toString();}/*** 读取excel文件中数据,保存到sheet对象中* @param upload*/private void initExcel(File upload) {Workbook rwb = null;try {InputStream is = new FileInputStream(upload);rwb = Workbook.getWorkbook(is);sheet = rwb.getSheet(0);}     catch (Exception e) {e.printStackTrace();}}/*** 读取excel中数据进入excelValue数组中*/private void readExcel(){excelValue = new String[sheet.getRows()][sheet.getColumns()];for (int i = 0; i < sheet.getRows(); i++)for (int j = 0; j < sheet.getColumns(); j++) {Cell cell = sheet.getCell(j, i);if ("".equals(cell.getContents().toString().trim())){excelValue[i][j] = "";}if (cell.getType() == CellType.LABEL) {LabelCell labelcell = (LabelCell)cell;excelValue[i][j] = labelcell.getString().trim();} else if (cell.getType() == CellType.NUMBER){excelValue[i][j] = cell.getContents();} else if (cell.getType() == CellType.DATE) {DateCell datcell = (DateCell)cell;excelValue[i][j] = datcell.getDate().toString();} else {excelValue[i][j] = cell.getContents().toString().trim();}}}/*** 3.保存进入数据库* @param course*/private void insertIntoDB() {int excelRows = excelValue.length;//将消息清空msg.delete(0, msg.length());finalMsg = "";successRow = 0;failRow = 0;if (excelValue.length > 1) {for (int i = 1; i < excelRows; i++) {        //从第二排开始,第一排为文字说明String[] DBValue = excelValue[i];        //取一行数据if (validateInfor(i,DBValue)){successRow += 1;finalInsert(DBValue);} else {failRow += 1;}}finalMsg = "录入成功结束:"+"</br>"+"目标导入学生:"+(successRow+failRow)+"</br>"+"成功录入数:"+(successRow)+"</br>"+"失败录入数:"+(failRow)+"</br>"+msg.toString();System.out.println(finalMsg);} else {finalMsg = "excel中无任何数据!";System.out.println("excel中没有任何数据");}}//最终返回检验结果private boolean validateInfor(int i,String[] DBValue){Boolean bol=true;if(!(validateNumRepeat(i,DBValue))){bol=false;}return bol;}//验证岗位是否重复private boolean validateNumRepeat(int i,String[] DBValue){boolean bolValidate=true;/*** 主要检查学号是否有重复* 这里需要改进,因为这里会每插入一条就会进行一次数据库的搜索* */String hql = "from StuInfor";List<StuInfor> stuInfors = stuInforDAO.getStuInforListByHQL(hql);for(StuInfor stuInfor: stuInfors){if(stuInfor.getStuNum().equals(DBValue[1]) && DBValue[1]!=""){bolValidate=false;msg.append("错误信息:第"+i+"学生的学号与数据库已存储的重复,该学号是["+DBValue[1]+"],导入的学生名字["+DBValue[0]+"],请检查!</br>");return bolValidate;}}return bolValidate;}//最终插入数据,这里需要修改private void finalInsert(String[] DBValue){StuInfor stuInfor = new StuInfor();stuInfor.setStuName(DBValue[0]);stuInfor.setStuNum(DBValue[1]);stuInfor.setStuSex(DBValue[2]);stuInfor.setStuJg(DBValue[3]);stuInfor.setStuZy(DBValue[4]);stuInfor.setStuXz(DBValue[5]);stuInfor.setStuStartTime(DBValue[6]);stuInfor.setStuEndTime(DBValue[7]);stuInfor.setStuWorkAddress(DBValue[8]);stuInfor.setStuWorkPlace(DBValue[9]);stuInfor.setStuWorkPost(DBValue[10]);stuInfor.setStuWorkZc(DBValue[11]);stuInfor.setStuPhone(DBValue[12]);stuInfor.setStuTelephone(DBValue[13]);stuInfor.setStuQq(DBValue[14]);stuInfor.setStuEmail(DBValue[15]);stuInfor.setStuCommAddress(DBValue[16]);stuInfor.setStuAddress(DBValue[17]);stuInfor.setDeleteSign("1");stuInforDAO.makePersistence(stuInfor);}public Sheet getSheet() {return sheet;}public void setSheet(Sheet sheet) {this.sheet = sheet;}public String[][] getExcelValue() {return excelValue;}public void setExcelValue(String[][] excelValue) {this.excelValue = excelValue;}public int getSuccessRow() {return successRow;}public void setSuccessRow(int successRow) {this.successRow = successRow;}public int getFailRow() {return failRow;}public void setFailRow(int failRow) {this.failRow = failRow;}public StringBuilder getMsg() {return msg;}public void setMsg(StringBuilder msg) {this.msg = msg;}public String getFinalMsg() {return finalMsg;}public void setFinalMsg(String finalMsg) {this.finalMsg = finalMsg;}public StuInforDAO getStuInforDAO() {return stuInforDAO;}public void setStuInforDAO(StuInforDAO stuInforDAO) {this.stuInforDAO = stuInforDAO;}
}

里面涉及到的持久层的操作我这里就省略不写了

转载于:https://www.cnblogs.com/shenliang123/archive/2012/04/17/2453664.html

excel批量导入数据相关推荐

  1. 【转帖】Java实现Excel批量导入数据

    这篇文章主要为大家详细介绍了Java实现Excel批量导入数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Excel的批量导入是很常见的功能,这里采用Jxl实现,数 ...

  2. SpringMVC框架通过Excel批量导入数据

    文章目录 SpringMVC框架通过Excel批量导入数据 1.导入需要的jar包 2.配置文件 3.创建Java对象类 4.解析Excel表格数据的工具类 5.前端请求 6.Controller处理 ...

  3. Spring Boot 实现excel 批量导入数据(模板下载 ->数据导入->导入失败表格下载)

    批量导入数据以用户为例[不贴数据库操作代码,都是简单的插入和查询操作自己写] 1 导入依赖 2 批量导入模板下载 3 批量导入数据 准备工作 实现代码 测试接口 4 下载导入失败表格 5 实体类 6 ...

  4. java使用POI实现Excel批量导入数据。

    1.背景 项目中有使用easypoi,处理常规excel问题,但是现在有个需求,需要动态生成导出的报表字段.同时,根据导入的excel,增加数据信息.(有可能会出现,导入的报表是几天前下载的,不会最新 ...

  5. EXCEL批量导入数据MVC

    这里简单实现EXCEL的批量导入 直接看代码,里面有注释 前端页面实现 @{ ViewBag.Title = "批量添加数据"; //Layout = null; } href=& ...

  6. Springboot Excel批量导入数据

    POI处理Excel <!-- poi处理excel --><dependency><groupId>org.apache.poi</groupId>& ...

  7. Java实现Excel批量导入数据

    Excel的批量导入是很常见的功能,这里采用 Jxl实现,数据量或样式要求较高可以采用 poi 框架环境:Spring + SpringMvc(注解实现) 首先导入依赖jar包 <depende ...

  8. 如何使用excel批量导入数据到数据库?看这一篇就够了!超详细

    应用场景 当我们遇到要批量新增数据库条数的时候 1.你可以写一个接口去用excel去导入,可以自动化,但是前提是你知道你要新增的表和流程才可以 2.可以用excel直接进行数据库导入 excel导入数 ...

  9. php 用excel 批量导入数据

    public function post(){if($this->request->isPost()){vendor("PHPExcel.PHPExcel");//导入 ...

最新文章

  1. MindSpore后端运行类
  2. pytorch实现手写数字识别_Paddle和Pytorch实现MNIST手写数字集识别对比
  3. 小米语音首席科学家Daniel Povey:下一代Kaldi将走向何方?
  4. 最佳实践系列:前端代码标准和最佳实践
  5. 不可思议的素数(上)(文末送书)
  6. 云时代 揭开性能监测战略的隐秘优势
  7. python刷阅读_简单的37行python爬虫刷CSDN博客阅读数
  8. 边缘检测后去除噪点_Street Lanes Finder - 检测自动驾驶汽车的车道
  9. 2012年云计算领域将发生6件大事
  10. Java21天打卡-Day15 数组
  11. HDU2188 选拔志愿者【巴什博弈】
  12. oracle sql 查询无数据_信运大讲堂丨ORACLE数据库SQL和索引
  13. 日志系统模块基础、C语言实现一个日志模块、zlog日志模块基础
  14. My Firest FireMonkey App
  15. WS2812B 5050数据整理
  16. 国产数据库--HighGo DB(瀚高数据库)
  17. Python实战:利用正则表达式(requests模块)获取电影排行榜
  18. Android系统各个版本发布时间
  19. 3.3. debug ip igrp
  20. 数据库《实验一 SQL Server数据库及对象的设计》

热门文章

  1. SpringMVC:400 Bad Request
  2. Tomcat服务器报错IOException: Broken pipe
  3. meta refresh 刷新
  4. msclass 文字滚动_MSClass (通用不间断滚动JS封装类)
  5. 【PAT乙】1030 完美数列 (25分) 枚举
  6. 【codevs1295】N皇后问题
  7. php 批量删除挂马文件夹,PHP批量挂马脚本
  8. java多线程上传文件_Java大文件分片上传/多线程上传
  9. Python入门--字符串的判断操作
  10. 排列:计算1!+2*2!+3*3!+...+n*n!