项目架构:spring+struts2+hibernate4+oracle

需求:用户导入excel文件,导入到相应的数据表中,要求提供导入模板,支持xls和xlsx文件

思路分析:

1、提供一个下载链接,点击下载,可以使超链接,src直接是项目路径加文件名。

2、通过上传文件,服务器接收上传,返回一个上传后的服务器本地路径,通过ajax异步赋值到jsp的路径隐藏域。

3、ajax异步提交导入请求,后台处理,将路径转换成File,File转换成MultipartFile,将文件读取转换成一个数组类型的集合。

4、循环集合这种的数据,每一行excel数据,是一个元素,将元素转换成相应的java对象进行保存。

一、所需jar包

一共是6个jar包。

二、前端jsp代码部分

<input type="hidden" id="excelFilePath" name="excelFilePath" value="" /><tr><td>选择文件:</td><td><input type="file" name="uploadFile" id="excelFile"></input></input><span id="uploadMsg"></span></td></tr><tr><td></td><td> <input type="button" value="上传" onclick="fileUpload()">&nbsp;<input type="button" value="导入" id="btnOk" disabled="true" onclick="importEmp()"/></td></tr>

<script type="text/javascript">// 文件上传function fileUpload(){$("#fileTypeError").html("");$("#btnOk").attr("disabled",true);var fileName = $("#excelFile").val();var fileType = fileName.substr(fileName.length-4,fileName.length);if(fileType == ".xls" || fileType == "xlsx"){var uploadFileUrl = "${basePath}/public/uploadFile.action";var formData = new FormData($("#mainForm")[0]);$.ajax({type: "POST",  url: uploadFileUrl, data: formData,cache: false,processData: false,  contentType: false, dataType : "json",success: function(data){if(null != data){if (data.dataStatus == "1") {$("#uploadMsg").html("<font color='green'>上传成功!</font>");$("#btnOk").attr("disabled",false);$("#excelFilePath").attr("value",data.dataMain);//alert($("#excelFilePath").val());} else {if (data.errorMsg != null&& data.errorMsg.length > 0) {alert(data.errorMsg);$("#uploadMsg").html("<font color='red'>" +data.errorMsg + "请仔细阅读操作说明!</font>");}}}},error : function(XMLHttpRequest, textStatus,errorThrown) {alert("系统异常[" + textStatus + "]:" + errorThrown);}});}else{$("#uploadMsg").html("<font color='red'>上传文件类型错误,支持类型: .xls .xlsx</font>");}}//Excel文件导入到数据库中       function importEmp(){  var importExcelURL = "${basePath}/public/importResultExaminee.action";var excelFilePath = $("#excelFilePath").val();$.ajax({type: "POST",  url: importExcelURL, data: {"excelFilePath":excelFilePath},cache: false,dataType : "json",success: function(data){if(null != data){if (data.dataStatus == "1") {$("#btnOk").attr("disabled",false);alert("本次成功导入数量:" + data.dataMain);}else{if (data.errorMsg != null&& data.errorMsg.length > 0) {alert(data.errorMsg);}}}},error : function(XMLHttpRequest, textStatus,errorThrown) {alert("系统异常[" + textStatus + "]:" + errorThrown);}})}
</script>

三、核心处理类POIUtils代码:

package com.sinotn.utils;import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;/*** excel导出导入工具类* Copyright (c) 2018 by Sinotn* @author Libin* @date 2018年4月8日 上午9:39:50*/
public class POIUtils {private static Logger logger = Logger.getLogger(POIUtils.class);private final static String XLS = "xls";private final static String XLSX = "xlsx";/*** 读取excel文件* @param formFile* @return* @throws IOException*/public static List<String[]> readExcel(MultipartFile  formFile) throws IOException {// 检查文件
        checkFile(formFile);//获得Workbook工作薄对象Workbook workbook = getWorkBook(formFile);//创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回  List<String[]> list = new ArrayList<String[]>();if (null != workbook) {for (int sheetNum  = 0; sheetNum < workbook.getNumberOfSheets();sheetNum++) {//获得当前sheet工作表  Sheet sheet = workbook.getSheetAt(sheetNum);if (null == sheet) {continue;}//获得当前sheet的开始行  int firstRowNum  = sheet.getFirstRowNum();  //获得当前sheet的结束行  int lastRowNum = sheet.getLastRowNum();  //循环除了第一行的所有行 for (int rowNum = firstRowNum + 1;rowNum <= lastRowNum;rowNum++) {//获得当前行  Row row = sheet.getRow(rowNum);  if(row == null){  continue;  }  //获得当前行的开始列  int firstCellNum = row.getFirstCellNum();  //获得当前行的列数  int lastCellNum = row.getPhysicalNumberOfCells();  String[] cells = new String[row.getPhysicalNumberOfCells()];  //循环当前行  for (int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++) {Cell cell = row.getCell(cellNum);  cells[cellNum] = getCellValue(cell);}list.add(cells);}}workbook.close();  }return list;}/*** 获取当前行数据* @param cell* @return*/@SuppressWarnings("deprecation")private static String getCellValue(Cell cell) {String cellValue = "";  if(cell == null){  return cellValue;  }  //把数字当成String来读,避免出现1读成1.0的情况  if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){  cell.setCellType(Cell.CELL_TYPE_STRING);  }  //判断数据的类型  switch (cell.getCellType()){  case Cell.CELL_TYPE_NUMERIC: //数字  cellValue = String.valueOf(cell.getNumericCellValue());  break;  case Cell.CELL_TYPE_STRING: //字符串  cellValue = String.valueOf(cell.getStringCellValue());  break;  case Cell.CELL_TYPE_BOOLEAN: //Boolean  cellValue = String.valueOf(cell.getBooleanCellValue());  break;  case Cell.CELL_TYPE_FORMULA: //公式  cellValue = String.valueOf(cell.getCellFormula());  break;  case Cell.CELL_TYPE_BLANK: //空值   cellValue = "";  break;  case Cell.CELL_TYPE_ERROR: //故障  cellValue = "非法字符";  break;  default:  cellValue = "未知类型";  break;  }  return cellValue;  }/*** 获得Workbook工作薄对象* @param formFile* @return*/private static Workbook getWorkBook(MultipartFile  formFile) {//获得文件名  String fileName = formFile.getName();//创建Workbook工作薄对象,表示整个excel  Workbook workbook = null;  try {  //获取excel文件的io流  InputStream is = formFile.getInputStream();//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象  if(fileName.endsWith(XLS)){  //2003  workbook = new HSSFWorkbook(is);  }else if(fileName.endsWith(XLSX)){  //2007  workbook = new XSSFWorkbook(is);  }  } catch (IOException e) {  logger.info(e.getMessage());  }  return workbook;  }/*** 检查文件* @param formFile* @throws IOException*/private static void checkFile(MultipartFile  formFile) throws IOException {//判断文件是否存在  if(null == formFile){  logger.error("文件不存在!");  throw new FileNotFoundException("文件不存在!");  }  //获得文件名  String fileName = formFile.getName();//判断文件是否是excel文件  if(!fileName.endsWith(XLS) && !fileName.endsWith(XLSX)){  logger.error(fileName + "不是excel文件");  throw new IOException(fileName + "不是excel文件");  }  }}

四、action层代码

POIUtil.readExcel方法读取excel文件后,把一行中的值按先后顺序组成一个数组,所有的行作为一个集合返回。我们可以在代码中循环这个集合,把数组赋值到实体类对象中。

我在前台用form表单提交file文件,因为用的SpringMVC框架,后台用MultipartFile接收,代码如下:

/*** 读取excel文件中的用户信息,保存在数据库中* @param excelFile*/
@RequestMapping("/readExcel")
public void readExcel(@RequestParam(value = "excelFile") MultipartFile excelFile,HttpServletRequest req,HttpServletResponse resp){Map<String, Object> param = new HashMap<String, Object>();List<User> allUsers = new ArrayList<User>();try {List<String[]> userList = POIUtil.readExcel(excelFile);for(int i = 0;i<userList.size();i++){String[] users = userList.get(i);User user = new User();user.setUserName(users[0]);user.setPassword(users[1]);user.setAge(Integer.parseInt(users[2]));allUsers.add(user);}} catch (IOException e) {logger.info("读取excel文件失败", e);}param.put("allUsers", allUsers);this.userService.insertUsers(param);
}

调用的service层方法就不贴代码了,下面就是往数据库插入数据了。

excel文件内容:

转载于:https://www.cnblogs.com/klslb/p/8759541.html

POI异步导入Excel兼容xsl和xlsx相关推荐

  1. Java实现Excel表格数据的导入(兼容xls与xlsx)

    Java实现Excel表格数据的导入(兼容xls与xlsx) 目录 依赖 代码 注意点 目录 依赖 <!-- 添加POI的依赖用于Excel的操作 --><dependency> ...

  2. java中poi导入excel_java中使用poi实现导入Excel

    1.java中使用poi实现导入Excel public class XlsDto { /** * 选课号 */ private Integer xkh; /** * 学号 */ private St ...

  3. 解决POI导入EXCEL兼容问题

    公司项目中需要用到excel导入,在权衡使用jxl还是POI后,决定使用版本兼容性更好的POI.下面介绍一下使用poi遇到的问题: 一开始写了一个工具类关键代码如下: HSSFWorkbook wor ...

  4. 使用POI+hutool导入Excel并把内容添加到数据库中,直接可以用!!!

    一.需求 经理:小王,你来把这个Excel的数据导入到数据库中.maven包你自己选个熟悉的就行! 小王:好的,经理(内心可视化工具也可以导入,哈哈,但是咱是Java开发人员,要用程序实现) 二.依赖 ...

  5. layui+poi 做 导入 Excel

    点击导出按钮弹出导出选择框 写一个导出按钮 <button class="layui-btn layui-btn-sm" lay-event="importExce ...

  6. SpringBoot+POI实现导入Excel时验证并返回错误Cell标红的文件

    场景 SpringBoot中使用POI实现Excel导入到数据库(图文教程已实践): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details ...

  7. java导入excel数据_java使用POI批量导入excel数据的方法

    一.定义 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 二.所需jar包: 三.简单的一个读取e ...

  8. java 批量读取excel表格内容_java 使用POI批量导入excel数据

    一.定义 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 二.所需jar包: 三.简单的一个读取e ...

  9. ssh poi导出导入Excel

    首先需要导入支持jar包 poi-3.11-20141221.jar poi-ooxml-3.11-20141221.jar poi-ooxml-schemas-3.11-20141221.jar x ...

最新文章

  1. Vue.js 2.0 学习重点记录
  2. JavaScript实现重置表单(reset)的方法
  3. 一个简单的运算表达式解释器例子
  4. 猜想:汇编指令push和pop对sp的处理顺序缘由
  5. 使用await和async关键字开发nodejs应用批量取出简书网站的文章标题和超链接
  6. 此 sqltransaction 已完成;它再也无法使用_手把手教你如何修眉毛,学会再也不用花钱去美容院了...
  7. Exynos4412 Uboot 移植(一)—— Uboot 编译流程分析
  8. Java代码性能优化常用方法
  9. mysql+时间串联_mysql时间操作
  10. windows快捷键之预览窗格
  11. 华为交换机不同VLAN间通信的两种主流解决方案,一分钟快速掌握
  12. Java实现批量文件加密
  13. 自动驾驶之-MATLAB环境下利用单目摄像头和语义分割创建占位栅格(occupancy grid)
  14. Python亲戚计算器
  15. 路由之间通过静态通信(+回环)
  16. P2947 向右看齐
  17. 分答项目_知识点:如何获取jquery选择器生成的input元素数组中的每个input元素的值?
  18. 嵌入式软件开发杂谈(4):Binutils工具集
  19. 杭州软件测试人员工资水平,【华为杭州研究所工资】软件测试工程师待遇-看准网...
  20. Linux系统引导过程及引导修复详解

热门文章

  1. IntelliJ IDEA导航特性Top20
  2. Java提高篇——Java 异常处理
  3. 【前端开发系列】—— CSS3属性选择器总结
  4. computer vision(计算机视觉)方面的期刊会议,学术必备
  5. Python-OpenCV 处理视频(一)(二): 输入输出 视频处理
  6. Python配置OpenCV时报错:ImportError DLL load failed: %1 不是有效的 Win32 应用程序
  7. Waffles——机器学习开发包
  8. java学习笔记8--接口总结
  9. 中国计算机学会CCF推荐国际学术会议和期刊目录-交叉/综合/新兴
  10. 你得学会并且学得会的Socket编程基础知识