2012-12-13 102 views
0

我有一個從Excel文檔中提取數據的java代碼。 我想計算列數和總行數(在特定列中)。我怎樣才能做到這一點?下面提供了Java代碼和期望的o/p。如何使用Java計算Excel文檔的列中的行數

(編輯):我應該做些什麼修改以獲得所需的o/p。我應該寫一個循環來獲得行和列的數量或有做同樣的

期望中的O/P

ColumnA ColumnB ColumnC 
Vinayak James Dan 
India US  Denmark 

Total number of Columns: 3 
number of data in ColumnA:2 
number of data in ColumnB:2 
number of data in ColumnC:2 

(編輯)的方法: - 已回答這裏 - Count number of rows in a column of Excel sheet(Java code provided)

我的Java代碼:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Iterator; 

import org.apache.poi.ss.formula.functions.Column; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class ExcelRead { 
    public static void main(String[] args) { 
     int count=0; 
    try { 
     FileInputStream file = new FileInputStream(new File("C:/Users/vinayakp/Desktop/Book.xlsx")); 
     XSSFWorkbook workbook = new XSSFWorkbook(file); 
     XSSFSheet sheet = workbook.getSheetAt(0); 
     Iterator<Row> rowIterator = sheet.iterator(); 
     while(rowIterator.hasNext()) { 
      Row row = rowIterator.next(); 
      Iterator<Cell> cellIterator = row.cellIterator(); 
      while(cellIterator.hasNext()) { 
       Cell cell = cellIterator.next(); 
       switch(cell.getCellType()) { 
        case Cell.CELL_TYPE_BOOLEAN: 
         System.out.print(cell.getBooleanCellValue() + "\t\t"); 
         break; 
        case Cell.CELL_TYPE_NUMERIC: 
         System.out.print(cell.getNumericCellValue() + "\t\t"); 
         break; 
        case Cell.CELL_TYPE_STRING: 
         System.out.print(cell.getStringCellValue() + "\t\t"); 
         break; 
       } 
      } 
      System.out.println(""); 
     } 

     file.close();  
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException ae) { 
     ae.printStackTrace(); 
    } 
} 
} 

輸出我得到的是:

ColumnA ColumnB ColumnC 
Vinayak James Dan 
India US  Denmark 

我需要得到所需的o/p,如上所示。 代碼正常工作但是我需要獲得計數列和行的值。請爲我提供相同的解決方案。我之前在代碼中已經解決了這個問題:Issue while reading Excel document (Java code)

回答

3

我認爲你可以使用代碼建議here來獲取列,然後獲取列中的每一行(儘管對於列中的每一列關於POI的方法),只需計算你需要的值。

所以,你的代碼可能會遵循一些爲:與列號工作

for(Row row : sheet) { 
    short minColIx = row.getFirstCellNum(); 
    short maxColIx = row.getLastCellNum(); 
    for(short colIx = minColIx; colIx<maxColIx; colIx++) { 
    Cell c = row.getCell(colIx); 
    if(c != null) { 
     if(c.getCellType() == Cell.CELL_TYPE_NUMERIC) { 
      // add c.getNumericCellValue() 
     } 
    } 
    } 
} 

也不錯的想法從poi api docs

+0

這幫助我獲得總列數..感謝:)我通過在我的工作表中添加更多的列進行驗證,它工作。現在我需要知道給定列中行數的_count_ –

+0

我應該使用'getPhysicalNumberOfRows'並迭代每列以查找每行數據的總計數? –

+0

不,我不這麼認爲,因爲「返回物理定義的行數(不是表中的行數)」(http://poi.apache.org/apidocs/org/apache/poi/ hssf/usermodel/HSSFSheet.html#getPhysicalNumberOfRows%28)29) – acostache

2

該代碼使用迭代器來分析每個行和列的值。它不知道它有多少項需要迭代,所以你不能查詢它的結果。

但是,您可以使用API​​ getLastRowNumreference)獲取最後一行索引。

獲取工作表上最後一行的編號。由於excel文件格式爲 ,如果調用此方法的結果爲零,則 無法確定該值是否表示表格中有零行,或位於零的位置是零。在這種情況下,請另外撥打 getPhysicalNumberOfRows()來確定是否有位於零位 的行。

類似地,對於HSSFRow類(reference)中的每個單元格,您都有API getLastCellNum

您需要更改代碼才能利用這些API。

教程:Read/Write Excel in Java

+0

如果我有2個數據和columbB與3不要你認爲_getLastRowNum_會給3每個案件的結果?隨時隨地的文章有時是一個很大的幫助。 –

+0

而應該使用'getPhysicalNumberOfRows'? –

+1

很高興你喜歡viralpatel.net。我認爲你所尋找的是用於迭代excel文件而不是傳統行>列的column> row方法。後者更直觀,這就是爲什麼使用像POI這樣的API的原因。我建議你手動解析工作表並創建二維數組來存儲計數。計數時您可能需要檢查空單元格。 –

1

我不熟悉與在Java代碼中的Excel工作簿的工作,但你有一個迭代器就在那裏。難道你不能簡單地給它添加一個int並且每次迭代都增加一個int嗎?

int counter = 0; 
while(rowIterator.hasNext()) { 
... 
counter++; 
} 

通過級聯迭代器,您可以使用多個計數器跟蹤不同的數字;

int[] counters = new int[4]; 
counters[0] = 0; // number of columns 
counters[1] = 0; // number of rows in colA 
counters[2] = 0; // number of rows in colB 
counters[3] = 0; // number of rows in colC 

while(rowIterator.hasNext()) { 
    /* 
    * keep track of columns. Useful if colD and more may exist too, but 
    * you don't want them counted 
    */ 
    int col = 0; 
    while(cellIterator.hasNext()) { 
     switch(col) { 
     case 0 : counters[1]++; break; // add row to colA counter 
     case 1 : counters[2]++; break; // add row to colB counter 
     case 2 : counters[3]++; break; // add row to colC counter 
     } 
     col++; 
    } 
    counters[0] = col; // save number of columns 
} 

這可能不是最好的方式介意你,但我認爲它應該工作得很好。請記住,我沒有這方面的經驗,所以如果有人使用xssf類的解決方案來回答問題,那可能會更好。另外,我還沒有測試過,但至少應該爲您提供一種方法。

我不知道xssf如何處理這個,但你可能想在計數之前檢查單元格是否爲空。然而,根據您發佈的代碼來判斷,我想這不是必需的。

如果你有可變數量的列(很可能,爲什麼要計數?),你應該製作一個可變長度列表,其中包含計數器,併爲每列添加一個新的計數器int。希望這可以幫助你!

+0

我做了,發生了什麼是它打印表中的行總數。對於例如如果在列A中,我有2個數據,而列b有3個,它將顯示兩個列的o/p爲3。可能是我做錯了。即時通訊新的以及,無論如何,謝謝 –

+1

編輯回答更好地滿足您的需求,但我看到使用api的答案已發佈。更好地使用它。 –

+0

好了一半的工作已經完成,我可以迭代並計算行數,但是,計算給定列的行數尚未完成。什麼acostache和病毒說是正確的,必須與矩陣工作得到解決方案 –

相關問題