Java解析Excel文件并把数据存入数据库
前段时间做一个小项目,为了同时存储多条数据,其中有一个功能是解析Excel并把其中的数据存入对应数据库中。花了两天时间,不过一天多是因为用了"upload"关键字作为URL从而导致总报同一个错,最后在同学的帮助下顺利解决,下面我把自己用"POI"解析的方法总结出来供大家参考(我用的是SpingMVC和hibernate框架)。
1.web.xml中的配置文件
web.xml中的配置文件就按照这种方式写,只需要把"application.xml"换成你的配置文件名即可
org.springframework.web.context.ContextLoaderListener contextConfigLocation classpath:application.xml
2.application.xml的配置文件(固定写发)
在这个配置文件中你还可以规定上传文件的格式以及大小等多种属性限制
3.文件上传的前端HTML
注意:
1.enctype="multipart/form-data"必须写,封装表单
2.method="post",提交方式必须为"post"提交
3.action="${text}/uploadfile","uploadfile"切记不要写成"upload",否则你找到世界末日也不会找到哪里有问题(本人因为这个折腾了一天多时间)。
请选择正确的excel文件上传 支持的excel格式为:xls、xlsx、xlsb、xlsm、xlst!
4.验证上传文件的格式
//用于验证文件扩展名的正则表达式
functioncheckSuffix(){
varname=document.getElementById("txt").value;
varstrRegex="(.xls|.xlsx|.xlsb|.xlsm|.xlst)$";
varre=newRegExp(strRegex);
if(re.test(name.toLowerCase())){
alert("上传成功");
document.fileupload.submit();
}else{
alert("文件名不合法");
}
}
5.dao层的接口和实现类
packagecom.gxxy.team1.yyd.dao;
publicinterfaceIFileUploadDao{
publicvoidsave(Objecto);
}
packagecom.gxxy.team1.yyd.dao.impl;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Repository;
importcom.gxxy.team1.yyd.dao.IFileUploadDao;
@Repository
publicclassFileUploadDaoImplimplementsIFileUploadDao{
@Autowired
privateSessionFactorysessionFactory;
privateSessiongetSession(){
Sessionsession=sessionFactory.getCurrentSession();
returnsession;
}
@Override
publicvoidsave(Objecto){
getSession().save(o);
}
}
6.service层的接口和实现类
packagecom.gxxy.team1.yyd.service;
importjava.util.List;
publicinterfaceIFileUploadService{
publicListreadExcel(Stringpath);
publicvoidsave(Objecto);
}
packagecom.gxxy.team1.yyd.service.impl;
importjava.io.File;
importjava.io.FileInputStream;
importjava.text.SimpleDateFormat;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.poi.ss.usermodel.Cell;
importorg.apache.poi.ss.usermodel.DateUtil;
importorg.apache.poi.ss.usermodel.Row;
importorg.apache.poi.ss.usermodel.Sheet;
importorg.apache.poi.ss.usermodel.Workbook;
importorg.apache.poi.ss.usermodel.WorkbookFactory;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Service;
importcom.gxxy.team1.yyd.dao.IFileUploadDao;
importcom.gxxy.team1.yyd.service.IFileUploadService;
@Service
publicclassFileUploadServiceImplimplementsIFileUploadService{
@Autowired
privateIFileUploadDaofileDao;
@Override
publicListreadExcel(Stringpath){
SimpleDateFormatfmt=newSimpleDateFormat("yyyy-MM-dd");
Listlist=null;
try{
//同时支持Excel2003、2007
FileexcelFile=newFile(path);//创建文件对象
FileInputStreamis=newFileInputStream(excelFile);//文件流
Workbookworkbook=WorkbookFactory.create(is);//这种方式Excel2003/2007/2010都是可以处理的
intsheetCount=workbook.getNumberOfSheets();//Sheet的数量
//存储数据容器
list=newArrayList();
//遍历每个Sheet
for(ints=0;s
7.controller层实现
//文件上传方法
@RequestMapping("/uploadfile")
publicStringupload(@RequestParam(value="file",required=false)MultipartFilefile,HttpServletRequestrequest,ModelMapmodel,Modelmod)throwsException{
Stringpath=request.getSession().getServletContext().getRealPath("upload");
System.out.println("文件路径:"+path);
StringoriginalFilename=file.getOriginalFilename();
Stringtype=file.getContentType();
//originalFilename=UUID.randomUUID().toString()+originalFilename;
System.out.println("目标文件名称:"+originalFilename+",目标文件类型:"+type);
FiletargetFile=newFile(path,originalFilename);
if(!targetFile.getParentFile().exists()){
targetFile.getParentFile().mkdirs();
}elseif(!targetFile.exists()){
targetFile.mkdirs();
}
//获得上传文件的文件扩展名
Stringsubname=originalFilename.substring(originalFilename.lastIndexOf(".")+1);
System.out.println("文件的扩展名:"+subname);
try{
file.transferTo(targetFile);
}catch(Exceptione){
e.printStackTrace();
}
FileUploadServiceImplfileUp=newFileUploadServiceImpl();
Stringrootpath=path+File.separator+originalFilename;
Listexcellist=fileUp.readExcel(rootpath);
intlen=excellist.size();
System.out.println("集合的长度为:"+len);
for(inti=0;i>power=powerService.power(username);
mod.addAttribute("list",power);
return"redirect:/yyd";
}
以上这7个部分就是我实现解析excel文件并存入数据库的全部代码。希望对大家的学习有所帮助,也希望大家多多支持毛票票。