把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
<%@ 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" onsubmit="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);
@Autowired
private UserLoginService userLoginService;
@Autowired
private 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
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 {
//處理EXCEL
ReadExcel 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轉換成File
CommonsMultipartFile 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; //使用者基本資訊bean
UserLogin 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());//存放使用者ID
userLogin.setInsertTime(Utils.getshortDate());//註冊時間
userLogin.setUserRole("2"); //預設匯入的使用者都為供應商級別
userInfo.setUserInfoid(Utils.getzId());//存放使用者ID
userInfo.setUserId(userLogin.getUserId());//基本資訊的使用者ID
user.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)$");
}
}