【问题标题】:Finding the column number of the String that needs to be found in Java using Apache POI使用Apache POI查找需要在Java中找到的String的列号
【发布时间】:2015-08-06 11:38:51
【问题描述】:

假设我需要在 Excel 表中查找字符串“XXX”,我不知道如何获取包含该字符串的单元格的列号和行号。

Iterator<Row> it = XXXPresentSheet.iterator();          
while (it.hasNext()) {
    Row row = it.next();                
    Iterator<Cell> cellIter = row.cellIterator();

    while (cellIter.hasNext()) {
        String field1 = cellIter.next().getStringCellValue();               
        if (field1 == "XXX") {
            System.out.println(someMethodThatReturnsColumnNumber());
        }
    }
}

我可以使用单元格迭代器遍历行。但是当我遇到我想要的字符串时,我想得到那个列号。任何帮助都深表感谢。谢谢。

【问题讨论】:

  • 可能是重复的 [链接] (stackoverflow.com/questions/9049995/…)
  • 您可以使用一个简单的计数器,该计数器会在每次 it.next() while 循环迭代时增加。
  • field1 == "XXX" 不会像您期望的那样工作。使用equals 进行比较。
  • @f_puras 对于非字符串单元格(例如数字单元格),代码也会失败。 My answer 解决了这两个问题 :)
  • @Gagravarr 我明白了。奇怪的是,您对一个对我来说看起来合理的答案被否决了......

标签: java excel apache-poi


【解决方案1】:

如果你很好地询问一个单元格,它会tell you what Column Number it is in。它还会告诉你what Row Number it is in

所以,只需执行以下操作:

DataFormatter fmt = new DataFormatter();
for (Row r : sheet) {
   for (Cell c : r) {
       if ("ThingToLookFor".equals(fmt.formatCellValue(cell))) {
          // Found it!
          int columnIndex = c.getColumnIndex();
          int rowNumber = c.getRowNumber();
          // Get the Excel style reference, eg C12
          String ref = ((new CellReference(rowNumber,columnIndex)).formatAsString();
       }
   }
}

通过使用DataFormatter,您可以获得字符串值以比较任何单元格,而不仅仅是字符串。 CellReference 位是可选的,但如果您想查看匹配的单元格的 Excel 样式引用,它会有所帮助

【讨论】:

  • 非常感谢@Gagravarr。你的解决方案完美:)
【解决方案2】:

最简单的方法是实现您自己的变量,该变量会随着while(it.hasNext()) 循环的每次成功迭代而增加。

Iterator<Row> it = XXXPresentSheet.iterator();  
while(it.hasNext()) { 
    int column = 0;
    Row row = it.next();                
    Iterator<Cell> cellIter = row.cellIterator();
    while(cellIter.hasNext()) {
       column++;
       String field1 = cellIter.next().getStringCellValue();                
       if(field1 == "XXX") {
           System.out.println(column);
       }
    }
}

其中column = 1(起始列),如果您希望以值column = 0 开始,则可以在第一个循环之后增加列

延伸阅读can be found in this alternative StackOverflow question.

【讨论】:

  • 上述方法就像获取行号的魅力一样。虽然查找单元格的列号有一个小问题,因为 excelsheet 中有空列。有办法克服吗??
  • 糟糕。我不小心重复了错误的事情。迭代单元格而不是行!我的错!现在更新了。 :)
  • 我自己就意识到了这个问题。不管怎么说,还是要谢谢你。但现在的问题是 cellIter.next() 方法没有考虑到空单元格。所以空列不计其数。有什么解决方法吗?
  • 我真的不确定抱歉,这肯定不是一个理想的解决方案。
  • 只有当有问题的字符串在空白单元格之前的任何单元格中时,您的答案才有效,因此不是一般答案,因为在任何情况下它都会在所需单元格之前的空白单元格中失败,并且正如OP所指出的那样对他们不起作用。有一种简单的方法可以解决您的问题!您的代码也将无法匹配字符串(== 不会按照您对字符串的想法执行),并且对于非字符串单元格(例如数字单元格)也会失败。那是相当大的错误:(
猜你喜欢
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 2017-08-28
  • 1970-01-01
相关资源
最近更新 更多