把EXCEL用程序導入到ORACLE中(SpringMVC+MyBatis)

前提:項目中需要把EXCEL數據批量導入oracle中兩張表中。如是用到了poi技術。分別導入poi-3.11-beta2.jar和poi-ooxml-schemas-3.9.jar這兩個包。EXCEL數據如下


第一步:修改spring框架配置文件。?springmvc-servlet.xml加上:

?<!-- 文件上傳 -->
?????? <bean id="multipartResolver"?? class="org.springframework.web.multipart.commons.CommonsMultipartResolver"? p:defaultEncoding="utf-8" />??


第一步:添加頁面jsp。view_user_batchadd.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>    
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<%  
String importMsg="";  
if(request.getSession().getAttribute("msg")!=null){  
importMsg=request.getSession().getAttribute("msg").toString();  
}  
request.getSession().setAttribute("msg", "");  
%> 
<head><title>批量導入用戶</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script type="text/javascript" src="<%=request.getContextPath()%>/view/js/jquery.js"></script>
<body><form action="<%=request.getContextPath()%>/manager/index/batchimport" method="post" enctype="multipart/form-data" name="batchAdd" οnsubmit="return check();"><div style="margin: 30px;"><input id="excel_file" type="file" name="filename" accept="xls" size="50"/><div><input id="excel_file" type="file" name="filename"  size="50"/><input id="excel_button" type="submit" value="導入Excel"/></div><font id="importMsg" color="red"><%=importMsg%></font><input type="hidden"/>  </form>
</body>
<script type="text/javascript"> function check() {  var excel_file = $("#excel_file").val();  if (excel_file == "" || excel_file.length == 0) {  alert("請選擇文件路徑!");  return false;  } else {  return true;  }  
} $(document).ready(function () {  var msg="";  if($("#importMsg").text()!=null){  msg=$("#importMsg").text();  }  if(msg!=""){  alert(msg);  }  });  
</script>
</html>


第三步:填寫控制器:UserLoginController.Java

/*** 2014-8-30 下午2:52:49* TODO  用戶登錄 Controller* */
@Controller
@RequestMapping("/index")
public class UserLoginController  {private Log log = LogFactory.getLog(UserLoginController.class);@Autowiredprivate UserLoginService userLoginService;@Autowiredprivate UserInfoService userInfoService;@RequestMapping(value = "/batchimport", method = RequestMethod.POST)public ModelAndView batchimport(@RequestParam("filename") MultipartFile file,HttpServletRequest request,HttpServletResponse response) throws Exception{log.info("UserLoginController ..batchimport() start");//判斷文件名是否為空if(file==null) return null;//獲取文件名String name=file.getOriginalFilename();//判斷文件大小、即名稱long size=file.getSize();if(name==null || ("").equals(name) && size==0) return null;try {//把文件轉換成字節流形式InputStream in = file.getInputStream();int i=userLoginService.batchImport(name,file);int j=userInfoService.batchImport(name,file);if(i>0 && j>0){String Msg ="批量導入EXCEL成功!";request.getSession().setAttribute("msg",Msg);    }else{String Msg ="批量導入EXCEL失敗!";request.getSession().setAttribute("msg",Msg);}} catch (IOException e) {e.printStackTrace();} return null;}}


注:我這個Controller的方法里面處理了兩個接口實現類。我這里就寫一個

第三步:實現類:UserLoginServiceImpl.java

public int batchImport(String name,MultipartFile file) throws Exception {//處理EXCELReadExcel readExcel=new ReadExcel();//獲得解析excel方法List<User> userList=readExcel.getExcelInfo(name,file);//把excel信息添加到數據庫中List<UserLogin> LoginList=new ArrayList<UserLogin>();for(User user:userList){LoginList.add(user.getUserLogin());}return userLoginDao.saveBatch(LoginList);//添加登錄信息}



第四步:處理EXCEL類:ReadExcel.java

public class ReadExcel {//總行數private int totalRows = 0;  //總條數private int totalCells = 0; //錯誤信息接收器private String errorMsg;//構造方法public ReadExcel(){}//得到總行數public int getTotalRows()  { return totalRows;} //得到總列數public int getTotalCells() {  return totalCells;} public String getErrorInfo() { return errorMsg; }  /*** 描述:驗證EXCEL文件* @param filePath* @return*/public boolean validateExcel(String filePath){if (filePath == null || !(WDWUtil.isExcel2003(filePath) || WDWUtil.isExcel2007(filePath))){  errorMsg = "文件名不是excel格式";  return false;  }  return true;}/**描述 :讀EXCEL文件* @param fielName* @return*/public List<User> getExcelInfo(String fileName,MultipartFile Mfile){//把spring文件上傳的MultipartFile轉換成FileCommonsMultipartFile cf= (CommonsMultipartFile)Mfile; DiskFileItem fi = (DiskFileItem)cf.getFileItem();File file = fi.getStoreLocation(); List<User> userList=new ArrayList<User>();InputStream is = null;  try{//驗證文件名是否合格if(!validateExcel(fileName)){return null;}//判斷文件時2003版本還是2007版本boolean isExcel2003 = true; if(WDWUtil.isExcel2007(fileName)){isExcel2003 = false;  }is = new FileInputStream(file);userList=getExcelInfo(is, isExcel2003); is.close();}catch(Exception e){e.printStackTrace();}finally{if(is !=null){try{is.close();}catch(IOException e){is = null;    e.printStackTrace();  }}}return userList;}/*** 此方法兩個參數InputStream是字節流。isExcel2003是excel是2003還是2007版本* @param is* @param isExcel2003* @return* @throws IOException*/public  List<User> getExcelInfo(InputStream is,boolean isExcel2003){List<User> userList=null;try{/** 根據版本選擇創建Workbook的方式 */Workbook wb = null;//當excel是2003時if(isExcel2003){wb = new HSSFWorkbook(is); }else{wb = new XSSFWorkbook(is); }userList=readExcelValue(wb);}catch (IOException e)  {  e.printStackTrace();  }  return userList;}/*** 讀取Excel里面的信息* @param wb* @return*/private List<User> readExcelValue(Workbook wb){ //得到第一個shell  Sheet sheet=wb.getSheetAt(0);//得到Excel的行數this.totalRows=sheet.getPhysicalNumberOfRows();//得到Excel的列數(前提是有行數)if(totalRows>=1 && sheet.getRow(0) != null){this.totalCells=sheet.getRow(0).getPhysicalNumberOfCells();}List<User> userList=new ArrayList<User>();User user;            //用戶bean(組成:UserInfo+UserLogin)UserInfo userInfo; //用戶基本信息beanUserLogin userLogin;    //用戶登錄bean//循環Excel行數,從第二行開始。標題不入庫for(int r=1;r<totalRows;r++){Row row = sheet.getRow(r);if (row == null) continue;user=new User();userInfo=new UserInfo();userLogin=new UserLogin();//循環Excel的列for(int c = 0; c <this.totalCells; c++){    Cell cell = row.getCell(c); if (null != cell)  {//第一列if(c==0){//獲得第一列<用戶名>,放到到用戶基本信息bean中。userInfo.setUserName(cell.getStringCellValue());}//獲得第二列<手機號>,放到到用戶登錄bean中。作為登錄賬號及密碼else if(c==1){/*** 處理:使用POI讀excel文件,當遇到特殊格式的字串,比如“13612345678”,等等,* 這樣的本來是一個字符串,但是POI在讀的時候總是以數值型識別,由此,這樣的電話號碼讀出來后總是1.3XXX+E4*/DecimalFormat df = new DecimalFormat("#");String cellValue=df.format(cell.getNumericCellValue());userLogin.setAccount(cellValue);userLogin.setPwd(cellValue);}//第三列目前不入庫,只是展示即可//第四列<用戶地址>,放到到用戶基本信息bean中。else if(c==3){userInfo.setCompanyAdd(cell.getStringCellValue());}}}//添加其他值,入庫時需要userLogin.setUserId(Utils.getzId());//存放用戶IDuserLogin.setInsertTime(Utils.getshortDate());//注冊時間userLogin.setUserRole("2"); //默認導入的用戶都為供應商級別userInfo.setUserInfoid(Utils.getzId());//存放用戶IDuserInfo.setUserId(userLogin.getUserId());//基本信息的用戶IDuser.setUserInfo(userInfo);user.setUserLogin(userLogin);userList.add(user);}return userList;}
}
/**  * @描述:工具類 * 檢驗是否是EXCEL文件*/   
class WDWUtil  
{  // @描述:是否是2003的excel,返回true是2003 public static boolean isExcel2003(String filePath)  {  return filePath.matches("^.+\\.(?i)(xls)$");  }  //@描述:是否是2007的excel,返回true是2007 public static boolean isExcel2007(String filePath)  {  return filePath.matches("^.+\\.(?i)(xlsx)$");  }  
}



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539392.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539392.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539392.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

access實例_西門子PLC1200組態王跟Access數據庫-⑥組態王變量

西門子PLC1200&#xff0c;組態王跟Access數據庫--⑥組態王變量組態王的變量設置1.0 變量設置如下圖所示&#xff0c;選擇數據詞典&#xff0c;里面是系統變量跟新建的變量&#xff0c;選擇新建1.1 如下圖&#xff0c;從上往下依次&#xff0c;變量名(這個應該知道)&#xff0c…

Android 擼起袖子,自己封裝 DialogFragment

前言 具體的代碼以及示例我都放上 Github 了&#xff0c;有需要的朋友可以去看一下 DialogFragmentDemos&#xff0c;歡迎 star 和 fork. 本文的主要內容 DialogFragment 是什么創建通用的 CommonDialogFragment實現各種類型的 DialogFragment在寫正文之前&#xff0c;先來一波…

as模擬器文件夾路徑_EGG Switch手機模擬器怎么用?中文教程來了......

大家好&#xff0c;小雞妹我又來啦。自從昨天曝光了美國NX工作室的EGG模擬器之后&#xff0c;推文底下就多了一千多條留言&#xff0c;說啥的都有。不過小雞妹大概總結了一下&#xff0c;發現下面這幾條問題&#xff0c;出現的頻率最高&#xff1a;① 找不到網址&#xff1b;②…

xml文件c語言讀取函數,讀寫xml文件的2個小函數

#region 讀寫xml文件的2個小函數&#xff0c;2005 4 2 by hycpublic void SetXmlFileValue(string xmlPath,string AppKey,string AppValue)//寫xmlPath是文件路徑文件名&#xff0c;AppKey是 Key Name&#xff0c;AppValue是Value{XmlDocument xDoc new XmlDocument();xDoc.L…

Java導入導出Excel工具類ExcelUtil

前段時間做的分布式集成平臺項目中&#xff0c;許多模塊都用到了導入導出Excel的功能&#xff0c;于是決定封裝一個ExcelUtil類&#xff0c;專門用來處理Excel的導入和導出 本項目的持久化層用的是JPA&#xff08;底層用hibernate實現&#xff09;&#xff0c;所以導入和導出也…

郁金香匯編代碼注入怎么寫看雪_世界黑客編程大賽冠軍的匯編代碼 你見過嗎?...

前幾天發布了一篇“雷軍22年前寫的匯編代碼”的文章&#xff0c;引起網友的熱議。有人說匯編是最牛逼的編程語言&#xff0c;沒有之一。匯編語言確實厲害&#xff0c;不知道你有沒有見過世界黑客編程大賽冠軍的作品?雷軍編寫的的匯編代碼有 網友分享了97年Mekka ’97 4K Intro…

變位齒輪重合度計算公式_齒輪“模數”是如何計算的?

模數是決定齒輪大小的因素。齒輪模數被定義為模數制輪齒的一個基本參數&#xff0c;是人為抽象出來用以度量輪齒規模的數。目的是標準化齒輪刀具&#xff0c;減少成本。直齒、斜齒和圓錐齒齒輪的模數皆可參考標準模數系列表。工業定義&#xff1a;齒輪的分度圓是設計、計算齒輪…

c語言改錯和填空能運行嗎,C語言改錯填空編程

改錯題1、在考生文件夾下&#xff0c;給定程序MODI.C的功能是&#xff1a;從低位開始取出長整型變量s中奇數位上的數&#xff0c;依次構成一個新數放在t中。例如&#xff0c;當s中的數為&#xff1a;7654321時&#xff0c;t中的數為&#xff1a;7531。請修改并運行該程序&#…

@Autowired注解實現原理

在討論代碼細節之前&#xff0c;我們再來了解下基礎知識。Spring管理可用于整個應用程序的Java對象bean。他們所在的Spring容器&#xff0c;被稱為應用程序上下文。這意味著我們不需要處理他們的生命周期(初始化&#xff0c;銷毀)。該任務由此容器來完成。另外&#xff0c;該上…

獲取freemarker處理后的內容

相信很多人都用過freemarker&#xff0c;或做視圖&#xff0c;或模板&#xff0c;或生成靜態文件等,但是有多少人做過這樣的應用&#xff0c;通過模板后&#xff0c;不是要輸出靜態的內容&#xff0c;而是直接在代碼中獲取處理模板后的內容&#xff0c;研究了下API,freemarker里…

c4.5算法python實現_算法:用Python實現—最優化算法

今天給大家分享一下算法&#xff0c;用python來實現最優化算法。廢話不多說&#xff0c;直接上代碼&#xff1a;一、二分法函數詳見rres&#xff0c;此代碼使該算法運行了兩次def asdf(x): rres8*x**3-2*x**2-7*x3 return rresi2left0right1while i>0 : i i-1 …

comsol臨時文件夾中有不支持的字符_文件名中不能包含的字符

文件名是為了方便人們區分計算機中的不同文件&#xff0c;而給每個文件設定一個指定的名稱。由文件主名和擴展名組成。DOS操作系統規定文件名由文件主名和擴展名組成&#xff0c;文件主名由1~8個字符組成&#xff0c;擴展名由1~3個字符組成&#xff0c;主名和擴展名之間由一個小…

linux 星號 通配符,如何在bash中轉義通配符/星號字符?

簡短的回答像其他人所說的那樣 - 你應該總是引用變量來防止奇怪的行為。所以使用echo“$ foo”代替echo $ foo。長期回答我確實認為這個例子值得進一步解釋&#xff0c;因為它的表面看起來比它看起來更多。我可以看到你的困惑在哪里&#xff0c;因為在你運行你的第一個例子后&a…

PYTHON面試

大部分的面試問題&#xff0c;有最近要找事的老鐵嗎&#xff1f;python語法以及其他基礎部分可變與不可變類型&#xff1b; 淺拷貝與深拷貝的實現方式、區別&#xff1b;deepcopy如果你來設計&#xff0c;如何實現&#xff1b; __new__() 與 __init__()的區別&#xff1b; 你知…

vs怎么更改編譯的堆空間_再見吧 buildSrc, 擁抱 Composing builds 提升 Android 編譯速度...

前言長期以來困擾我們的一個問題就是構建速度&#xff0c;AndroidStudio 的構建速度嚴重影響 Android 開發者的工作效率&#xff0c;尤其是更新一個版本號&#xff0c;導致整個項目重新構建&#xff0c;在網絡慢的情況下&#xff0c;這是無法忍受的。buildSrc 這種方式&#xf…

java map的遍歷

轉載地址&#xff1a;http://www.cnblogs.com/shenliang123/archive/2012/08/28/2660705.html -------------------------------------------------------------------------------------------------------------------- java中的遍歷 import java.util.Collection; import j…

python循環for...in_python循環while和forin實例

python 循環while和for in簡單實例#!/uer/bin/env python# _*_ coding: utf-8 _*_lucknumber 5b 0while b <3:print(guss count:,b)a int(input(you guse number))if a > lucknumber:print (youaerbiger)elif a lucknumber:print (youare righet)break #跳出這個層級…

android懸浮功能實現,Android實現系統級懸浮按鈕

本文實例為大家分享了Android系統級懸浮按鈕的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下具體的需求1、就是做一個系統級的懸浮按鈕&#xff0c;就像iPhone 桌面的那個懸浮按鈕效果一樣&#xff0c;能隨意拖動&#xff0c;并且手一放開&#xff0c;懸浮按鈕就自動…

oracle decode_錯過血虧!一文搞懂Oracle鎖相關視圖及相關操作

本文主要研究鎖的相關視圖&#xff0c;以及鎖的相關操作&#xff0c;通過視圖查鎖的問題。 一、v$transaction視圖第一個視圖是v$transaction&#xff0c;就是Oracle數據庫所有活動的事務數&#xff0c;所有活動的事務每一個活動的事務在這里有一行。v$transactionXIDUSN表示當…

Linux文件系統與命令行

什么是命令行? 接收鍵盤命令并將其傳給操作系統執行的程序(用于輸入和管理命令的程序),統稱命令行,也叫: Shell&#xff0c;幾乎所有Linux發行版都提供了一個 Shell 程序,叫做: Bash (Bourne-Again Shell, 因為最初的 Shell 是由 Steve Bourne 編寫的原始 Unix 程序, Again 表…