一、jar包準備
導入excel需要使用apache的POI提供的jar包:
二、JSP頁面文件選擇導入
<form action="<%=basePath%>deviceman/processDeviceBatchImport.shtml" method="post" enctype="multipart/form-data">
<tr>
<td>
<label>
<!-- <input type="text" style="width:350px" readonly="readonly" name="file_name" id="file_name"/>
<input type="file" name="btn_file" style="display:none" οnchange="file_name.value=this.value"/>
<input type="button" value="瀏 覽" οnclick="btn_file.click();" name="get_file"/>
<input type="submit" value="提 交" name="sub"/>-->
<input id="filePath" type="file" name="file" /> <input type="submit" value="確定" />
</label>
</td>
</tr>
</form>
三、後臺處理上傳文件請求
(1)接收頁面excel上傳請求
/**
* @Title: processDeviceBatchImport
* @Description: 處理上傳
* @param file
* @return ModelAndView 返回類型
* @throws
*/
@RequestMapping(value = "processDeviceBatchImport.shtml", method = RequestMethod.POST)
public ModelAndView processDeviceBatchImport(@RequestParam(value = "file", required = false) MultipartFile file) {
logger.debug("enter DeviceManageAction.processDeviceBatchImport(@RequestParam MultipartFile file)");
ModelAndView model = new ModelAndView("/thingsConnMan/deviceMan/deviceBatchImportList");
try {
List<CdmDeviceListBean> deviceInfoList = deviceManageService.transExcelToObj(file.getInputStream());
int count = deviceManageService.saveImportDeviceInfo(deviceInfoList);
model.addObject("deviceInfoList", deviceList);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
logger.debug("exit DeviceManageAction.processDeviceBatchImport(@RequestParam MultipartFile file)");
return model;
}
(2)將excel數據轉換爲數據庫表對應的實體對象
/**
* @Title: transExcelToObj
* @Description: excel數據轉換爲實體對象
* @param in
* @return List<CdmDeviceListBean> 返回類型
* @throws
*/
public List<CdmDeviceListBean> transExcelToObj(InputStream in) {
logger.debug("enter DeviceManageService.transExcelToObj(InputStream in)");
List<CdmDeviceListBean> academyList = new ArrayList<CdmDeviceListBean>();
try {
String cellStr = null;
Workbook wb = new XSSFWorkbook(in);
Sheet sheet = wb.getSheetAt(0);
int firstRow = sheet.getFirstRowNum() + 1;
int lastRow = sheet.getLastRowNum();
for (int i = firstRow; i <= lastRow; i++) {
CdmDeviceListBean bean = new CdmDeviceListBean();
Row row = sheet.getRow(i);
if (row == null) {
continue;
}
for (int j = 0; j < row.getLastCellNum(); j++) {
Cell cell = row.getCell(j);
cellStr = ConvertCellStr(cell, cellStr);
bean = addingCdmDevice(j, bean, cellStr);
bean.setIsvalidate("0");
logger.debug("-----" + bean.getBatchName() + "--------------");
}
academyList.add(bean);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
} else {
logger.info("沒有數據流");
}
}
logger.debug("exit DeviceManageService.transExcelToObj(InputStream in)");
return academyList;
}
注意點:
1.將excel文件流轉換爲workbook對象:
Workbook wb = new XSSFWorkbook(in);
2.獲取excel數據行,以便進行循環處理:
int firstRow = sheet.getFirstRowNum() + 1;
int lastRow = sheet.getLastRowNum();
3.對excel中cell的值進行轉化,其中涉及到excel科學計數法的轉換以及日期的轉換:
/**
* @Title: ConvertCellStr
* @Description: excel數據轉換
* @param cell
* @param cellStr
* @return String 返回類型
* @throws
*/
private String ConvertCellStr(Cell cell, String cellStr) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
// 讀取String
cellStr = cell.getStringCellValue().toString();
break;
case Cell.CELL_TYPE_BOOLEAN:
// 得到Boolean對象的方法
cellStr = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
// 先看是否是日期格式
if (DateUtil.isCellDateFormatted(cell)) {
// 讀取日期格式
cellStr = cell.getDateCellValue().toString();
} else {
// 讀取數字
DecimalFormat df = new DecimalFormat("0");
cellStr = String.valueOf(df.format(cell.getNumericCellValue()));
}
break;
case Cell.CELL_TYPE_FORMULA:
// 讀取公式
cellStr = cell.getCellFormula().toString();
break;
}
return cellStr;
}
4.設置實體屬性值,通過switch語句,很方便的將各個cell中的值放入實體對應的字段中:/**
* @Title: addingCdmDevice
* @Description: 設置實體屬性值
* @param j
* @param bean
* @param cellStr
* @return CdmDeviceListBean 返回類型
* @throws
*/
private CdmDeviceListBean addingCdmDevice(int j, CdmDeviceListBean bean, String cellStr) {
switch (j) {
case 0:
bean.setDeviceSn(cellStr);
break;
case 1:
bean.setDeviceModel(cellStr);
break;
case 2:
bean.setDeviceName(cellStr);
break;
case 3:
bean.setBatchName(cellStr);
break;
case 4:
bean.setSimNo(cellStr);
break;
case 5:
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);
// java.util.Date對象
try {
Date date = (Date) sdf.parse(cellStr);
Date d = DateFormat.formatDate(date);
bean.setProductTime(d);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
return bean;
}
(3)將轉化後的實體對象列表直接入庫:
/* (非 Javadoc)
* <p>Title: batchSaveDeviceInfo</p>
* <p>Description: 批量保存設備信息 </p>
* @param cdmDeviceList
* @return
* @see com.spring3.DAO.things.DeviceManageDao#batchSaveDeviceInfo(java.util.List)
*/
@Override
@Transactional
public int batchSaveDeviceInfo(final List<CdmDeviceListBean> cdmDeviceList) {
int affectedRow = (Integer) getHibernateTemplate().execute(new HibernateCallback<Object>() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
for (int i = 0; i < cdmDeviceList.size(); ++i) {
session.save(cdmDeviceList.get(i));
if (i % BATCH_MAX_ROW == 0) {
session.flush();
session.clear();
}
}
session.flush();
session.clear();
return cdmDeviceList.size();
}
});
return affectedRow;
}
如上變完成了excel數據導入oracle的操作