1. 程式人生 > >JAVA解析Excel檔案的兩種方式 --Poi技術

JAVA解析Excel檔案的兩種方式 --Poi技術

目前有兩種比較主流的技術解析Excel檔案,這裡我講解的是Poi技術的實現。
話不多話,Poi包裡有4個主要的類,包括:

Workbook------工作表,通過WorkbookFactory的create(FileInputStream fis)方法獲取,

Sheet------------表格,Workbook例項的getSheetAt(int num)方法獲取,

Row--------------行,Sheet例項的getRow(int num)方法獲取,

Cell--------------單元格,Row例項的getCell(int num)方法獲取,

最後通過Cell例項根據資料型別呼叫對應的方法獲取單元格的值。

下面是我做的一個例項。

excel檔案內容:包含字串、日期、數值、公式等數值型別



 

解析類程式碼:

Java程式碼  收藏程式碼
  1. public class Poi {  
  2.     private Sheet sheet;    //表格類例項  
  3.     LinkedList[] result;    //儲存每個單元格的資料 ,使用的是一種連結串列陣列的結構  
  4.     //讀取excel檔案,建立表格例項  
  5.     private void loadExcel(String filePath) {  
  6.         FileInputStream inStream = null;  
  7.         try
     {  
  8.             inStream = new FileInputStream(new File(filePath));  
  9.             Workbook workBook = WorkbookFactory.create(inStream);  
  10.             sheet = workBook.getSheetAt(0);           
  11.         } catch (Exception e) {  
  12.             e.printStackTrace();  
  13.         }finally{  
  14.             try {  
  15.                 if(inStream!=null){  
  16.                     inStream.close();  
  17.                 }                  
  18.             } catch (IOException e) {                  
  19.                 e.printStackTrace();  
  20.             }  
  21.         }  
  22.     }  
  23.     //獲取單元格的值  
  24.     private String getCellValue(Cell cell) {  
  25.         String cellValue = "";  
  26.         DataFormatter formatter = new DataFormatter();  
  27.         if (cell != null) {  
  28.             //判斷單元格資料的型別,不同型別呼叫不同的方法  
  29.             switch (cell.getCellType()) {  
  30.                 //數值型別  
  31.                 case Cell.CELL_TYPE_NUMERIC:  
  32.                     //進一步判斷 ,單元格格式是日期格式   
  33.                     if (DateUtil.isCellDateFormatted(cell)) {  
  34.                         cellValue = formatter.formatCellValue(cell);  
  35.                     } else {  
  36.                         //數值  
  37.                         double value = cell.getNumericCellValue();  
  38.                         int intValue = (int) value;  
  39.                         cellValue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value);  
  40.                     }  
  41.                     break;  
  42.                 case Cell.CELL_TYPE_STRING:  
  43.                     cellValue = cell.getStringCellValue();  
  44.                     break;  
  45.                 case Cell.CELL_TYPE_BOOLEAN:  
  46.                     cellValue = String.valueOf(cell.getBooleanCellValue());  
  47.                     break;  
  48.                     //判斷單元格是公式格式,需要做一種特殊處理來得到相應的值  
  49.                 case Cell.CELL_TYPE_FORMULA:{  
  50.                     try{  
  51.                         cellValue = String.valueOf(cell.getNumericCellValue());  
  52.                     }catch(IllegalStateException e){  
  53.                         cellValue = String.valueOf(cell.getRichStringCellValue());  
  54.                     }  
  55.                 }  
  56.                     break;  
  57.                 case Cell.CELL_TYPE_BLANK:  
  58.                     cellValue = "";  
  59.                     break;  
  60.                 case Cell.CELL_TYPE_ERROR:  
  61.                     cellValue = "";  
  62.                     break;  
  63.                 default:  
  64.                     cellValue = cell.toString().trim();  
  65.                     break;  
  66.             }  
  67.         }  
  68.         return cellValue.trim();  
  69.     }  
  70.     //初始化表格中的每一行,並得到每一個單元格的值  
  71.     public  void init(){  
  72.         int rowNum = sheet.getLastRowNum() + 1;  
  73.         result = new LinkedList[rowNum];  
  74.         for(int i=0;i<rowNum;i++){  
  75.             Row row = sheet.getRow(i);  
  76.             //每有新的一行,建立一個新的LinkedList物件  
  77.             result[i] = new LinkedList();  
  78.             for(int j=0;j<row.getLastCellNum();j++){  
  79.                 Cell cell = row.getCell(j);  
  80.                 //獲取單元格的值  
  81.                 String str = getCellValue(cell);  
  82.                 //將得到的值放入連結串列中  
  83.                 result[i].add(str);  
  84.             }  
  85.         }  
  86.     }  
  87.     //控制檯列印儲存的表格資料  
  88.     public void show(){  
  89.         for(int i=0;i<result.length;i++){  
  90.             for(int j=0;j<result[i].size();j++){  
  91.                 System.out.print(result[i].get(j) + "\t");  
  92.             }  
  93.             System.out.println();  
  94.         }  
  95.     }  
  96.     public static void main(String[] args) {  
  97.         Poi poi = new Poi();  
  98.         poi.loadExcel("jxl.xls");  
  99.         poi.init();  
  100.         poi.show();  
  101.     }  
  102. }  

控制檯輸出結果:



 

備註:上述的程式碼只能解析xls格式 的檔案,對於xlsx格式則需要另外幾個類解析,XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell,其實方法和思路是一樣,相應的改改類名而已,不是很複雜。

相關推薦

JAVA解析Excel檔案方式 --Poi技術

目前有兩種比較主流的技術解析Excel檔案,這裡我講解的是Poi技術的實現。 話不多話,Poi包裡有4個主要的類,包括: Workbook------工作表,通過WorkbookFactory的create(FileInputStream fis)方法獲取, Sheet--

java解析xml檔案方式

1.介紹 1)DOM(JAXP Crimson解析器) DOM是用與平臺和語言無關的方式表示XML文件的官方W3C標準。DOM是以層次結構組織的節點或資訊片斷的集合。這個層次結構允許開發人員在樹中尋找特定資訊。分析該結構通常需要載入整個文件和構造層次結構,然後才能做任何工作。由於它是基於資訊層次的,因而

java建立excel方式

方法一,利用第三方jar包:jxl.jar public void createExcel(){ try{ //開啟檔案 WritableWorkbook workbook = Workbook.createWorkbook(new File("test.

JAVA 解析excel檔案 poi方式

package *.utils; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; impo

java Web釋出的方式

一種是直接呼叫API: Endpoint.publish("http://192.168.14.117:8888/java6ws/Java6WS", new Java6WS()); Endpoint.publish是一個後臺執行緒,一旦釋出了就會一直等待處理Web服務的請求,只有當mai

解析xml的方式 ,使用jaxp查詢xml結點的例項

解析xml的兩種方式    使用jaxp查詢xml結點的例項   person.xml    TestJaxp.java import org.w3c.dom.Document; import org.w3c.d

java 傳遞引數的方式

                Java中沒有指標,所以也沒有引用傳遞了,僅僅有值傳遞不過可以通過物件的方式來實現引用傳遞 類似j

Java獲取年月日的方式

方式一: Calendar calendar = Calendar.getInstance(); System.out.println(calendar.get(Calendar.YEAR)); Sy

JAVA 建立程序的方式

在Java中建立執行緒有兩種方式:繼承Thread類或者實現Runnable介面再重寫run()方法 那麼在Java中要如何建立程序呢? 同樣也有兩種方法 通過ProcessBuilder.start()方法 先看程序類Process publ

java 呼叫http介面方式

import java.io.BufferedWriter; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.Input

C++ 中#include標頭檔案方式的區別

<>:先在系統目錄中尋找標頭檔案,然後再到當前目錄下找,一般用於標準的標頭檔案 stdio.h和 stdlib.h等等"  ":先在當前目錄中尋找標頭檔案,然後再到系統目錄中找,一般用於in

oracle 刪除備份檔案方式

執行後會在相同目錄下生成日誌檔案:DelExpiredLog.log現實執行的起始時間點。 @echo off rem write to log set filename=DelExpiredLog.log echo -------------------Delete Expired Log Files--

JqGrid分頁表格資料匯出excel方式

首先要確定一個問題: 你的資料返回的方式是一次性載入完還是點選下一頁重新請求伺服器? 根據你上邊資料返回的方式,我們分類來處理。 第一種:點選下一頁重新請求伺服器 這種的話,每次點選下一頁是需要重新請求伺服器的,所以我們只需傳送請求,然後後臺從資料庫sele

java實現二分查詢-方式

二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。 起初在資料結構中學習遞迴時實現二分查詢,實際上不用遞迴也可以實現,畢竟遞迴是需要開闢額外的空間的來輔助查詢。本文就介紹兩種方法 二分查詢演算法思想 有序的序列,每次都是以序列的中間位置的數來與待查詢的關鍵字進行比

springBoot使用Controller讀取配置檔案方式&讀取自定義配置方法

Controller 核心配置檔案 application.propertie web.msg=Hello! This is Controller demo; Controller:

Mysql 匯入匯出檔案方式

下面我們要把上面的檔案匯入到資料庫中,匯入之前要確認資料庫已經在執行,即是mysqld程序(或者說服務,Windows NT下面稱為”服務“,unix下面為”程序“)已經在執行。然後執行下面的命令: bin/mysql –p < /home/mark/New_Data.sql 接著按提示輸入密碼,如果上

Jacoco生成java覆蓋率報告的方式

shutdown jvm時dump出覆蓋率資料 1.下載jacoco:http://www.eclemma.org/jacoco/ 2.對於tomcat,在catalina.sh的JAVA_OPTS配置中增加: -javaagent:/home/work/local/ja

java分頁的方式

  方式其實都非常的簡單,一種是資料庫分頁用limit限制取出條數,一種是在業務邏輯裡面分頁,我用的是jdbc,所以每次遊標指定到一定的條數進行展示。   1資料庫分頁(關鍵字limit) 因為只是簡單的進行原理學習,所以並沒有對程式碼方面對嚴格的書寫,明白原理就好。 主

Java解析JSON的四方式

微信搜尋關注“程式設計師旅途”公眾號,檢視更多 一、什麼是JSON JSON是一種輕量級的資料交換格式,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。 易於閱讀和編寫,同時也易於解析和生成,並有效地提升網路傳

C#讀取Excel資料方式效能對比

方式一:程式讀取Excel資料,程式碼如下:             Excel.Application m_ExcelFile = new Excel.Application();             Excel._Workbook m_Workbook;