使用poi實現Excel匯入功能,資料庫基於oracle(上)
阿新 • • 發佈:2019-02-16
首先說下采用poi實現匯入Excel的實現思路(如果有更好的思路,歡迎跟我探討。)
1、首先是JSP的編寫:
<div class="span55"
style="width:330px; height:250px; overflow:scroll;">
<form:form enctype="multipart/form-data" id="batchUpload" method="post" action="${ctx}/npbi/outUrmHead/importExcel" class ="form-horizontal">
<button class="btn btn-success btn-xs" id="uploadEventBtn" style="height:26px;" type="button">選擇檔案</button>
<input type="file" name="myfile" style="width:0px;height:0px;" id="uploadEventFile">
<input style="border:1px solid #e6e6e6;width:200px;height:26px;" id="uploadEventPath" disabled="disabled" type="text" placeholder="請選擇Excel表">
</form:form>
<button type="button" class="btn btn-success btn-sm" onclick="outUrmList.uploadBtn();">上傳</button >
</div>
<script type="text/javascript">
var OutUrmList = function(){
this.init = function(){
//模擬上傳Excel
$("#uploadEventBtn").unbind("click").bind("click",function(){
$("#uploadEventFile").click();
});
$("#uploadEventFile").bind("change",function(){
$("#uploadEventPath").attr("value",$("#uploadEventFile").val());
})
};
//點選上傳按鈕
this.uploadBtn = function(){
var uploadEventFile = $("#uploadEventFile").val();
if(uploadEventFile==""){
alert("請選擇Excel檔案,再上傳!");
}else if(uploadEventFile.lastIndexOf(".xls")<0 && uploadEventFile.lastIndexOf(".xlsx")<0){//可判斷以.xls和.xlsx結尾的Excel
alert("只能上傳Excel檔案!");
}
else{
var Mid = $("#Mid").val();
var biaoshi = $("#biaoshi").val();
var url =ctx+"/npbi/outUrmHead/importExcel?Mid="+Mid+"&biaoshi="+biaoshi;
var formData = new FormData($('#batchUpload')[0]);
outUrmList.sendAjaxRequest(url,'POST',formData);
}
};
this.sendAjaxRequest = function(url,type,data){
$.ajax({
url:url,
type:type,
data:data,
success:function(result){
alert(result+"("+"提示:如系統異常關閉或頁面重新整理,請重新上傳和申報!"+")");
},
error:function(){
alert("上傳失敗!");
},
cache:false,
contentType : false,
processData:false,
});
};
}
var outUrmList;
$(function(){
outUrmList = new OutUrmList();
outUrmList.init();
});
</script>`
這裡沒有提供一個模板的下載功能,實在是沒時間去弄,有實現的可以給我借鑑一下。注意 <input type="file" name="myfile" ...這個地方的type要是file。切記form的型別要是:enctype="multipart/form-data"。
2、其次是service實現
String result = "";
String ieMode = "";
boolean flag = true;
boolean flags = true;
Map<String,Object> paramMap = new HashMap<String, Object>();
paramMap.put("ieMode", ieMode);
StringBuffer sb = new StringBuffer();
//建立處理EXCEL的類
ReadExcel readExcel = new ReadExcel();
//解析excel,獲取上傳的事件單
List<OutUrmList> urmList = readExcel.getExcelInfo(myFile,Mid);
if(urmList!=null&&!urmList.isEmpty()){
//判斷Excel匯入的編號是否已經存在於資料庫中
for(int i=0;i<urmList.size();i++){
paramMap.put("billNoVal", urmList.get(i).getFormNo());
paramMap.put("Mid", Mid);
String billNo = outUrmListService.getbillNoDuplicationCheck(paramMap);
if(StringUtils.isNotEmpty(billNo)){
sb.append(billNo+",");
flags = false;
}
}
//判斷Excel匯入的編號號是否之間是否存在相同
for(int j=0;j<urmList.size()-1;j++){
for(int r=j+1;r<urmList.size();r++){
if((urmList.get(j).getFormNo()).equals(urmList.get(r).getFormNo())){
flag = false;
}
}
}
if(flag && flags){
outUrmListService.saveExcelInfo(urmList);
result="上傳成功!";
}else if(!flag){
result="Excel檔案中編號重複,請核實後再上傳!!";
}else if(!flags){
result="已存在編號:"+"("+sb+")"+"請核實後再上傳!";
}
}else{
result="上傳失敗!";
}
return result;
}```
這裡對插入的Excel內容到資料庫已經存在的唯一性校驗實現。
3、Controller的實現:
@RequestMapping(value = "importExcel", method = RequestMethod.POST)
@ResponseBody
public void importExcel(HttpServletRequest request, HttpServletResponse response,Model model,
@RequestParam("myfile") MultipartFile myFile) throws ParseException, IOException {
System.out.println("=========================>進來");
String result =outUrmHeadService.readExcelFile(myFile);
response.getWriter().print(result);
}```
這個value裡面的 值主要對應了前臺ajax的url,主要看你專案路徑是如何配置了。@RequestParam(“myfile”) MultipartFile myFile中的“myfile”,對應你JSP的form裡面的name=”myfile” 。
暫時先寫到這裡,還有匯入的具體實現類ReadExcel.java以及基於Oracle的匯入資料的插入實現等有時間了,再一併寫給大家,當然如果大家有興趣也可以留言給我,我會盡快回復大家。