如何使用Java计算Excel文档列中的行数

如何使用Java计算Excel文档列中的行数,java,apache-poi,Java,Apache Poi,我有一个从excel文档中获取数据的java代码我想计算列数和总行数(在特定列中)。我怎样才能做到这一点?下面提供了Java代码和所需的o/p (编辑):我应该做什么修改来获得所需的o/p,例如,我应该写一个循环来获得列和行的计数,或者有一个方法来做同样的事情 所需O/p ColumnA ColumnB ColumnC Vinayak James Dan India US Denmark Total number of Columns: 3 number of data i

我有一个从excel文档中获取数据的java代码我想计算列数和总行数(在特定列中)。我怎样才能做到这一点?下面提供了Java代码和所需的o/p

(编辑):我应该做什么修改来获得所需的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  
(编辑):-这里回答--

我的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();
    }
}
}

我需要获得如上所示的所需o/p代码运行良好但是我需要获取列和行的计数值。请为我提供同样的解决方案。我在前面的代码中遇到了问题,在这个问题中得到了解决:

我认为您可以使用建议的代码来获取列,然后针对列中的每一行(尽管这更多是针对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()
        }
     }
   }
}
for(行:页){
short minColIx=row.getFirstCellNum();
short maxColIx=row.getLastCellNum();

对于(short colIx=minColIx;colIx,我认为您可以使用建议的代码来获取列,然后针对列中的每一行(尽管对于涉及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()
        }
     }
   }
}
for(行:页){
short minColIx=row.getFirstCellNum();
short maxColIx=row.getLastCellNum();

对于(short colIx=minColIx;colIx,代码使用迭代器来解析每一行和每一列的值。它不知道还有多少项需要迭代,因此无法查询该结果

但是,您可以使用API
getLastRowNum
()获取最后一行索引

获取工作表上最后一行的编号。由于 excel文件格式,如果调用此方法的结果为零,则 不知道这是否意味着工作表上有零行,或者一行一行 位置为零。如果是这种情况,请另外呼叫 getPhysicalNumberOfRows()以告知位置零处是否有行 或者不是

同样,对于HSSFRow类()中的每个单元格,都有API
getLastCellNum

您需要修改代码以利用这些API


教程:

代码使用迭代器分析每一行和每一列的值。它不知道还有多少项需要迭代,因此您无法查询该结果

但是,您可以使用API
getLastRowNum
()获取最后一行索引

获取工作表上最后一行的编号。由于 excel文件格式,如果调用此方法的结果为零,则 不知道这是否意味着工作表上有零行,或者一行一行 位置为零。如果是这种情况,请另外呼叫 getPhysicalNumberOfRows()以告知位置零处是否有行 或者不是

同样,对于HSSFRow类()中的每个单元格,都有API
getLastCellNum

您需要修改代码以利用这些API


教程:

我不熟悉java代码中的Excel工作簿,但您有一个迭代器。您不能简单地向它添加一个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。希望这对您有所帮助!

我不熟悉java代码中的Excel工作簿,但您有一个迭代器。您不能简单地在其中添加一个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。希望这对您有所帮助!

我这样做了,结果是打印了工作表中的总行数。例如,如果a列中有2个数据,b列中有3个数据,则两列的o/p都将显示为3。可能是我正在打印w列rong.我对这一点也不熟悉,无论如何,我感谢您提供了更好地满足您需求的书面答案,但我看到了一个使用api的答案。更好地使用它。好了,一半的工作已经完成,我能够迭代并计算行数,但是,计算给定列的行数还没有完成。acostache和viral说的是对的,必须使用矩阵获得解决方案您可以使用我的答案计算每列的行数,
计数器[1]
是colA中的行数,
计数器[2]
是colB中的行数,
计数器[3]
是colC中的行数