最近在做项目的时候用到读取excel数据,将excel中的多行数据读取出来插入到数据库中的相应的表中。首先看一下展示图:
首先是页面的两个btn:
然后看一下excel表中的数据格式:
然后看一下读出来的数据:
首先将需要的依赖添加在项目的pom.xml文件中:
org.apache.poi
poi
3.8
commons-codec
commons-codec
org.apache.poi
poi-ooxml
3.8
commons-fileupload
commons-fileupload
1.2.1
commons-io
commons-io
2.4
然后再spring-mvc.xml中添加一下代码:
然后是读取excel文件中的数据:
package com.qcbylearn.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
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;
import com.qcbylearn.entitys.Student;
public class ReadExcel {
//总行数
private int totalRows = 0;
//总条数
private int totalCells = 0;
//错误信息接收器
private String errorMsg;
//构造方法
public ReadExcel(){}
//获取总行数
public int getTotalRows() { return totalRows;}
//获取总列数
public int getTotalCells() { return totalCells;}
//获取错误信息
public String getErrorInfo() { return errorMsg; }
/**
* 读EXCEL文件,获取信息集合
* @param fielName
* @return
*/
public List getExcelInfo(MultipartFile mFile) {
String fileName = mFile.getOriginalFilename();//获取文件名
System.out.println("文件名"+fileName);
List stuList = null;
try {
if (!validateExcel(fileName)) {// 验证文件名是否合格
return null;
}
boolean isExcel2003 = true;// 根据文件名判断文件是2003版本还是2007版本
if (isExcel2007(fileName)) {
isExcel2003 = false;
}
stuList = createExcel(mFile.getInputStream(), isExcel2003);
} catch (Exception e) {
e.printStackTrace();
}
return stuList;
}
/**
* 根据excel里面的内容读取客户信息
* @param is 输入流
* @param isExcel2003 excel是2003还是2007版本
* @return
* @throws IOException
*/
public List createExcel(InputStream is, boolean isExcel2003) {
List stuList = null;
try{
Workbook wb = null;
if (isExcel2003) {// 当excel是2003时,创建excel2003
wb = new HSSFWorkbook(is);
} else {// 当excel是2007时,创建excel2007
wb = new XSSFWorkbook(is);
}
stuList = readExcelValue(wb);// 读取Excel里面客户的信息
} catch (IOException e) {
e.printStackTrace();
}
return stuList;
}
/**
* 读取Excel里面客户的信息
* @param wb
* @return
*/
private List readExcelValue(Workbook wb) {
// 得到第一个shell
Sheet sheet = wb.getSheetAt(0);
System.out.println("gaolei dayin============" +sheet);
// 得到Excel的行数
this.totalRows = sheet.getPhysicalNumberOfRows();
System.out.println("行数======="+this.totalRows);
// 得到Excel的列数(前提是有行数)
if (totalRows > 1 && sheet.getRow(0) != null) {
this.totalCells = sheet.getRow(0).getPhysicalNumberOfCells();
System.out.println("总列数=========="+this.totalCells);
}
List stuList = new ArrayList();
// 循环Excel行数
for (int r = 1; r < totalRows; r++) {
Row row = sheet.getRow(r);
if (row == null){
continue;
}
Student student = new Student();
// 循环Excel的列
for (int c = 0; c < this.totalCells; c++) {
Cell cell = row.getCell(c);
if (null != cell) {
if (c == 0) {
//如果是纯数字,比如你写的是25,cell.getNumericCellValue()获得是25.0,通过截取字符串去掉.0获得25
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
try {
//String studentNumber = String.valueOf(cell.getNumericCellValue());
//String x =studentNumber.substring(0, studentNumber.length()-2>0?studentNumber.length()-2:1);//年龄
student.setStudentnumber(Integer.valueOf((int) cell.getNumericCellValue()));
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("if false");
}
}else{
try {
student.setStudentnumber(Integer.valueOf(cell.getStringCellValue()));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("类型不匹配");
}
}
} else if (c == 1) {
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
String appUserId = String.valueOf(cell.getNumericCellValue());
String x = appUserId.substring(0, appUserId.length()-2>0?appUserId.length()-2:1);//性别
student.setAppuserid(Long.valueOf(x));
}
}
else if (c == 2){
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
String firstName = String.valueOf(cell.getNumericCellValue());
student.setFirstname(firstName);
}else{
student.setFirstname(cell.getStringCellValue());
}
}
else if (c == 3){
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
String middleName = String.valueOf(cell.getNumericCellValue());
student.setMiddlename(middleName);
}else{
student.setMiddlename(cell.getStringCellValue());
}
}
else if (c == 4){
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
String lastName = String.valueOf(cell.getNumericCellValue());
student.setLastname(lastName);
}else{
student.setLastname(cell.getStringCellValue());
}
}
else if (c == 5){
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
String email = String.valueOf(cell.getNumericCellValue());
student.setEmail(email);
}else{
student.setEmail(cell.getStringCellValue());
}
}
else if (c == 6){
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
Integer classNumber = Integer.valueOf((int) cell.getNumericCellValue());
//student.setClassnumber(classNumber.substring(0, classNumber.length()-2>0?classNumber.length()-2:1));
System.out.println("if classnum");
student.setClassnumber(String.valueOf(classNumber));
}else{
student.setClassnumber(cell.getStringCellValue());
System.out.println("else classnum");
}
}
else if (c == 7){
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
String gender = String.valueOf(cell.getNumericCellValue());
student.setGender(gender);
}else{
student.setGender(cell.getStringCellValue());
}
}
else if (c == 8){
if(cell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
String status = String.valueOf(cell.getNumericCellValue());
student.setStatus(status);
}else{
student.setStatus(cell.getStringCellValue());
}
}
}
}
// 添加到list
stuList.add(student);
}
return stuList;
}
/**
* 验证EXCEL文件
*
* @param filePath
* @return
*/
public boolean validateExcel(String filePath) {
if (filePath == null || !(isExcel2003(filePath) || isExcel2007(filePath))) {
errorMsg = "文件名不是excel格式";
return false;
}
return true;
}
// @描述:是否是2003的excel,返回true是2003
public static boolean isExcel2003(String filePath) {
return filePath.matches("^.+\\.(?i)(xls)$");
}
//@描述:是否是2007的excel,返回true是2007
public static boolean isExcel2007(String filePath) {
return filePath.matches("^.+\\.(?i)(xlsx)$");
}
}
service层代码如下:
package com.qcbylearn.serviceimpl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.qcbylearn.dao.StudentMapper;
import com.qcbylearn.entitys.Student;
import com.qcbylearn.services.HelpThreeDoExcelService;
import com.qcbylearn.utils.ReadExcel;
@Service("helpThreeDoExcelService")
public class HelpThreeDoExcelServiceImpl implements HelpThreeDoExcelService {
@Autowired
private StudentMapper studentMapper;
@Override
public String readExcelFile(MultipartFile file) {
//创建处理EXCEL的类
ReadExcel readExcel=new ReadExcel();
//解析excel,获取上传的事件单
List stuList = null;
int insertResult = 0;
String insertMsg = "";
try {
stuList = readExcel.getExcelInfo(file);
//至此已经将excel中的数据转换到list里面了,接下来就可以操作list,可以进行保存到数据库,或者其他操作,
//和你具体业务有关,这里不做具体的示范
//数据库插入
for(Student s :stuList) {
insertResult += studentMapper.insertSelective(s);
System.out.println(s.toString());
}
if(insertResult ==0) {
insertMsg = "All insert false";
}else if(insertResult == stuList.size()){
insertMsg = "All insert success";
}else {
insertMsg = "Part insert success";
}
} catch (Exception e) {
e.printStackTrace();
System.err.println("接受excel表格中的数据失败!!!");
}
for(Student s : stuList) {
System.out.println("打印excel中的数据"+s.toString());
}
return insertMsg;
}
}
controller层:
//添加学生的方法 excel 相关的操作 能够将数据插入到数据库
@Autowired
private HelpThreeDoExcelService helpThreeDoExcelService;
//@ResponseBody
@RequestMapping(value="DoExcel",method= {RequestMethod.POST})
public ModelAndView DoExcel(@RequestParam(value="file_excel") MultipartFile file,HttpServletRequest request) {
ModelAndView mv = new ModelAndView();
String readResult =null;
try {
readResult = helpThreeDoExcelService.readExcelFile(file);
System.out.println("canshu :"+readResult);
} catch (Exception e) {
e.printStackTrace();
System.out.println("upload falure");
}
System.out.println("插入结果="+readResult);
mv.addObject("readResult", readResult);
mv.setViewName("Help_Three/Help_Three_addStu");
return mv;
}
jsp代码:
Jquery代码:
//点击上传
$('#file_copy').click(function(){
$('#file_excel').click();
})
$("#file_excel").bind("change",function(){
$("#filename").attr("value",$("#file_excel").val());
});
//点击提交
$('#download').click(function(){
$("#form_excel").submit();
})