POI介紹: 1.什么是POI? Apache POI是用Java編寫的免費開源的跨平台的Java API,Apache POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能, 其中使用最多的就是使用POI操作Excel文件。 2.POI的使用: 1.導入依賴: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.14</version> </dependency> 2.POI結構: HSSF - 提供讀寫Microsoft Excel XLS格式檔案的功能 XSSF - 提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能(2007版以后的Excel) HWPF - 提供讀寫Microsoft Word DOC格式檔案的功能 HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能 HDGF - 提供讀Microsoft Visio格式檔案的功能 HPBF - 提供讀Microsoft Publisher格式檔案的功能 HSMF - 提供讀Microsoft Outlook格式檔案的功能 3.入門: 1.讀取Excel文件: 步驟: 1:創建工作簿對象 2:獲得工作表對象 3:遍歷工作表對象 獲得行對象 4:遍歷行對象 獲得單元格(列)對象 5:獲得數據 6:關閉 代碼演示: 注: XSSFWorkbook:工作簿 XSSFSheet:工作表 XSSFRow:行 XSSFCell:單元格 方式1: @Test public void exportExcel() throws IOException { //創建工作簿 XSSFWorkbook workbook = new XSSFWorkbook("D:\\hello.xlsx"); //獲取工作表,既可以根據工作表的順序獲取,也可以根據工作表的名稱獲取 XSSFSheet sheet = workbook.getSheetAt(0); //遍歷工作表獲得行對象 for (Row row : sheet) { //遍歷行對象獲取單元格對象 for (Cell cell : row) { //獲得單元格中的值 String value = cell.getStringCellValue(); System.out.println(value); } } workbook.close(); } 方式2: // 導出excel,獲取最后一行 @Test public void exportExcel_lastRow() throws IOException { //創建工作簿 XSSFWorkbook workbook = new XSSFWorkbook("D:\\hello.xlsx"); //獲取工作表,既可以根據工作表的順序獲取,也可以根據工作表的名稱獲取 XSSFSheet sheet = workbook.getSheetAt(0); //獲取當前工作表最后一行的行號,行號從0開始 int lastRowNum = sheet.getLastRowNum(); for(int i=0;i<=lastRowNum;i++){ //根據行號獲取行對象 XSSFRow row = sheet.getRow(i); short lastCellNum = row.getLastCellNum(); for(short j=0;j<lastCellNum;j++){ String value = row.getCell(j).getStringCellValue(); System.out.println(value); } } workbook.close(); } 2.向Excel文件寫入數據: 1.步驟: 1.創建工作簿對象 2.創建工作表對象 3.創建行對象 4.創建列(單元格)對象, 設置內容 5.通過輸出流將workbook對象下載到磁盤 2.代碼演示: @Test public void importExcel() throws IOException { //在內存中創建一個Excel文件 XSSFWorkbook workbook = new XSSFWorkbook(); //創建工作表,指定工作表名稱 XSSFSheet sheet = workbook.createSheet("華為"); //創建行,0表示第一行 XSSFRow row = sheet.createRow(0); //創建單元格,0表示第一個單元格 row.createCell(0).setCellValue("編號"); row.createCell(1).setCellValue("姓名"); row.createCell(2).setCellValue("年齡"); XSSFRow row1 = sheet.createRow(1); row1.createCell(0).setCellValue("1"); row1.createCell(1).setCellValue("小明"); row1.createCell(2).setCellValue("10"); XSSFRow row2 = sheet.createRow(2); row2.createCell(0).setCellValue("2"); row2.createCell(1).setCellValue("小王"); row2.createCell(2).setCellValue("20"); //通過輸出流將workbook對象下載到磁盤 FileOutputStream out = new FileOutputStream("D:\\itcast.xlsx"); workbook.write(out); out.flush();//刷新 out.close();//關閉 workbook.close(); } 4.POI工具類: 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; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.List; public class POIUtils { private final static String xls = "xls"; private final static String xlsx = "xlsx"; private final static String DATE_FORMAT = "yyyy/MM/dd"; /** * 讀入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){ throw new FileNotFoundException("文件不存在!"); } //獲得文件名 String fileName = file.getOriginalFilename(); //判斷文件是否是excel文件 if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){ 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 workbook = new XSSFWorkbook(is); } } catch (IOException e) { e.printStackTrace(); } return workbook; } public static String getCellValue(Cell cell){ String cellValue = ""; if(cell == null){ return cellValue; } //如果當前單元格內容為日期類型,需要特殊處理 String dataFormatString = cell.getCellStyle().getDataFormatString(); if(dataFormatString.equals("m/d/yy")){ cellValue = new SimpleDateFormat(DATE_FORMAT).format(cell.getDateCellValue()); 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; } } 批量導入實現思路:
(1)提供模板文件
(2)實現模板文件下載(填寫數據)
(3)文件上傳(讀取excel的數據,批量導入到數據庫)
后台:
1.采用POI工具類讀取Excel文件,獲取字符串數組;
2.遍歷字符串數組,獲取對應的值並設置pojo的屬性值為該值;