本文中的方法只适合Excel2003,要读取Excel2007最好使用poi.jar,据说poi.jar还在更新,jxl.jar已经不更新了,处理Excel文件的读写问题最好还是学习poi.jar ,后续会写随笔记录poi.jar的用法。
读取Excel文件中的内容可以用jxl.jar、poi.jar包,这里只介绍用jxl.jar包的实现方法。首先要导入jxl.jar包,例子中使用的框架是MyBatis+Spring MVC
思路:为避免向本地上传病毒文件等安全问题,导入文件功能一般不会允许读到文件在本地的路径,因此要读取本地文件中的内容必须先将文件上传到服务器,然后从服务器的路径中读取。因此导入Excel文件数据的过程为:
(1)上传Excel文件到服务器。
(2)用jxl.jar包中的方法读取保存在服务器路径中的Excel文件的数据。
(3)将读取的数据保存到对象中并插入数据库。
步骤1:文件上传:
(1)jsp页面的form表单中添加属性:enctype="multipart/form-data"。
<form:form id="" modelAttribute="" action="" method="post" enctype="multipart/form-data" class="">
(2)form表单中有一个file组件 :
<input type="file" id="" name="" />
如果希望点击“文件导入 ”按钮就直接弹出选择文件窗口,不想将文件的input显示出来,可以将input设置成隐藏的,当点击按钮时触发function,在触发的function中设置该文件input的click事件。比如:
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
<html>
<head>
<script type="text/javascript">
$(document).ready(function() {
//数据导入
$("#import").click(function(){
$("#excelFile").click();
});
});
</script>
</head>
<body>
<form:form id="uploadForm" modelAttribute="" action="" method="post" enctype="multipart/form-data" class="">
<input type="file" id="excelFile" name="" style="display:none"/>
<button id="import" class="" type="button"> Excel文件导入 </button>
</form:form>
</body>
</html>
如果需要对导入文件的格式进行验证,可以写在按钮的onclick事件里:
<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
<html>
<head>
<script type="text/javascript">
$(document).ready(function() {
$("#import").click(function(){
$("#excelFile").click();
checkFile();
});
});
//检查文件类型
function checkFile(){
var array = new Array('xls','xlsx');
var filename = $("#uploadfile ").val();
if(filename == ""){
alert("请选择要上传的文件");
return false;
}else {
//javaScript的match()方法检索与正则表达式相同格式的字符串,返回一个数组,该数组的第0个元素返回的是匹配文本,其余的元素存放的是与正则表达式的子表达式匹配的文本。获得文件类型除了下面的写法外,还可以用:var extStart=filepath.lastIndexOf(".");fileType = filename.substring(extStart, filename.length);来替代
var fileType = filename.match( /^(.*)(\.)(.{1,8})$/)[3];//找到文件的后缀
var isExist = false;
for(i in array){
if(fileType.toLowerCase() == array[i].toLowerCase()){
isExist = true;
return true;
}
}
if(isExist == false ){
alert("文件类型不正确");
return false;
}
return true;
}
}
</script>
</head>
<body>
<form:form id="uploadForm " modelAttribute="" action="" method="post" enctype="multipart/form-data" class="">
<input type="file" id="excelFile" name="" style="display:none"/>
<button id="import" class="" type="button"> Excel文件导入 </button>
</form:form>
</body>
</html>
(3)选择完文件且验证过文件类型后,提交表单跳转到导入文件对应的处理方法
<head>
<script type="text/javascript">
$(document).ready(function() {
//数据导入
$("#import").click(function(){
$("#excelFile").click();
var t = checkFile();
if(t){
$("#uploadForm").attr("action","${ctx}/app/test/importExcel");
$("#uploadForm").submit();
}
});
});
</script>
</head>
(4)后台类
//Excel格式数据导入
@RequestMapping(value = "importExcel")
public String importExcel(@RequestParam(value="excelFile", required=false) MultipartFile file, RedirectAttributes redirectAttributes, HttpServletResponse response)
{
InputStream fis = null;
String uploadPath = SystemPath.getSysPath() + "WEB-INF/views/app/upload" + File.separator;
String fileName = file.getOriginalFilename(); //文件名称
String path = uploadPath + fileName.substring(0, fileName.lastIndexOf(".")) + DateTimeUtil.get_YYYYMMDDHHMMSS(ne Date())+fileName.substring(fileName.lastIndexOf("."), fileName.length());//为了在服务器中放的文件不重复,修改文件名,在文件名中加上时间
File uploadFile = new File(path);
try {
file.transferTo(uploadFile);//将本地文件中的内容上传到服务器文件
fis = new FileInputStream(path);
Workbook wb = Workbook.getWorkbook(fis);//jxl.jar中读取Excel文件内容的方法
if(!judgeExcelModel(wb)){//judgeExcelModel为判断Excel文件格式的方法,根据具体情况自行添加
FileUtils.deleteFile(path);
addMessage(redirectAttributes, "Excel格式错误,请下载平台提供的模板");
}else{
int sheet_size = wb.getNumberOfSheets();//工作栏的数量
for(int index=0;index<sheet_size;index++){
Sheet sheet = wb.getSheet(index);//工作栏的内容
for(int i=1;i<sheet.getRows();i++){
Student stu = new Student();
String age = sheet.getCell(0, i).getContents();
String name = sheet.getCell(1, i).getContents();
String class = sheet.getCell(2, i).getContents();
String school = sheet.getCell(3, i).getContents();
stu .setAge(age );
stu .setName(name);
stu .setClass(class);
stu .setSchool(school);
stu Service.insert(stu );
}
}
addMessage(redirectAttributes, "批量导入数据成功");
FileUtils.deleteFile(path);//导入成功后将服务器中的文件删掉
}
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (BiffException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}finally{
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
到这里,已经完成导入Excel文件数据的功能,在具体应用时,应该还需要对插入数据库的各数据进行验证,将验证通过的记录放在list集合中,等所有记录验证结束后再一起将验证通过的数据插入到数据库。
- excel to datatable (c#用NPOI将excel文件内容读取到datatable数据表中)
将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable /// <sum ...
- 图解SSIS监视文件夹并自动导入数据
原文:图解SSIS监视文件夹并自动导入数据 演示案例:让系统自动监视文件夹,并把文件夹下面的excel文件导入到sql中,之后清空目录.这个过程以往都需要写程序来实现或者定时执行,现在可以用ssis来 ...
- Java使用jxl.jar包写Excel文件的最适合列宽问题基本实现
以前用jxl.jar包,读写过Excel文件.也没有注意最适合列宽的问题,但是jxl.jar没有提供最适合列宽的功能,上次用到写了一下,可以基本实现最适合列宽. 注意,这个只是基本可以实现,基本针对中 ...
- excel导出 jxl.jar包
导入jxl.jar包, 代码如下: package com.gree; import java.io.IOException; import java.io.OutputStream; import ...
- 在Maven项目中,指定使用阿里云仓库下载jar包
Maven项目中,在pom.xml的</project>标签之前加入一下标签,指定使用阿里云仓库下载jar包. <!-- 使用aliyun maven --> <repo ...
- 基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
思路: 1.首先,页面前端,上传附件,提交给后台,并带一个随机性的参数(可以用时间戳): 2.后端接收附件,做一系列的逻辑处理,无误后,将对应的文件存储在上传的目录下: 3.然后前端,上传附件成功后, ...
- PLSQL导入Excel文件预览不到数据行问题
今天,从Excel导入Oracle一些数据,在导入的过程中,遇到一个问题,Excel里面有好几万条数据,但是通过PLSQL导入向导导入Excel文件之后,在PLSQL里却预览不到数据行,只能看见标题行 ...
- 通过Excel文件快速创建页面和数据表
在设计一个软件系统,构建过程:需求->数据表->系统开发.实际情况是需求(数据)很多来源于已经存在的文件中,客户会要求把这些数据“电子化”,这就给需求分析产生了很大的工作量: 分析这些原始 ...
- excel文件使用navicat工具导入mysql的方法
1.在excel文件的sheet上,第1行下面插入一行,对应DB里面的字段名称,方便后面导入时做字段匹配: 2.使用Navicat ,打开工具,选择表所在的数据库,然后点击数据库名字,右键Tables ...
随机推荐
- Log4net日志记录、详细配置(自己使用)
[来自百度百科的一句介绍]log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. 1.首先添 ...
- Java反射机制剖析(四)-深度剖析动态代理原理及总结
动态代理类原理(示例代码参见java反射机制剖析(三)) a) 理解上面的动态代理示例流程 a) 理解上面的动态代理示例流程 b) 代理接口实现类源代码剖析 咱们一起来剖析一下代理实现类($Pr ...
- 关于win10和sqlserver的兼容性
本人主要是用.NET开发一些MIS(信息管理系统)系统,如酒店管理系统,医院管理系统,以及其附属的如餐饮管理系统,洗浴管理系统,以及医保管理系统,合疗管理系统,前期开发的产品主要是VS2008+sql ...
- OpenCV探索之路(十五):角点检测
角点检测是计算机视觉系统中用来获取图像特征的一种方法.我们都常说,这幅图像很有特点,但是一问他到底有哪些特点,或者这幅图有哪些特征可以让你一下子就识别出该物体,你可能就说不出来了.其实说图像的特征,你 ...
- AutoMapper总结
AutoMapper是一个对象和对象间的映射器.对象与对象的映射是通过转变一种类型的输入对象为一种不同类型的输出对象工作的.让AutoMapper有意思的地方在于它提供了一些将类型A映射到类型B这种无 ...
- linux压缩及vi操作
一:Linux的压缩方式 1.tar cvf 对文件进行压缩,tar cvf+压缩文件完成的命名+需要压缩的文件 2,tar -tf +命名的压缩文件:表示查看目录里面的内容 3,tar -xf 解压 ...
- 使用 after 伪类清除浮动
以前清除浮动的时候总是在想要清除浮动的元素后面添加 <div style="clear:both;"></div> 或者写在br标签里面来解决,但这样会增加 ...
- kotlin成长之路
前言: 从接触Kotlin开始,也就是我今天开启写技术博客的决定,文采不佳,欢迎各位阅读者的理解与指点.而该篇文章是最为博客新手的我对Kotlin成长的引导篇,所以内容一般是Kotlin技术博客的目录 ...
- JQuery--Ajax 异步操作 动态添加节点 (新人试水,求支持)
异步操作动态添加节点,导致在代码中给添加的节点全局绑定事件或者获取元素无效,上代码: $(function () { var IP = '...'; // 页面中的默认编号起始值 和 公用IP前缀 s ...
- Hadoop集群搭建(非HA)
1.准备Linux环境 1.0先将虚拟机的网络模式选为NAT 1.1修改主机名 vi /etc/sysconfig/network NETWORKING=yes HOSTNAME=itcast ### ...