之前用的jxl,但是遇到07版以上的.xlsx后缀的文件,目前jxl我无法解决.
就用POI做了个简单的导入Excel表,含.xls和.xlsx后缀的导入.
POI中这两种后缀的文件,是使用2个对象来操作的.
先写思路,后附上代码.
POI跟JXL有所不一样.
POI需要excel文件上传的全路径,用全路径创建IO流,再进行操作.(JXL需要excel文件上传后的File对象就可以直接操作了.)
创建好IO流后,就需要判断一下了,判断后缀是.xls或是.xlsx
.xls 对应 HSSFWorkbook book=new HSSFWorkbook(io);
.xlsx 对应 XSSFWorkbook book=new XSSFWorkbook(io)
说到这就有个问题了,我写完程序跑起来之后,.xls文件导入没问题,但是.xlsx文件还是报错.
网上查了查看别人的POI包我都有就是版本不一样,觉得不是这的问题.不过还是换包试了试.原来问题就在这.
我之前的jar包:
从新下载的jar包:
别的版本的jar包不知道,反正上面的亲测有效.
如果你写完代码,.xls的能跑,.xlsx的报异常,可能就是jar包问题了.
之后附上代码,因为是自己练习,没有加上什么验证,只是为了跑通的.
/**
* 文件上传
*/
@RequestMapping("/fenye/excelfile")
public String excelfile(HttpServletRequest request,MultipartFile excel,Model model ){
/*获取工程根路径*/
String path=request.getSession().getServletContext().getRealPath("");
System.out.println(path);
/*获取文件名称,并用UUID替换文件名*/
String name=UUID.randomUUID().toString()+excel.getOriginalFilename()
.substring(excel.getOriginalFilename().lastIndexOf("."));
/*组合新文件存储的完整路径*/
String newName=path+"/excel/"+name;
/*创建文件对象*/
File file=new File(newName);
/*判断文件路径是否存在,如不存在创建文件夹*/
if(!file.exists()){
file.mkdirs();
}
try {
/*写入文件*/
excel.transferTo(file);
model.addAttribute("msg", "文件上传成功!");
} catch (IllegalStateException | IOException e) {
model.addAttribute("msg", "文件上传失败!");
e.printStackTrace();
}
String msg=fenYeService.importExcel(newName);
model.addAttribute("msg", msg);
return "upLoadFile";
}
/**
* 导入excel
*/
private static final int STARTNO=0;
@Override
public String importExcel(String newName) {
/*创建数据库批量导入的集合*/
List<Excel> list=new ArrayList<>();
/*工作空间对象*/
Workbook book=null;
/*文件流对象*/
FileInputStream input=null;
/*反馈*/
String msg=null;
/*通过后缀判断文件类型是否匹配*/
if(!newName.endsWith(".xls") && !newName.endsWith(".xlsx")){
msg ="文件类型错误!";
return msg;
}
try {
/*将文件放入流中*/
input=new FileInputStream(newName);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
/*如果是低版本就创建低版本对象*/
if(newName.endsWith(".xls")){
try {
book=new HSSFWorkbook(input);
} catch (IOException e) {
e.printStackTrace();
}
}
/*如果是高版本就创建高版本对象*/
if(newName.endsWith(".xlsx")){
try {
book=new XSSFWorkbook(input);
} catch (IOException e) {
e.printStackTrace();
}
}
/*工作表*/
Sheet sheet=null;
/*行*/
Row row=null;
/*列*/
String cell=null;
/*遍历工作表*/
for(int i=STARTNO;i<book.getNumberOfSheets();i++){
/*循环获取每一个工作表*/
sheet=book.getSheetAt(i);
for(int j=sheet.getFirstRowNum()+1;j<sheet.getLastRowNum();j++){
Excel excel=new Excel();
row=sheet.getRow(j);
/*获取属性-编号*/
cell=row.getCell(0).toString();
excel.setCode(cell);
/*姓名*/
cell=row.getCell(1).toString();
excel.setName(cell);
/*部门*/
cell=row.getCell(2).toString();
excel.setDept(cell);
/*日期*/
cell=row.getCell(3).toString();
SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");
try {
excel.setDate(format.parse(cell));
} catch (ParseException e) {
e.printStackTrace();
}
/*备注*/
cell=row.getCell(4).toString();
excel.setRemark(cell);
list.add(excel);
}
}
int y=fileExcelMapper.importFileExcel(list);
if(y>0){
msg="文件导入数据库成功!";
return msg;
}else{
msg="文件导入数据库失败!";
return msg;
}
}