SSM框架下實現導入功能


何叫導入?簡單說,導入就是把excel表格里的數據插入到數據庫里。我這里做的是支持.xls和.xlsx格式。

因為是自己做案例記錄,那些jar包什么的就不細說了,主要講實現和步驟,看代碼:

 

先在你的項目文件中創建一個excel表格模板,方便用戶知曉導入的格式和文件內容:

 

 

一、頁面中導入按鈕

 

二、點擊按鈕跳轉到導入頁面,這里直接用的標簽跳轉,<%@ include file="importHarness.jsp"%>

 

 

 

三、點確認時先做下驗證,文件格式、類型什么的

 

$('#importHarnessForm')為form表單id,(".hp_form_error")為確認按鈕上方一個隱藏的DIV的class,顯示提示信息用的。

 

四、點擊確認按鈕  傳值  后台代碼:

 

 

Controller類:

 

@RequestMapping(value = "/import" , method = RequestMethod.POST)
@ResponseBody
public String xlsImport(@RequestParam("xlsfile") MultipartFile file){
// 返回string類型為解決ie9兼容性
ResponseBase responseBase = new ResponseBase();
if (file.isEmpty()) {
responseBase.setMessage("'文件內容不能為空'");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}
//文件名
String fileName = file.getOriginalFilename();
if (fileName == null || (!fileName.endsWith(".xls") && !fileName.endsWith(".xlsx"))) {
responseBase.setMessage("'文件格式不正確'");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}
InputStream inputStream = null;
try{
inputStream = file.getInputStream();
Workbook wb = null;
if (fileName.endsWith(".xlsx")) {
wb = new XSSFWorkbook(inputStream);
}else {
wb = new HSSFWorkbook(inputStream);
}
//獲取第一個工作表對象
Sheet sheet = wb.getSheetAt(0);
//行號
int rowNum = sheet.getLastRowNum();
//最大導入數
if (sheet.getLastRowNum() > 1000) {
responseBase.setMessage("'數據最多可導入1000條");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}
Subject currentUser = SecurityUtils.getSubject();
Session session = currentUser.getSession();
Integer uid = (Integer) session.getAttribute("userId");
List<HarnessDTO> hpList = new ArrayList<HarnessDTO>();
int count = 0; //成功條數
int ercount = 0; //失敗條數
for (int i = 1; i <= rowNum; i++) {

HarnessDTO hp = new HarnessDTO();
Row row = sheet.getRow(i);
String brandId = FileOperateUtil.getCellValue(row.getCell(0));
String seriesId = FileOperateUtil.getCellValue(row.getCell(1));
String modelId = FileOperateUtil.getCellValue(row.getCell(2));
String harnessInfo = FileOperateUtil.getCellValue(row.getCell(3));

if(StringUtils.isNotBlank(brandId) && StringUtils.isNotBlank(seriesId) && StringUtils.isNotBlank(harnessInfo)){
int rowCount = harnessPositionService.selectCount(brandId, seriesId, modelId);
if(rowCount >= 0){
hp.setBrandId( brandId );
hp.setSeriesId( seriesId) ;
hp.setModelId("".equals(modelId) ? "-1" : modelId);
hp.setHarnessInfo(harnessInfo);
hp.setStatus("1");
hp.setEditUser(String.valueOf(uid));
hpList.add(hp);
count ++;
}else{
ercount++;
}
}else{
responseBase.setMessage("'車輛品牌、型號和線束管理不能為空,導入失敗,請重新導入'");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}
}
harnessPositionService.insertCount(hpList);
if (count == 0) {
responseBase.setStatus(DATA_VALIDATION_ERROR);
}
responseBase.setMessage("'已成功導入" + count + "條,失敗" + ercount + "條'");
}catch(Exception e){
logger.error("文件格式不符合要求,導入失敗,請重新導入 ", e);
responseBase.setMessage("'文件格式不符合要求,導入失敗,請重新導入'");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}finally{
try {
if (inputStream != null) {
inputStream.close();
inputStream = null;
}
} catch (IOException e) {
logger.error("關閉文件流失敗", e);
responseBase.setMessage("'關閉文件流失敗'");
responseBase.setStatus(DATA_VALIDATION_ERROR);
return responseBase.toString();
}
}
return responseBase.toString();
}

 

Service類:

 

實現類:

 

 

DAO層:

 

 

SQL:

 

 

這是實現的全部代碼,值得注意的是Controller類獲取行數的時候,int rowNum = sheet.getLastRowNum();  往往會出現如下情況:

獲取到的行數要大於實際表格中(有數據)的行數,自己解決辦法

1.在循環中,自己再嵌入一層循環,判斷獲取到的行數是否為空,為空跳出循環執行下一次循環(continue)

2.偷懶的方法,創建的模板,手動把模板下面的行和列刪除、清空內容一次,選多點行數,幾千行隨你選,這樣導入的時候就不會出現那種情況啦(只是針對導入模板的用戶  選此方法吧)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM