从单元格值获取单元格索引,Apache POI

9
Environment    Status    Version    PatchNumber
Windows        Live      1.0        2
Unix           Live      2.0        4
Mac            Live      1.3        8

如果我在Excel中有上面展示的数据,如何使用文本来访问PatchNumber的cellNumber?
XSSFRow row = (XSSFRow) rows.next(); 我想要访问row.getCellNumber("PatchNumber"); //请注意,Apache POI中不存在此方法。
3个回答

11

我想我明白你的意思 - 你想知道哪一列包含了单词“Patch”在它的第一行中?如果是这样,你只需要像这样做:

Sheet s = wb.getSheetAt(0);
Row r = s.getRow(0);

int patchColumn = -1;
for (int cn=0; cn<r.getLastCellNum(); cn++) {
   Cell c = r.getCell(cn);
   if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
       // Can't be this cell - it's empty
       continue;
   }
   if (c.getCellType() == Cell.CELL_TYPE_STRING) {
      String text = c.getStringCellValue();
      if ("Patch".equals(text)) {
         patchColumn = cn;
         break;
      }
   }
}
if (patchColumn == -1) {
   throw new Exception("None of the cells in the first row were Patch");
}

只需循环遍历第一行(标题行)中的单元格,检查它们的值,并在找到匹配文本时记录所在的列即可!


我在我的代码中也使用了相同的技术,只是想知道Apache POI是否提供了相应的API。感谢您的建议。 - SDS
不行。每个人在工作表中查找内容的要求都不同,而第一行也没有什么特别之处,因此没有通用的方法适用于所有人。最好的办法是自己编写几行代码,以满足您的具体要求! - Gagravarr

3

这不就是你想要的吗?

row.getCell(3) 

public XSSFCell getCell(int cellnum) 获取给定(基于0)索引处的单元格,并从父工作簿中获取Row.MissingCellPolicy。

如果您想通过名称精确访问 - “PatchNumber”,则可以读取标题行并保存PatchNumber的索引。我认为表模型仅定义对单元格的访问,但不提供按列名进行关联访问。我认为所有行在模型中都是相等的

要获取列索引。 我会遍历标题行并构建列名称列表columns,然后您可以使用columns.indexOf("PatchNumber")

http://poi.apache.org/apidocs/org/apache/poi/xssf/usermodel/XSSFRow.html#getCell(int)


getcell(int x) 是用来返回单元格的。在我的情况下,我想要的单元格编号 patchNumber 今天位于第4列,明天可能会移动到第5列或第3列,所以我想知道是否可以通过列文本获取列的索引。 - SDS
这显然是不可能的。行不知道标题行。你试过读取标题行了吗? - Vladimir
我找不到任何API,现在既然@Vladimir说这是不可能的,我就假设在Apache POI中不存在这样的API。 - SDS
@SDS,正确。Apache POI仅提供API以迭代行和单元格。但是获取列索引是一种逻辑,它取决于您的文档。因此,您将不得不迭代标题行以获得所需的结果。现在这个回答解决了你的问题吗? - Vladimir
是的,最后我写了代码来实现相同的功能。感谢你的建议。 - SDS

0
public CellAddress searchStringInXslx(String string) throws IOException{
            FileInputStream inputStream = new FileInputStream("Books.xlsx");
            Workbook workbook = new XSSFWorkbook(inputStream);
            Sheet firstSheet = workbook.getSheetAt(0);
            Iterator<Row> iterator = firstSheet.iterator();
            CellAddress columnNumber=null;

            while(iterator.hasNext()){
                 Row nextRow = iterator.next();
                 Iterator<Cell> cellIterator = nextRow.cellIterator();
                 while (cellIterator.hasNext()) {
                     Cell cell = cellIterator.next();
                     if(cell.getCellType()==Cell.CELL_TYPE_STRING){ 
                         String text = cell.getStringCellValue();
                          if (string.equals(text)) {
                             columnNumber=cell.getAddress();
                             break;
                          }
                        }
                     }
            }
            workbook.close();
            return columnNumber;
     }

2
该方法将返回所搜索字符串的单元格地址。 - Karthik P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接