2012-12-13 130 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和病毒说是正确的,必须与矩阵工作得到解决方案 –

相关问题