讀取Excel技術說明
一、項目情況
巴斯夫項目需要實現Excel的相關操作:Excel的上傳讀取。
二、添加依賴
<!-- 讀取excel用到的-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<!--是java開發者用到的一個組件,這個組件可以完美解決讀取excel時報錯的問題,加載後就可以進行word、excel文檔的讀取操作了-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.2-FINAL</version>
</dependency>
三、讀取Excel的原理
第一步:在Controller層使用MultipartFile 獲取上傳的文件。
第二步:獲取上傳文件的文件名稱,並保存到服務器本地。使用POIUtil工具類的readExcelFromWorkbook方法讀取excel對象的數據。
//獲取excel文件名稱
String realFileName = excelFile.getOriginalFilename();
//將excel文件轉爲輸入流
InputStream is = excelFile.getInputStream();
//保存文件(上傳到本地),返回文件全路徑名
String wholefilename = testService.saveUploadfile(excelFile.getBytes(), realFileName);
//使用POIUtil工具類,根據文件後綴名獲取對應實現類
Workbook workbook = POIUtil.getWorkBookbyinputstream(is,realFileName);
//獲取該excel對象中的數據
List<ExcelFormBean> exceldata = POIUtil.readExcelFromWorkbook(workbook);
第三步:將讀取的excel數據存儲到數據庫
//將excel數據存入數據庫
recordid=testService.saveWorkbook(wholefilename, exceldata, realFileName);
四、說明
1.要讀取excel中的數據,需要將上傳的文件對象按照文件的後綴轉換爲指定的Workbook實現類。使用的方法如下:
public static Workbook getWorkBookbyinputstream(InputStream is,String fileName) {
//創建Workbook工作薄對象,表示整個excel
Workbook workbook = null;
try {
//根據文件後綴名不同(xls和xlsx)獲得不同的Workbook實現類對象
if(fileName.endsWith(xls)){
//2003
workbook = new HSSFWorkbook(is);
}else if(fileName.endsWith(xlsx)){
//2007
workbook = new XSSFWorkbook(is);
}
} catch (IOException e) {
/* logger.info(e.getMessage());*/
System.out.println(e.getMessage());
}
return workbook;
}
2.讀取Excel的方法,傳入Workbook對象,循環遍歷使用getCellValue方法返回單元格值。並添加到List<ExcelFormBean>中返回到Controller
public static List<ExcelFormBean> readExcelFromWorkbook(Workbook workbook) throws IOException{
List<ExcelFormBean> datalist = new ArrayList<>();
if(workbook != null){
for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){
//獲得當前sheet工作表
Sheet sheet = workbook.getSheetAt(sheetNum);
if(sheet == null){
continue;
}
ExcelFormBean exceldata = new ExcelFormBean();
exceldata.setSheetname(sheet.getSheetName());
//創建返回對象,把每行中的值作爲一個數組,所有行作爲一個集合返回
List<String[]> list = new ArrayList<>();
//獲得當前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.getLastCellNum();
String[] cells = new String[lastCellNum];
//循環當前行
for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){
Cell cell = row.getCell(cellNum);
cells[cellNum] = getCellValue(cell);
}
list.add(cells);
}
exceldata.setDatalist(list);
datalist.add(exceldata);
}
workbook.close();
}
return datalist;
}
3.最後保存讀取出的excel數據到數據庫中:循環遍歷List<ExcelFormBean>,使用對應表的Entity來封裝數據,在Dao層訪問數據庫持久化數據。