我们今天就给大家介绍一个用途非常广泛的功能:批量导入,在很多系统中,这也是必须实现的功能。而且当Excel表结构越复杂时,实现的难度就越高。
不管项目如何复杂,原理却基本相同,一般是前台页面选择Excel文件,后台获取后进行数据转化,然后循环执行Sql语句即可,了解这些原理后,一切也就变得简单。
项目进行简化,只有批量导入功能,采用Struts2框架,将Excel数据导入到Mysql数据库中。
项目的结构图如下:
MYSQL数据库USER数据表结构:
EXCEL表中的数据:
如果Excel中必填项数据为空,提示导入失败,报告错误信息及位置,如图:
如果数据正确,提示导入数据库成功:
具体实现过程的步骤:
JSP页面,name的名称是重点:
前台点击上传后跳转到action处理,action中首先定义:
//这里特别注意获取fileinput要和页面的导入时name属性一致。
private File fileinput;
//文件名用得到就获取,一般用不到。
private String fileinputFileName;
//下面是get和set方法,省略
然后在方法体中直接调用:
//参数为获取到的文件
ExcelUtil(fileinput);
ExcelUtil是处理Excel工具类,直接使用,代码如下:
/*解析excel 工具类/
@SuppressWarnings(“rawtypes”)
public class ExcelUtil {
public FileInputStream fis ;
public HSSFWorkbook workBook;
public HSSFSheet sheet;
public XMLUtil parseXmlUtil;
public StringBuffer errorString;
/**当前实体类的code**/
public String curEntityCode;
/**表头map对象:key:entityCode, value:headMap(index,headTitle)**/
public Map curEntityHeadMap ;
/**字段的必填:key:entityCode+headTitle, value:true(必填),false(不必填)**/
public Map curEntityColRequired;
/**存放每一行的数据**/
public List listDatas ;
public ExcelUtil(File excelFile){
try {
if(excelFile == null){
throw new FileNotFoundException();
}
fis = new FileInputStream(excelFile);
workBook = new HSSFWorkbook(fis);
parseXmlUtil = new XMLUtil();
errorString = new StringBuffer();
readExcelData();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
/**开始从excel读取数据**/
public void readExcelData(){
int sheetSize = workBook.getNumberOfSheets();
for(int i=0;i<sheetSize;i++){
sheet = workBook.getSheetAt(i);
String entityName = workBook.getSheetName(i);
readSheetData(sheet,entityName);
}
}
/**读每个sheet页的数据**/
public void readSheetData(HSSFSheet sheet,String entityName){
int rowNumbers = sheet.getPhysicalNumberOfRows();
Map ent = (Map) parseXmlUtil.getEntityMap().get(entityName);
this.setCurEntityCode((String) ent.get("code"));
if(rowNumbers == 0){
System.out.println("excel中数据为空!");
errorString.append(Constans.ERROR_EXCEL_NULL);
}
List colList = (List) parseXmlUtil.getColumnListMap().get(entityName);
int xmlRowNum = col