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