Java讀取excel表格
一般都是用poi技術去讀取excel表格的,但是這個技術又是什么呢
什么是Apache POI?
Apache POI是一種流行的API,它允許程序員使用Java程序創建,修改和顯示MS Office文件。這由Apache軟件基金會開發使用Java分布式設計或修改Microsoft Office文件的開源庫。它包含類和方法對用戶輸入數據或文件到MS Office文檔進行解碼。
Apache POI
Apache POI是Apache軟件基金會提供的100%開源庫。大多數中小規模的應用程序開發主要依賴於Apache POI(HSSF+ XSSF)。它支持Excel 庫的所有基本功能; 然而,呈現和文本提取是它的主要特點。

工作簿
這是創建或維護Excel工作簿的所有類的超接口。它屬於org.apache.poi.ss.usermodel包。是實現此接口的兩個類,如下所示:
-
HSSFWorkbook : 這個類有讀取和.xls 格式和寫入Microsoft Excel文件的方法。它與微軟Office97-2003版本兼容。
-
XSSFWorkbook : 這個類有讀寫Microsoft Excel和OpenOffice的XML文件的格式.xls或.xlsx的方法。它與MS-Office版本2007或更高版本兼容。
HSSFWorkbook
它是在org.apache.poi.hssf.usermodel包的高層次的類。它實現了Workbook 接口,用於Excel文件中的.xls格式。下面列出的是一些本類下的方法和構造函數。
類的構造函數
| S.No. | 構造函數和說明 |
|---|---|
| 1 | HSSFWorkbook() 從頭開始創建一個新的HSSFWorkbook對象時。 |
| 2 | HSSFWorkbook(DirectoryNode directory, boolean preserveNodes) 創建一個特定的目錄中一個新的HSSFWworkbook對象。 |
| 3 | HSSFWorkbook(DirectoryNode directory, POIFSFileSystem fs, boolean preserveNodes) 給定一個POIFSFileSystem對象和特定的目錄中,它創建了一個SSFWorkbook對象讀取指定的工作簿。 |
| 4 | HSSFWorkbook(java.io.InputStream s) 創建使用輸入流中的新HSSFWorkbook對象時。 |
| 5 | HSSFWorkbook(java.io.InputStream s, boolean preserveNodes) 構建在輸入流的POI文件系統。 |
| 6 | HSSFWorkbook(POIFSFileSystem fs) 使用POIFSFileSystem對象構造的新HSSFWorkbook對象時。 |
| 7 | HSSFWorkbook(POIFSFileSystem fs, boolean preserveNodes) 給定一個POIFSFileSystem對象時,它會創建一個新的HSSFWorkbook對象時讀取指定的工作簿。 |
這些構造內的常用參數:
-
directory : 這是從POI文件系統處理的目錄。
-
fs :它是包含簿流該POI的文件系統。
-
preservenodes : 這是決定是否保留其他節點像宏的可選參數。它消耗大量的內存,因為它存儲在內存中的所有POIFileSystem(如果設置)。
注意:HSSFWorkbook類包含了許多方法;然而,它們僅與XLS格式兼容。在本教程中,重點是在Excel文件格式的最新版本。因此,HSSFWorkbook類的方法,這里沒有列出。如果需要這些類的方法,那么請參照POI-HSSFWorkbook類API在 https://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFWorkbook.html.
XSSFWorkbook
它是用於表示高和低層次Excel文件格式的類。它屬於org.apache.xssf.usemodel包,並實現Workbook接口。下面列出的是這個類的方法和構造函數。
類的構造函數
| S.No. | 構造函數和說明 |
|---|---|
| 1 | XSSFWorkbook() 從頭開始創建一個新的XSSFworkbook對象。 |
| 2 | XSSFWorkbook(java.io.File file) 構造從給定文件中的XSSFWorkbook對象。 |
| 3 | XSSFWorkbook(java.io.InputStream is) 構造一個XSSFWorkbook對象,通過緩沖整個輸入流到內存中,然后為它打開一個OPCPackage對象。 |
| 4 | XSSFWorkbook(java.lang.String path) 構建一個給定文件的完整路徑的XSSFWorkbook對象。 |
Sheet
Sheet是在org.apache.poi.ss.usermodel包的接口,它是創建具有特定名稱的高或低級別的電子表格的所有類的超接口。電子表格的最常見的類型是工作表,它被表示為單元的網格。
HSSFSheet
這是在org.apache.poi.hssf.usermodel包的類。它可以創建Excel電子表格,它允許在sheet 方式和表數據格式。
類的構造函數
| S.No. | 構造函數及描述 |
|---|---|
| 1 | HSSFSheet(HSSFWorkbook workbook) 創建新HSSFSheet通過調用HSSFWorkbook從頭開始創建一個表。 |
| 2 | HSSFSheet(HSSFWorkbook workbook, InternalSheet sheet) 創建HSSFSheet表示給定表對象。 |
XSSFSheet
這是代表了Excel電子表格的高級別代表的一類。這在org.apache.poi.hssf.usermodel包下。
類的構造函數
| S.No. | 構造函數及描述 |
|---|---|
| 1 | XSSFSheet() 創造了新的XSSFSheet- 調用XSSFWorkbook從頭開始創建一個表。 |
| 2 | XSSFSheet(PackagePart part, PackageRelationship rel) 創建XSSFSheet表示給定包的一部分和關系。 |
類方法
| S.No. | 方法和描述 |
|---|---|
| 1 | addMergedRegion(CellRangeAddress region) 添加單元的合並區域(因此這些單元格合並形成一個)。 |
| 2 | autoSizeColumn(int column) 調整列寬,以適應的內容。 |
| 3 | iterator() 此方法是用於rowIterator()的別名,以允許foreach循環 |
| 4 | addHyperlink(XSSFHyperlink hyperlink) 注冊超鏈接的集合中的超鏈接此工作表格上 |
對於此類的其余的方法,請參閱完整的API在:
https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFSheet.html.
行
這是在org.apache.poi.ss.usermodel包的接口。它是用於一排的電子表格的高層表示。它是代表了POI庫的行所有類的超接口。
XSSFRow
這是在org.apache.poi.xssf.usermodel包的類。它實現了Row接口,因此它可以在電子表格中創建行。下面列出的是這個類在方法和構造函數。
類方法
| S.No. | 描述 |
|---|---|
| 1 | createCell(int columnIndex) 創建新單元行並返回。 |
| 2 | setHeight(short height) 設置短單位的高度。 |
對於此類的其余的方法,參考如下鏈接:
https://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFRow.html
單元格
這是在org.apache.poi.ss.usermodel包的接口。它是代表了單元在電子表格中的行中的所有類的超接口。
單元格可以使用各種屬性,例如空白,數字,日期,錯誤等單元格被添加到一個行之前應具有(基於0)自己的編號。
XSSFCell
這是在 org.apache.poi.xssf.usermodel 包的類。它實現了單元格界面。它是單元在電子表格中的行的一個高層次的表示。
現在我用Java實現讀取excel表格
代碼實現
public static void excel() throws Exception { //用流的方式先讀取到你想要的excel的文件 FileInputStream fis=new FileInputStream(new File(System.getProperty("user.dir")+"/src/excel.xls")); //解析excel POIFSFileSystem pSystem=new POIFSFileSystem(fis); //獲取整個excel HSSFWorkbook hb=new HSSFWorkbook(pSystem); System.out.println(hb.getNumCellStyles()); //獲取第一個表單sheet HSSFSheet sheet=hb.getSheetAt(0); //獲取第一行 int firstrow= sheet.getFirstRowNum(); //獲取最后一行 int lastrow= sheet.getLastRowNum(); //循環行數依次獲取列數 for (int i = firstrow; i < lastrow+1; i++) { //獲取哪一行i Row row=sheet.getRow(i); if (row!=null) { //獲取這一行的第一列 int firstcell= row.getFirstCellNum(); //獲取這一行的最后一列 int lastcell= row.getLastCellNum(); //創建一個集合,用處將每一行的每一列數據都存入集合中 List<String> list=new ArrayList<>(); for (int j = firstcell; j <lastcell; j++) { //獲取第j列 Cell cell=row.getCell(j); if (cell!=null) { System.out.print(cell+"\t"); list.add(cell.toString()); } } User user=new User(); if (list.size()>0) { user.setUsername(list.get(1)); user.setPassword(list.get(2)); } BaseDAO dao=new BaseDAO(); dao.save(user); System.out.println(); } } fis.close(); }
