前言:excel導入也是一個常見的問題了,原理還是比較簡單的,看過很多種用法。今天在項目中需要此功能,在做的時候也遇到一些坑,睡前總結下來,大家一起學習。
正文:廢話不說。
項目中的思路是:首先利用poi插件將excel模板的內容轉換成list集合。然後再利用list集合,完成持久化(批量插入)。
一,jsp頁面代碼:
<div class="footerb" style="line-height: 53px;">
導入隊員信息<input type="file" id="filePath" name="filePath" style="width: 140px;"/>
<input type="button" value="導入" <span style="color:#FF0000;">onclick="preview()"</span> />
</div>
選擇文件,點擊“導入”按鈕,觸發 onclick="preview()" 檢驗文件格式是否正確。
相應的js代碼如下:
<pre name="code" class="javascript">//驗證
function preview() {
var filePath = $("#filePath").val();
if(filePath != ""){
$.ajax({
cache: false,
type: "POST",
url:"${pageContext.request.contextPath}/ec/emergencyTeam/isExcel",
data:{filePath:filePath},
async: false,
error: function(request){
alert("訪問後臺失敗!");
},
success: function(data) {
if(data == "true"){
importExcel(filePath);
}else{
alert("導入的文件格式不是xlsx或者xls!");
}
}
});
}else{
alert("請選擇文件");
}
}
//驗證通過,將excel提交
function importExcel(filePath) {
var name = $("#name").val();
$.ajax({
cache: false,
type: "POST",
url:"${pageContext.request.contextPath}/ec/emergencyTeam/changeExcel",
data:{filePath:filePath,name:name},
async: false,
error: function(request){
alert("訪問後臺失敗!");
},
success: function(data) {
if(data == "ok"){
alert("導入成功");
window.top.frames['contentframe'].listForm.submit();
}
}
});
}
前臺採用異步驗證的方式。
二,接下來看一下後臺代碼:
/**
* 判斷是否是excel表格
* @param request
* @param response
*/
@RequestMapping("/isExcel")
public void isExcel(HttpServletRequest request,HttpServletResponse response){
boolean isExcel = true;
String filePath = request.getParameter("filePath");
String fileType = filePath.substring(filePath.lastIndexOf(".")+1);
if(!"xlsx".equals(fileType) && !"xls".equals(fileType)){
isExcel = false;
}
MsgJsonUtil.outputText(response,String.valueOf(isExcel));
}
/**
* 將excel轉換成list<map>
* @throws ParseException
*/
@RequestMapping("/changeExcel")
public void exportListFromExcel(HttpServletRequest request,HttpServletResponse response) throws ParseException{
EmergencyTeam emergencyTeam = new EmergencyTeam();//創建一個應急隊對象
String emergencyTeamName = request.getParameter("name");//獲取應急隊名稱
emergencyTeam.setName(emergencyTeamName);
String createUser=(String)request.getSession().getAttribute(LoginAttribute.SESSION_LOGIN_NAME);//獲取操作人
Date createTime=new Date();
emergencyTeam.setCreateUser(createUser);
emergencyTeam.setCreateTime(createTime);
emergencyTeam.setLocation("520123");//設置所屬地區,默認花溪
long emergencyTeam_id=EmergencyTeamService.insertEmergencyTeam(emergencyTeam);//添加應急隊信息,並且獲取主鍵
emergencyTeam_id = emergencyTeam.getId();//獲取新插入的應急隊id
List<Object[]> list = new ArrayList<Object[]>();
List<HashMap<String,Object>> lstMap=new ArrayList<HashMap<String,Object>>();
String filePath = request.getParameter("filePath");
//HashMap<String,Object> plotNum=new HashMap<String, Object>();
System.out.println("filePath:"+filePath);
try {
list = ExcelHelper.exportListFromExcel(new File("C:\\Users\\Administrator\\Desktop\\"+filePath));
List<TeamUser> teamUsersList = new ArrayList<TeamUser>();
lstMap=(List<HashMap<String,Object>>)list.get(0)[0];
TeamUser teamUser = new TeamUser();
for(HashMap<String,Object> m:lstMap){
if(!m.isEmpty()){
teamUser = mapToTotalNum(m);//將excel數據行,轉換成teamUser對象
teamUser.setEmergency_team(emergencyTeam_id);//設置應急隊id
teamUsersList.add(teamUser);//添加到集合
}
}
for (TeamUser teamUser2 : teamUsersList) {
System.out.println(teamUser2.getAttchId());
System.out.println(teamUser2.getEmergency_team());
System.out.println(teamUser2.getUname());
}
EmergencyTeamService.addTeamUser(teamUsersList);//添加應急隊員信息
MsgJsonUtil.outputText(response,"ok");
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 將一列數據轉換成TeamUser對象
* @param map
* @return TeamUser 對象
*/
private TeamUser mapToObject(HashMap<String, Object> map) {
TeamUser teamUser = new TeamUser();
try {
BeanUtils.populate(teamUser, map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return teamUser;
}
上面主要要三個方法:
1.@RequestMapping("/isExcel") 根據文件名,判斷是否是excel文件。
2.@RequestMapping("/changeExcel") 將Excel轉換成list集合。
3.mapToObject() 將map集合數據轉換成我們所需的對象數據。
主要說一下第二個方法:@RequestMapping("/changeExcel"):
該方法,主要完成的操作就是將excel轉換成map集合,再講map集合轉換成對象數據,然後將對象數據添加到list對象集合中。最後用集合數據進行持久化操作。方法的前十行,是我個人業務需求,與excel導入功能無關,可以從第十一行開始看起。
這裏別的不再詳細說明了,不明白可以給我留言。我每天都會登錄csdn。大家相互學習。
三,excel模板設計技巧:
大家注意第三行:這裏是數據的屬性字段,一定要一一對應,不然到時候解析map集合時會出錯的。另外這一行一般不讓用戶看到,只要我們知道就可以,設計好以後可以隱藏起來。
如果誰需要詳細代碼,可以給我留言。
晚安!