1 背景
小白今天閑着沒事,在公司摸魚,以為今天有事無聊的一天,突然上頭說小子,今天實現一下批量導入Excel數據吧,當時我的內心是拒絕的,然后默默打開idea。
2 介紹
2.1 框架
java本身並不支持讀取excel,所有讀取excel需要借助一些框架。目前有幾種方式,
1. Apache POI
2. Java Excel API
3. easyexcel
這里主要講解的是 Apache POI,Apache POI支持03版以及07年版 區別是后綴不一樣,03版對應的是xls 07版對應的是xlsx xlsx
這里主要講解的是07版的
2.2 excel字段介紹
1.sheet表示的是
excel底部的工作表.
對應的是POI的的XSSFSheet
2.row表示的是行
對應的是POI的的XSSFRow
3.cell表示的是每一行的單元格.
對應的是POI的的Cell
3 源碼
3.0 片段說明
1.上傳文件使用springboot的MultipartFile
對應
MultipartFile file
2.創建對象
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
3.獲取sheet(默認第一個)
XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
3.1 控制層源碼
@RequestMapping("/import")
public void importExcel(@RequestParam("file") MultipartFile file) throws Exception{
InputStream inputStream = file.getInputStream();
//07年的 不兼容之前
XSSFWorkbook xssfWorkbook = new XSSFWorkbook(inputStream);
XSSFSheet sheet = xssfWorkbook.getSheetAt(0);
//獲取行數
int lastRowNum = sheet.getLastRowNum();
for (int i = 1; i <= lastRowNum; i++) {
XSSFRow row = sheet.getRow(i);
QuChannel quChannel = new QuChannel();
if (row.getCell(0) != null){
row.getCell(0).setCellType(XSSFCell.CELL_TYPE_STRING);
quChannel.setChannel(row.getCell(0).getStringCellValue());
}
if (row.getCell(1) != null){
row.getCell(1).setCellType(XSSFCell.CELL_TYPE_STRING);
quChannel.setChannelName(row.getCell(1).getStringCellValue());
}
if (row.getCell(2) != null){
row.getCell(2).setCellType(XSSFCell.CELL_TYPE_STRING);
quChannel.setRemarks(row.getCell(2).getStringCellValue());
}
if (row.getCell(3) != null){
quChannel.setChannelSource((int) row.getCell(3).getNumericCellValue());
}
if (row.getCell(4) != null){
quChannel.setActivityType((int) row.getCell(4).getNumericCellValue());
}
if (row.getCell(5) != null){
quChannel.setDeliveryTime(row.getCell(5).getDateCellValue());
}
if (row.getCell(6) != null){
row.getCell(6).setCellType(XSSFCell.CELL_TYPE_STRING);
quChannel.setOriginalLink(row.getCell(6).getStringCellValue());
}
if (row.getCell(7) != null){
row.getCell(7).setCellType(XSSFCell.CELL_TYPE_STRING);
quChannel.setSaLink(row.getCell(7).getStringCellValue());
}
if (row.getCell(8) != null){
quChannel.setDeliveryMode((int) row.getCell(8).getNumericCellValue());
}
if (row.getCell(9) != null){
quChannel.setCreateGroup((int) row.getCell(9).getNumericCellValue());
}
if (row.getCell(10) != null){
row.getCell(10).setCellType(XSSFCell.CELL_TYPE_STRING);
quChannel.setRemark(row.getCell(10).getStringCellValue());
}
quChannelMapper.insert(quChannel);
}
}
3.2 review
1.避免將sql寫在for循環里面,改進的話可以創建一個列表list,將對象add進去,然后在循環外面進行批量插入
2.想要去重的話可以使用set的不能重復添加特性
3.注意excel的字段與類屬性的對應關系,如果excel字段是string,但是累屬性是整形的話,可以使用枚舉類
暫時想到這么多 歡迎指教評論