POI异步导入Excel兼容xsl和xlsx
项目架构: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()">
<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文件内容:
POI异步导入Excel兼容xsl和xlsx的更多相关文章
- poi批量导入excel文件
package com.practice.util; import java.io.File; import java.io.FileInputStream; import java.io.FileN ...
- java 使用POI批量导入excel数据
一.定义 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 二.所需jar包: 三.简单的一个读取e ...
- NPOI导入excel为datatable (xls xlsx xlsm)
使用NPOI导入导出Excel(xls/xlsx)数据到DataTable中 http://www.cnblogs.com/songrun/p/3547738.html NPOI 2.0教程 – 自动 ...
- Asp.Net异步导入Excel
故事:用户在页面上传一个excel文件,程序把excel里的内容入库. 技术方案:保存文件在服务器,jquey Ajax 异步读取文件中的记录到数据库,在页面实时刷新导入情况 页面前端 <%@ ...
- MVC异步 导入excel文件
View页面 js文件.封装到一个js文件里面 (function ($) { //可以忽略 var defaultSettings = { url: "http://upload.zhtx ...
- Java入门开发POI读取导入Excel文件
Apache POI是Apache开发的开源的跨平台的 Java API,提供API给Java程序对Microsoft Office格式档案进行各种操作. POI中Excel操作很简单,主要类有 HS ...
- C#:导入Excel通用类(Xlsx格式)
一.引用插件EPPlus.dll 插件下载地址:https://pan.baidu.com/s/1jEl7iu1H_C7-j9Wq37xIRQ 提取密码:pdy6 二.定义通用类XlsxExce ...
- java poi 导入excel
最近项目需要导入excel,网上有很多例子,自己整合记录下,兼容2003和2007,暂时没有添加图片处理功能. 所需jar包 http://pan.baidu.com/s/1sjPuWDR pack ...
- Java POI导入Excel文件
今天在公司需要做个导入Excel文件的功能,所以研究了一下,参考网上的一些资料总算是做出来了,在此记录一下防止以后忘记怎么弄. 本人用的是poi3.8,所以需要的JAR包如下: poi-3.8.jar ...
随机推荐
- 如何学好C和C++
酷壳上的两篇文章,转载至此,学好C和C++. 我相信,这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子.比如:你长期地使用Java和.NET ...
- javaweb 开发所需工具和入门教程文档等
下载网址 1.JDK1.8下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...
- jenkins 提示No emails were triggered
发送邮件 Jenkins->系统管理->系统设置,在“邮件通知”里设置smtp服务器地址,以及发送者邮箱地址,在具体的任务构建完成以后,可以设置发送邮件,在某一个任务的"Add ...
- zoj 2772 Quick Change
Quick Change Time Limit: 2 Seconds Memory Limit: 65536 KB J.P. Flathead's Grocery Store hires c ...
- 70.打印所有Spring boot载入的bean【从零开始学Spring Boot】
[从零开始学习Spirng Boot-常见异常汇总] 问题的提出: 我们在开发过程当中,我们可能会碰到这样的问题:No qualifying bean 就是我们定义的bean无法进行注入,那到底是什 ...
- asp.net mvc数据验证
文章:asp.net mvc3 的数据验证(一) 文章:ASP.NET MVC下的四种验证编程方式 这个讲了在一个地方展示验证信息 文章:[ASP.NET MVC系列]浅谈数据注解和验证 这个在每个输 ...
- To_Date函数用法
spl> select * from emp where dates between to_date('2007-06-12 10:00:0 ...
- hihoCoder #1067 : 最近公共祖先·二 [ 离线LCA tarjan ]
传送门: #1067 : 最近公共祖先·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上上回说到,小Hi和小Ho用非常拙劣——或者说粗糙的手段山寨出了一个神奇的网站 ...
- ZeptoLab Code Rush 2015 C. Om Nom and Candies [ 数学 ]
传送门 C. Om Nom and Candies time limit per test 1 second memory limit per test 256 megabytes input sta ...
- ESI 动态缓存技术[转载]
任何一个Web网站的内容都是在不断更新和变化,但这并不意味这这个网站的内容就是动态内容,事实上,动态的内容是指用户每次点击 相同的链接时取的的内容是由Web服务器应用程序生成的,如常见得ASP,JSP ...