使用的工具如下:
JQuery ocupload jquery.ocupload-1.1.2.js
Apache POI poi-3.9.jar
如果是Maven項目添加依賴如下:
<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency>
JQuery ocupload:
首先要使用一鍵上傳要在從項目中引用js(地址在上面)
官方的上傳例子:
$(element).upload({ name: 'file',//上傳組件的name屬性,即<input type='file' name='file'/> action: '',//向服務器請求的路徑 enctype: 'multipart/form-data',//mime類型,默認即可 params: {},//請求時額外傳遞的參數,默認為空 autoSubmit: true,//是否自動提交,即當選擇了文件,自動關閉了選擇窗口后,是否自動提交請求。 onSubmit: function() {},//提交表單之前觸發事件 onComplete: function() {},//提交表單完成后觸發的事件 onSelect: function() {}//當用戶選擇了一個文件后觸發事件 });
開發代碼:
1.自定義一個按鈕
<button type="button" id="uploadExcel"><i> 上傳Excel</i></button>
我的項目使用的bootstrap有需要的可以參考下其中的樣式,用其他UI的可以忽略
<button type="button" id="uploadExcel" class="btn btn-primary disabled" data-btn-type="selectIcon"> <i class="fa fa-mail-forward"> 上傳Excel-(西葯)</i> </button>
2.上傳文件的js代碼
//調用OCUpload插件的方法 $("#uploadExcel").upload({ action:basePath+"/excel/upload/WesternMedicine", //表單提交的地址 name:"myFile", onComplete:function (data) { //提交表單之后 if(data == "0"){ $("#myModal").modal(); //提示框,Excel導入成功 }else{ $("#myModal2").modal(); //提示框,Excel導入成失敗 } }, onSelect: function() {//當用戶選擇了一個文件后觸發事件 //當選擇了文件后,關閉自動提交 this.autoSubmit=false; //校驗上傳的文件名是否滿足后綴為.xls或.xlsx var regex =/^.*\.(?:xls|xlsx)$/i; //this.filename()返回當前選擇的文件名稱 (ps:我使用這個方法沒好使,自己寫了一個獲取文件的名的方法) $("[name = '"+this.name()+"']").val()) //alert(this.filename()); if(regex.test($("[name = '"+this.name()+"']").val())){ //通過校驗 this.submit(); }else{ //未通過 $("#myModal3").modal(); //錯誤提示框,文件格式不正確,必須以.xls或.xlsx結尾 } } });
3.使用POI上傳的后台代碼:
先建立一個class POIUtil 放便使用:本人寫了一個,但是在查詢資料時候,發現一個更全面的POIUtil便copy下來如下:
出處:java使用POI實現excel文件的讀取,兼容后綴名xls和xlsx
Class POIUtil :
import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.multipart.MultipartFile; /** * excel讀寫工具類 * Excel 導入到mysql * Created by CR7 on 2017-3-8 */ public class POIUtil { private static Logger logger = Logger.getLogger(POIUtil.class); private final static String xls = "xls"; private final static String xlsx = "xlsx"; /** * 讀入excel文件,解析后返回 * @param file * @throws IOException */ public static List<String[]> readExcel(MultipartFile file) throws IOException{ //檢查文件 checkFile(file); //獲得Workbook工作薄對象 Workbook workbook = getWorkBook(file); //創建返回對象,把每行中的值作為一個數組,所有行作為一個集合返回 List<String[]> list = new ArrayList<String[]>(); if(workbook != null){ for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){ //獲得當前sheet工作表 Sheet sheet = workbook.getSheetAt(sheetNum); if(sheet == null){ continue; } //獲得當前sheet的開始行 int firstRowNum = sheet.getFirstRowNum(); //獲得當前sheet的結束行 int lastRowNum = sheet.getLastRowNum(); //循環除了第一行的所有行 for(int rowNum = firstRowNum+1;rowNum <= lastRowNum;rowNum++){ //獲得當前行 Row row = sheet.getRow(rowNum); if(row == null){ continue; } //獲得當前行的開始列 int firstCellNum = row.getFirstCellNum(); //獲得當前行的列數 int lastCellNum = row.getPhysicalNumberOfCells(); String[] cells = new String[row.getPhysicalNumberOfCells()]; //循環當前行 for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){ Cell cell = row.getCell(cellNum); cells[cellNum] = getCellValue(cell); } list.add(cells); } } // workbook.close(); } return list; } public static void checkFile(MultipartFile file) throws IOException{ //判斷文件是否存在 if(null == file){ logger.error("文件不存在!"); throw new FileNotFoundException("文件不存在!"); } //獲得文件名 String fileName = file.getOriginalFilename(); //判斷文件是否是excel文件 if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){ logger.error(fileName + "不是excel文件"); throw new IOException(fileName + "不是excel文件"); } } public static Workbook getWorkBook(MultipartFile file) { //獲得文件名 String fileName = file.getOriginalFilename(); //創建Workbook工作薄對象,表示整個excel Workbook workbook = null; try { //獲取excel文件的io流 InputStream is = file.getInputStream(); //根據文件后綴名不同(xls和xlsx)獲得不同的Workbook實現類對象 if(fileName.endsWith(xls)){ //2003 workbook = new HSSFWorkbook(is); }else if(fileName.endsWith(xlsx)){ //2007 及2007以上 workbook = new XSSFWorkbook(is); } } catch (IOException e) { logger.info(e.getMessage()); } return workbook; } public static String getCellValue(Cell cell){ String cellValue = ""; if(cell == null){ return cellValue; } //把數字當成String來讀,避免出現1讀成1.0的情況 if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){ cell.setCellType(Cell.CELL_TYPE_STRING); } //判斷數據的類型 switch (cell.getCellType()){ case Cell.CELL_TYPE_NUMERIC: //數字 cellValue = String.valueOf(cell.getNumericCellValue()); break; case Cell.CELL_TYPE_STRING: //字符串 cellValue = String.valueOf(cell.getStringCellValue()); break; case Cell.CELL_TYPE_BOOLEAN: //Boolean cellValue = String.valueOf(cell.getBooleanCellValue()); break; case Cell.CELL_TYPE_FORMULA: //公式 cellValue = String.valueOf(cell.getCellFormula()); break; case Cell.CELL_TYPE_BLANK: //空值 cellValue = ""; break; case Cell.CELL_TYPE_ERROR: //故障 cellValue = "非法字符"; break; default: cellValue = "未知類型"; break; } return cellValue; } }
后台代碼:使用的是SpringMVC 和Spring 和Hibernate
controller:
// 上傳西葯 @RequestMapping(method = RequestMethod.POST ,value="/upload/WesternMedicine") @ResponseBody private String uploadWesternMedicine(MultipartFile myFile) throws IOException { String flag ="0"; try{ List<String[]> list = POIUtil.readExcel(myFile); //這里得到的是一個集合,里面的每一個元素是String[]數組 excelService.saveBath(list); //service實現方法 } catch(Exception e){ flag = "1"; } return flag; }
serviceImpl:思路就是遍歷數據得到每一個String[],也就是類,然后保存(其中數字轉換時候可能有一些問題,下面有解決方法)
@Override public void saveBath(List<String[]> list) { for (String[] strings : list) { Drug drug = new Drug(); drug.setName(strings[0]); drug.setSpecification(strings[1]); drug.setUnit(strings[2]); //drug.setPrice(strings[3]); //這種方法會導致價格出現如下數字:16.399999999999999 77.900000000000006 BigDecimal bd = new BigDecimal(strings[3]); bd = bd.setScale(1,BigDecimal.ROUND_HALF_UP); String price = bd.toString(); if("0".equals(price.substring(price.length()-1))){ //如果最后一位是0 如 26.0元 33.0元 就把 .0 刪除 String newPrice = price.substring(0, price.length()-2); drug.setPrice(newPrice); }else{ drug.setPrice(price); } drug.setStatus("0"); drug.setDrug_classify("8afa9409591f762b01591ffa62ff0006"); this.save(drug); } }
上傳成功:
截圖如下: