首先要匯入spring相關包,poi,和fileupload包,我是使用maven構建的。
一.匯入excel
(1)使用spring上傳檔案
a.前臺頁面提交
<form name="excelImportForm" action="${pageContext.request.contextPath}/brand/importBrandSort" method="post" onsubmit="return checkImportPath();" enctype="multipart/form-data">
<input type="hidden" name="ids">
<div>
<label><input type="file" name="filename" accept="xls"/></label>
<input type="submit" value="匯入Excel"/>
</div>
<button type="button" data-dismiss="modal" onClick="uncheckBoxes();">取消</button>
b.後臺spring的controller進行相關操作,這裡主要講的是使用spring上傳檔案,和讀取檔案資訊。
使用spring上傳檔案之前,需要配置bean。
<bean></bean>@RequestMapping(value = "/importBrandSort", method = RequestMethod.POST)
public ModelAndView importBrandSort(@RequestParam("filename") MultipartFile file,
HttpServletRequest request,HttpServletResponse response) throws Exception {
String temp = request.getSession().getServletContext()
.getRealPath(File.separator)
+ "temp"; // 臨時目錄
File tempFile = new File(temp);
if (!tempFile.exists()) {
tempFile.mkdirs();
}
DiskFileUpload fu = new DiskFileUpload();
fu.setSizeMax(10 * 1024 * 1024); // 設定允許使用者上傳檔案大小,單位:位
fu.setSizeThreshold(4096); // 設定最多隻允許在記憶體中儲存的資料,單位:位
fu.setRepositoryPath(temp); // 設定一旦檔案大小超過getSizeThreshold()的值時資料存放在硬碟的目錄
// 開始讀取上傳資訊
//
int index = 0;
/* List fileItems = null;
try {
fileItems = fu.parseRequest(request);
catch (Exception e) {
e.printStackTrace();
Iterator iter = fileItems.iterator(); // 依次處理每個上傳的檔案
FileItem fileItem = null;
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();// 忽略其他不是檔案域的所有表單資訊
if (!item.isFormField()) {
fileItem = item;
// index++;
if (fileItem == null)
return null;
*/
if (file == null)
logger.info(file.getOriginalFilename());
String name = file.getOriginalFilename();// 獲取上傳檔名,包括路徑
//name = name.substring(name.lastIndexOf("\\") + 1);// 從全路徑中提取檔名
long size = file.getSize();
if ((name == null || name.equals("")) && size == 0)
InputStream in = file.getInputStream();
List<BrandMobileInfoEntity> BrandMobileInfos = brandService
.importBrandPeriodSort(in);
// 改為人工重新整理快取KeyContextManager.clearPeriodCacheData(new
// PeriodDimensions());// 清理所有快取
int count = BrandMobileInfos.size();
String strAlertMsg ="";
if(count!=0){
strAlertMsg= "成功匯入" + count + "條!";
}else {
strAlertMsg = "匯入失敗!";
logger.info(strAlertMsg);
//request.setAttribute("brandPeriodSortList", BrandMobileInfos);
//request.setAttribute("strAlertMsg", strAlertMsg);
request.getSession().setAttribute("msg",strAlertMsg);
return get(request, response);
//return null;
程式碼中的註釋部分是如果不使用spring的方式,如何拿到提交過來的檔名(需要是要apache的一些工具包),其實使用spring的也是一樣,只是已經做好了封裝,方便我們寫程式碼。
程式碼中的後半部分是讀取完上傳文檔案的資訊和對資料庫進行更新之後,輸出到前臺頁面的資訊。
上述程式碼中: InputStream in = file.getInputStream();
.importBrandPeriodSort(in);讀取excel的資訊。
(2)使用poi讀取excel
a.更新資料庫
@Override
public List<BrandMobileInfoEntity> importBrandPeriodSort(InputStream in) throws Exception {
List<BrandMobileInfoEntity> brandMobileInfos = readBrandPeriodSorXls(in);
for (BrandMobileInfoEntity brandMobileInfo : brandMobileInfos) {
mapper.updateByConditions(brandMobileInfo);
return brandMobileInfos;
這部分是sevice層的程式碼,用於讀取excel資訊之後更新資料庫資料,我這裡是使用mybatis。定義一個類BrandMobileInfoEntity,用與儲存excel表每一行的資訊,而List< BrandMobileInfoEntity > 則儲存了全部資訊,利用這些資訊對資料庫進行更新。
b.讀取excel資訊
private List<BrandMobileInfoEntity> readBrandPeriodSorXls(InputStream is)
throws IOException, ParseException {
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
List<BrandMobileInfoEntity> brandMobileInfos = new ArrayList<BrandMobileInfoEntity>();
BrandMobileInfoEntity brandMobileInfo;
// 迴圈工作表Sheet
for (int numSheet = 0;
numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
// 迴圈行Row
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
brandMobileInfo = new BrandMobileInfoEntity();
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
for (int i = 0; i < hssfRow.getLastCellNum(); i++) {
HSSFCell brandIdHSSFCell = hssfRow.getCell(i);
if (i == 0) {
brandMobileInfo.setBrandId(Integer
.parseInt(getCellValue(brandIdHSSFCell)));
} else if (i == 1) {
} else if (i == 2) {
brandMobileInfo.setMobileShowFrom(Integer.parseInt(getCellValue(brandIdHSSFCell)));
} else if (i == 3) {
brandMobileInfo.setMobileShowTo(Integer.parseInt(getCellValue(brandIdHSSFCell)));
} else if (i == 4) {
brandMobileInfo.setSellMarkValue(getCellValue(brandIdHSSFCell));
} else if (i == 5) {
brandMobileInfo.setWarehouse(getCellValue(brandIdHSSFCell));
} else if (i ==
首先要匯入spring相關包,poi,和fileupload包,我是使用maven構建的。
一.匯入excel
(1)使用spring上傳檔案
a.前臺頁面提交
<form name="excelImportForm" action="${pageContext.request.contextPath}/brand/importBrandSort" method="post" onsubmit="return checkImportPath();" enctype="multipart/form-data">
<input type="hidden" name="ids">
<div>
<div>
<label><input type="file" name="filename" accept="xls"/></label>
<div>
<input type="submit" value="匯入Excel"/>
</div>
</div>
</div>
<div>
<button type="button" data-dismiss="modal" onClick="uncheckBoxes();">取消</button>
</div>
b.後臺spring的controller進行相關操作,這裡主要講的是使用spring上傳檔案,和讀取檔案資訊。
使用spring上傳檔案之前,需要配置bean。
<bean></bean>@RequestMapping(value = "/importBrandSort", method = RequestMethod.POST)
public ModelAndView importBrandSort(@RequestParam("filename") MultipartFile file,
HttpServletRequest request,HttpServletResponse response) throws Exception {
String temp = request.getSession().getServletContext()
.getRealPath(File.separator)
+ "temp"; // 臨時目錄
File tempFile = new File(temp);
if (!tempFile.exists()) {
tempFile.mkdirs();
}
DiskFileUpload fu = new DiskFileUpload();
fu.setSizeMax(10 * 1024 * 1024); // 設定允許使用者上傳檔案大小,單位:位
fu.setSizeThreshold(4096); // 設定最多隻允許在記憶體中儲存的資料,單位:位
fu.setRepositoryPath(temp); // 設定一旦檔案大小超過getSizeThreshold()的值時資料存放在硬碟的目錄
// 開始讀取上傳資訊
//
int index = 0;
/* List fileItems = null;
try {
fileItems = fu.parseRequest(request);
}
catch (Exception e) {
e.printStackTrace();
}
Iterator iter = fileItems.iterator(); // 依次處理每個上傳的檔案
FileItem fileItem = null;
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();// 忽略其他不是檔案域的所有表單資訊
if (!item.isFormField()) {
fileItem = item;
// index++;
}
}
if (fileItem == null)
return null;
*/
if (file == null)
return null;
logger.info(file.getOriginalFilename());
String name = file.getOriginalFilename();// 獲取上傳檔名,包括路徑
//name = name.substring(name.lastIndexOf("\\") + 1);// 從全路徑中提取檔名
long size = file.getSize();
if ((name == null || name.equals("")) && size == 0)
return null;
InputStream in = file.getInputStream();
List<BrandMobileInfoEntity> BrandMobileInfos = brandService
.importBrandPeriodSort(in);
// 改為人工重新整理快取KeyContextManager.clearPeriodCacheData(new
// PeriodDimensions());// 清理所有快取
int count = BrandMobileInfos.size();
String strAlertMsg ="";
if(count!=0){
strAlertMsg= "成功匯入" + count + "條!";
}else {
strAlertMsg = "匯入失敗!";
}
logger.info(strAlertMsg);
//request.setAttribute("brandPeriodSortList", BrandMobileInfos);
//request.setAttribute("strAlertMsg", strAlertMsg);
request.getSession().setAttribute("msg",strAlertMsg);
return get(request, response);
//return null;
}
程式碼中的註釋部分是如果不使用spring的方式,如何拿到提交過來的檔名(需要是要apache的一些工具包),其實使用spring的也是一樣,只是已經做好了封裝,方便我們寫程式碼。
程式碼中的後半部分是讀取完上傳文檔案的資訊和對資料庫進行更新之後,輸出到前臺頁面的資訊。
上述程式碼中: InputStream in = file.getInputStream();
List<BrandMobileInfoEntity> BrandMobileInfos = brandService
.importBrandPeriodSort(in);讀取excel的資訊。
(2)使用poi讀取excel
a.更新資料庫
@Override
public List<BrandMobileInfoEntity> importBrandPeriodSort(InputStream in) throws Exception {
List<BrandMobileInfoEntity> brandMobileInfos = readBrandPeriodSorXls(in);
for (BrandMobileInfoEntity brandMobileInfo : brandMobileInfos) {
mapper.updateByConditions(brandMobileInfo);
}
return brandMobileInfos;
}
這部分是sevice層的程式碼,用於讀取excel資訊之後更新資料庫資料,我這裡是使用mybatis。定義一個類BrandMobileInfoEntity,用與儲存excel表每一行的資訊,而List< BrandMobileInfoEntity > 則儲存了全部資訊,利用這些資訊對資料庫進行更新。
b.讀取excel資訊
private List<BrandMobileInfoEntity> readBrandPeriodSorXls(InputStream is)
throws IOException, ParseException {
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
List<BrandMobileInfoEntity> brandMobileInfos = new ArrayList<BrandMobileInfoEntity>();
BrandMobileInfoEntity brandMobileInfo;
// 迴圈工作表Sheet
for (int numSheet = 0;
numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 迴圈行Row
for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
brandMobileInfo = new BrandMobileInfoEntity();
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
for (int i = 0; i < hssfRow.getLastCellNum(); i++) {
HSSFCell brandIdHSSFCell = hssfRow.getCell(i);
if (i == 0) {
brandMobileInfo.setBrandId(Integer
.parseInt(getCellValue(brandIdHSSFCell)));
} else if (i == 1) {
continue;
} else if (i == 2) {
brandMobileInfo.setMobileShowFrom(Integer.parseInt(getCellValue(brandIdHSSFCell)));
} else if (i == 3) {
brandMobileInfo.setMobileShowTo(Integer.parseInt(getCellValue(brandIdHSSFCell)));
} else if (i == 4) {
brandMobileInfo.setSellMarkValue(getCellValue(brandIdHSSFCell));
} else if (i == 5) {
brandMobileInfo.setWarehouse(getCellValue(brandIdHSSFCell));
} else if (i ==