標籤:style java os io 檔案 資料 for ar
今天做了一個從Excel匯入資料,一點東西搗鼓了好久,還是在百度和同事的協助下……好慚愧啊……
所用jar:poi-3.9.jar;
所用架構:springMVC
代碼如下:
jsp:
<form name="userInfo" action="${ctx}/xxx/inserFromExcel.action" method="post" enctype="multipart/form-data">
<input type="file" id="excelFile" name="excelFile"/>
<input type="submit" id="ok" value="匯入Excel"class="button3" />
</form>
action:
@RequestMapping("inserFromExcel.action")
public String insertFromExcel(MultipartFile excelFile){
logger.debug("=============="+excelFile.getOriginalFilename() );
fService.insertFromExcel(excelFile);
return "redirect:/freight/searchFreight.action";
}
sevice:調用 不要忘記提交事務
dao:
@Override
public void insertFromExcel(MultipartFile excelPath) {
try {
System.out.println(excelPath);
// 建立對Excel活頁簿檔案的引用
Workbook wookbook=null;
InputStream is= excelPath.getInputStream();
try{
wookbook=new XSSFWorkbook(is);
}catch (Exception e)
{
wookbook = new HSSFWorkbook(is);
}
// 在Excel文檔中,第一張工作表的預設索引是0
// 其語句為:HSSFSheet sheet = workbook.getSheetAt(0);
Sheet sheet = wookbook.getSheet("Sheet1");
// 擷取到Excel檔案中的所有行數
int rows = sheet.getPhysicalNumberOfRows();
// 遍曆行
for (int i = 1; i < rows; i++) {
// 讀取左上端儲存格
Row row = sheet.getRow(i);
// 行不為空白
if (row != null) {
// 擷取到Excel檔案中的所有的列
int cells = row.getPhysicalNumberOfCells();
String value = "";
// 遍曆列
for (int j = 0; j < cells; j++) {
// 擷取到列的值
Cell cell = row.getCell(j);
if (cell != null) {
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_FORMULA:
break;
case HSSFCell.CELL_TYPE_NUMERIC:
value += cell.getNumericCellValue() + ",";
break;
case HSSFCell.CELL_TYPE_STRING:
value += cell.getStringCellValue() + ",";
break;
default:
value += "0";
break;
}
}
}
// 將資料插入到資料庫中
String[] val = value.split(",");
FreightEntity entity = new FreightEntity();
entity.setProductCode(val[0]);
entity.setProductName(val[1]);
entity.setOrg(val[2]);
entityManager.merge(entity);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
protected static String convert(String temp){
temp = temp.substring(0, temp.length()-2);
//excel是以1990年為基數的,而java中的date是以1970年為基數的。所以要扣除差 25569天
Date d = new Date((Long.valueOf(temp) - 25569) * 24 * 3600 * 1000);
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
return formater.format(d);
}
中間遇到的問題:
1.不能直接擷取路徑
可能是考慮到安全性的問題 除IE外都不能擷取到本地的絕對路徑
2.enctype="multipart/form-data" 它的意思是以二進位的資料格式來傳輸,所以我之前一直取不到值
3. 對應的方法的參數應該為MultipartFile類型