当前位置: 首页 > 知识库问答 >
问题:

在java中通过poi迭代一行的列

赵锐
2023-03-14

我在C:drive(本地计算机)中有一个名为abc.xls的excel文件,现在在第一张表本身的excel文件中有一个如下所示的表,这个下面的表可以位于表中的任何范围内,所以我开发了下面的java程序,它将首先按行扫描整个表,然后按列扫描,并将找到TradeRef所在的单元格

 TradeRef   TMS  Deal     Date        
    12      45   DRT    23/97/2014      
    23      36   QWE    21/07/2015  

下面的程序中的问题是,它捕获TradeRef所在的单元格,然后迭代列,然后以类似的方式捕获下一行并迭代列

但我要应用的逻辑是,当它捕获TradeRef单元格并对列进行迭代,并到达表的最后一列(在上表中为Date),那么它应该进一步扫描同一行中的下20列,如果在下20列中没有任何值的单元格,那么它应该移动到下一行,如果在20列中任何单元格都可以有值,那么在这种情况下,它应该读取该单元格的值

所以就像

 TradeRef   TMS  Deal     Date          <----- scan next 20 columns is there is no value in next 20 cells then move to next row else include that cell value also------->
    12      45   DRT    23/97/2014        
    23      36   QWE    21/07/2015  

因此,请建议如何实现上面的逻辑扫描下一行中的下20列,这是我以前的实现,即

public class AAA {
    public static void main(String[] args) throws IOException {


        FileInputStream file = null ;
         try {

                 file = new FileInputStream(new File("C:\\abc.xls"));
                HSSFWorkbook workbook = new HSSFWorkbook(file);
                HSSFSheet firstSheet = workbook.getSheetAt(0);
                Iterator<Row> iterator = firstSheet.iterator();

                Cell c = findFirstRow(firstSheet);
             }




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

    }

    public static Cell findFirstRow(HSSFSheet firstSheet) {
          for (Row row : firstSheet) {
            for (Cell cell : row) {
                  cell.setCellType(cell.CELL_TYPE_STRING);
              if ("TradeRef".equals(cell.getStringCellValue())) {
                int row1 = cell.getRowIndex() + 1;
                int col = cell.getColumnIndex();
                if (firstSheet.getRow(row1) == null)
                  throw new RuntimeException("Row " + row1 + 1 + " is empty!");
                Cell startOfFirstDataRow = firstSheet.getRow(row1).getCell(col);
                if (startOfFirstDataRow == null) {
                  CellReference ref = new CellReference(row1, col);
                  throw new RuntimeException("Data not found at " + ref.formatAsString());
                }
                return startOfFirstDataRow;
              }
            }
          }
          throw new RuntimeException("TradingRef header cell not found!");
        }


}

所以请告诉我如何实现上面的逻辑扫描接下来的20列

共有1个答案

邵劲
2023-03-14

首先,您可能应该使用org.apache.poi.ss.usermodelAPI,它可以处理所有Excel文件,而hssf*类只处理.xls文件。

org.apache.poi.ss.usermodel.sheet类有一个getFirstRow()方法,您可以使用它开始搜索。接下来,您需要找到包含给定字符串的单元格序列,如:

// This is an array containing the headers
final String[] headers = { "TradeRef", "TMS", "Deal", "Date" };

// now we take row from above to be the Row object where we seek our headers
int last = row.getLastCellNum();
for (int c = row.getFirstCellNum(); c < last; c++) {
    int h = 0;
    // check if the cell at (c + h) has the required value
    for (; h < headers.length && c + h < last; h++) {
        if (!headers[h].equals(row.getCell(c + h).getStringCellValue())) {
            break; // if the cell value differs from our header
        }
    }
    if (h == headers.length) // this means the break was never invoked 
        return c; // found it
}
return -1; // not found
 类似资料:
  • 我试图遍历一个JList,其中每个项目都包含:JGroup-JLabel 目前我拥有的是: 我得到的结果是: Item=javax。摆动JPanel[,0,0,0x0,无效,layout=java.awt.FlowLayout,alignmentX=0.0,alignmentY=0.0,border=,flags=9,maximumSize=,minimumSize=,preferredSize=

  • 问题内容: 我有一个这样的对象: 我需要在HTML表中获取ID和名称,但是似乎很难遍历此对象。TIA。我知道我需要先到达“值数组”,然后再到达“组”对象,但是我要遍历对象和数组之间的过渡以及foreach与基于索引的迭代。 例如,我尝试了这个: 它遍历对象,但也给我没用 问题答案:

  • 问题内容: 有没有办法遍历Java SparseArray(适用于Android)?我曾经很容易通过索引来获取值。我找不到一个。 问题答案: 似乎我找到了解决方案。我没有正确注意到该功能。 因此,我将使用以下内容:

  • 我想在HashMap中搜索重复项。目前这是我的HashMap:

  • 问题内容: 好的,所以我试图查询数据库并选择所有具有特定值的行。之后,我使用mysql_fetch_array()将查询转换为数组,然后尝试使用for每个循环逐行遍历读取的数组。 尽管当我对pointsAvailable列之外的任何列执行此操作时,说一列名为“ name”的文本类型的列,它只会返回一个字母。 如何逐行遍历返回的查询,并允许从当前行获取特定列的数据? 问题答案: 或使用MYSQL_A

  • 问题内容: 有没有一种优雅的方法可以跳过Java5 foreach循环中的第一次迭代? 伪代码示例: 问题答案: 我不会称其为优雅,但可能比使用“第一个”布尔值更好: 除此之外,可能没有优雅的方法。