1.导包,导包,导包!!!!!!!重要的是说3遍,不导包就是做梦!!!!!(pingyin4j.jar)
2.几个类型的包就不用多说了,需要说的是在service接口中需要多添加一个保存集合的方法,在接口的实现类中实现这个方法:
public void saveList(List<BcSubarea> subarea) {
for (BcSubarea bcSubarea : subarea) {
subareaDao.save(bcSubarea); //因为在service接口中有保存单个实体类的方法,这里就直接用了
}
}
3.接下来是jsp界面:(千万不要忘了enctype ,千万,前外)
<form action="${cxt}/subarea/importExcel" method="post" enctype="multipart/form-data" target="_parent">
<input type="file" name="file" />
<input type="submit" value="导入" />
</form>
4.接下来就是重头戏了,在action中的代码:(只贴了关键部分,每一步都解释清楚了,用的时候可以直接复制粘贴,该一些实体类对象,就行了)
@Action(value="importExcel",results= {@Result(name="importExcel",location="/WEB-INF/content/subarea/queryAllByPager.jsp")})
//上传Excel
public String importExcel() {
//创建一个集合对象,用来给数据库插入多条数据
List<BcSubarea> list = new ArrayList<BcSubarea>();
//第一步,创建一个workbook对象,(因为后缀名是.xsl所以用HSSWorkbook创建对象)
HSSFWorkbook workbook = null;
try {
//得到整个excel中的所有数据(因为sheet可能有几页)
workbook = new HSSFWorkbook(new FileInputStream(file));
// 拿到excel表中的sheet(这个0表示的是第一页中的数据),如果有好几个sheet的话就用循环,在嵌套一个循环遍历出sheet中的每一行
HSSFSheet sheetAt = workbook.getSheetAt(0);
// 循环遍历sheet,拿到表中的每一行
for (Row row : sheetAt) {
// 去掉标题行
if (row.getRowNum() == 0) { //excel中最上面的一行为标题行
continue;
}
BcSubarea subarea= new BcSubarea(); //创建一个bcRegion对象用来接收从excel中读到的数据
subarea.setStartnum(row.getCell(1).getStringCellValue()); //开始编号
subarea.setEndnum(row.getCell(2).getStringCellValue()); //结束编号
subarea.setPosition(row.getCell(3).getStringCellValue()); //位置信息
//创建一个省市区对象(这里创建一个新对象的原因是我Excel表中有当前实体类关联的另一个实体类中的对象)
BcRegion region = new BcRegion(); //省市区
//得到excel中当前格的内容,通过 - 分割成 几段 放到string类型的数组中
String[] str = row.getCell(4).getStringCellValue().split(" - "); //这个就是把Excel表中的数据切割,并放入数组中(如果不用写个的话可以不写这一段)
region.setProvince(str[0]); //省
region.setCity(str[1]); //市
region.setDistrict(str[2]); //区
//根据已经得到的三条信息查询当前对象
region = bcRegionService.queryOne(region); //根据上面获得的3个条件查询地区对象
subarea.setBcRegion(region); //把根据省市区得到的对象设置给subarea
//把每一列得到的对象添加到创建的集合中
list.add(subarea);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//进行循环插入
subareaService.saveList(list);
return "importExcel";
}
5.根据id查询对象的时候需要注意:如果在数据库中查询不到当前对象怎么办:
以下是在service实现类中的代码:
//条件查询
public BcRegion queryOne(BcRegion regin){
List<BcRegion> list = bcRegionDao.queryByExample(regin); //首先根据Excel表中的3条数据查询返回一个list集合
if(list.size() == 0) { //数据库中没有数据,就进行保存
bcRegionDao.save(regin);
return regin; //返回这个对象,因为怎么样都要用到Excel表中的对象
}else {
return list.get(0);
}
}