關於Excel表格的匯入
Excel表格的匯入
功能描述
Excel的匯入就是在java後端對Excel的表格的內容進行解析,將解析的內容存放進資料庫當中就可以了
這其中涉及的技術點有兩個:
1.檔案的傳輸:即在前端獲取檔案的資訊,將檔案的資訊傳給後端
2.後端獲取前端的檔案資訊,將檔案進行解析,然後將解析的資料存放進資料庫當中
結構描述
檔案傳輸
檔案的傳輸我瞭解的有兩種方式:
1.利用ajaxFileUpload外掛
2.利用bootstrap的fileinput外掛
因為本文的重點是對excel的解析,所以對於檔案傳輸的部分不做講解
需要匯入的jar
1.commons-collections4-4.1.jar
2.poi-3.17-beta1.jar
3.poi-ooxml-3.17-beta1.jar
4.poi-ooxml-schemas-3.17-beta1.jar
5.xmlbeans-2.6.0.jar
主要API
1.import org.apache.poi.ss.usermodel.Workbook,對應Excel文件;
2.import org.apache.poi.hssf.usermodel.HSSFWorkbook,對應xls格式的Excel文件;
3.import org.apache.poi.xssf.usermodel.XSSFWorkbook,對應xlsx格式的Excel文件;
4.import org.apache.poi.ss.usermodel.Sheet,對應Excel文件中的一個sheet;
5.import org.apache.poi.ss.usermodel.Row,對應一個sheet中的一行;
6.import org.apache.poi.ss.usermodel.Cell,對應一個單元格。
Excel解析
解析按照以下幾個步驟來:
- 獲取檔案
- 讀取檔案,判斷檔案型別
//讀取excel public static Workbook readExcel(String filePath){ Workbook wb = null; if(filePath==null){ return null; } String extString = filePath.substring(filePath.lastIndexOf(".")); InputStream is = null; try { is = new FileInputStream(filePath); if(".xls".equals(extString)){ return wb = new HSSFWorkbook(is); }else if(".xlsx".equals(extString)){ return wb = new XSSFWorkbook(is); }else{ return wb = null; } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return wb; }
- 開始解析資料,解析由sheet–>row–>cell的順序
- 儲存資料
@RequestMapping(value = "/importExcel",method=RequestMethod.POST)
@ResponseBody
public Result importExcel(HttpServletRequest request,HttpServletResponse response) {
System.out.println("進入了測試方法!");
Result result=new Result();
Workbook wb =null;
Sheet sheet = null;
Row row = null;
List<Map<String,String>> list = null;
String cellData = null;
String filePath = "C:\\Users\\admin\\Desktop\\學生資訊匯入模板.xlsx";
String columns[] = {"name","age","address"};
wb = readExcel(filePath);
if(wb != null){
//用來存放表中資料
list = new ArrayList<Map<String,String>>();
//獲取第一個sheet
sheet = wb.getSheetAt(0);
//獲取最大行數
int rownum = sheet.getPhysicalNumberOfRows();
//獲取第一行
row = sheet.getRow(0);
//獲取最大列數
int colnum = row.getPhysicalNumberOfCells();
for (int i = 1; i<rownum; i++) {
Map<String,String> map = new LinkedHashMap<String,String>();
row = sheet.getRow(i);
if(row !=null){
for (int j=0;j<colnum;j++){
cellData = (String) getCellFormatValue(row.getCell(j));
map.put(columns[j], cellData);
}
}else{
break;
}
list.add(map);
}
}
//遍歷解析出來的list
for (Map<String,String> map : list) {
Student student=new Student();
UUID uuid = UUID.randomUUID();
String str = uuid.toString();
String uuidStr = str.replace("-", "");
student.setId(uuidStr);
for (Entry<String,String> entry : map.entrySet()) {
System.out.print(entry.getKey()+":"+entry.getValue()+",");
if(entry.getKey().equals("name")){
student.setName(entry.getValue());
}else if(entry.getKey().equals("age")){
student.setAge(Integer.parseInt(entry.getValue().substring(0,entry.getValue().indexOf("."))));
}else if(entry.getKey().equals("address")){
student.setAddress(entry.getValue());
}
}
result = studentService.addStudent(student);
System.out.println();
}
result.setStatus(1);
return result;
}
這裡還需要一個解析單元格的工具類:
public static Object getCellFormatValue(Cell cell){
Object cellValue = null;
if(cell!=null){
//判斷cell型別
switch(cell.getCellType()){
case Cell.CELL_TYPE_NUMERIC:{
cellValue = String.valueOf(cell.getNumericCellValue());
break;
}
case Cell.CELL_TYPE_FORMULA:{
//判斷cell是否為日期格式
if(DateUtil.isCellDateFormatted(cell)){
//轉換為日期格式YYYY-mm-dd
cellValue = cell.getDateCellValue();
}else{
//數字
cellValue = String.valueOf(cell.getNumericCellValue());
}
break;
}
case Cell.CELL_TYPE_STRING:{
cellValue = cell.getRichStringCellValue().getString();
break;
}
default:
cellValue = "";
}
}else{
cellValue = "";
}
return cellValue;
}
總結
我做的時候大概就是這麼個流程,主要使用了apache的poi外掛,該外掛對於操作office的檔案非常厲害,大家可以作為參考,去學習學習.