你在工作中是否遇到这样的问题?数据一般存放在Excel表中,逐条迁移到数据库中太麻烦,而且很多时候企业的数据量都是以万起步,单条导入显然不现实。那么该如何解决呢?
我们今天就给大家介绍一个用途非常广泛的功能:批量导入,在很多系统中,这也是必须实现的功能。而且当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
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 = colList.size();
HSSFRow excelRow = sheet.getRow(0);
int excelFirstRow = excelRow.getFirstCellNum();
int excelLastRow = excelRow.getLastCellNum();
if(xmlRowNum != (excelLastRow-excelFirstRow)){
System.out.println("xml列数与excel列数不相符,请检查");
errorString.append(Constans.ERROR_EXCEL_COLUMN_NOT_EQUAL);
}
readSheetHeadData(sheet);