使用Apache POI时,我可以使用索引遍历excel文件吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Apache POI时,我可以使用索引遍历excel文件吗?相关的知识,希望对你有一定的参考价值。

如果我不清楚,请原谅。英语不是我的第一语言。

我正在尝试编写一个代码,我可以遍历excel文件的第一行,直到找到标记为“Comments”的列。我想对该列中的文本运行一些操作,然后将结果保存在文件末尾的新列中。我可以以类似于索引的方式遍历xlsx文件吗?如果是这样,我怎样才能使用该单元格的坐标直接跳到单元格?

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

    File myFile = new File("temp.xlsx");
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(myFile);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    @SuppressWarnings("resource")
    XSSFWorkbook myWorkBook = new XSSFWorkbook (fis);
    XSSFSheet mySheet = myWorkBook.getSheetAt(0);
    Iterator<Row> rowIterator = mySheet.iterator();


    Row row = rowIterator.next();
    Iterator<Cell> cellIterator = row.cellIterator();

    while (cellIterator.hasNext()) {

        Cell cell = cellIterator.next();

        String comment = cell.toString();

        if (comment.equals("Comments"))
        {
            System.out.println("Hello");
        }



    }


}

}

答案

对于“想要进入第二列第3行的问题,我可以使用像(3,2)这样的坐标?”:

是的,这可以使用CellUtilSheetRow方法的优点是CellUtil方法能够获得细胞(如果它已经存在)或创建细胞(如果它尚不存在)。因此,现有的单元格将被尊重而不是简单地创建它们,因此会覆盖它们。

例:

import java.io.FileOutputStream;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;

import org.apache.poi.ss.util.CellUtil;

import java.util.concurrent.ThreadLocalRandom;

public class CreateExcelCellsByIndex {

 public static void main(String[] args) throws Exception {

  Workbook workbook = new XSSFWorkbook();
  Sheet sheet = workbook.createSheet();

  //put content in R3C2:
  Cell cell = CellUtil.getCell(CellUtil.getRow(3-1, sheet), 2-1); //-1 because apache poi's row and cell indexes are 0 based
  cell.setCellValue("R3C2");

  //put content in 10 random cells:
  for (int i = 1; i < 11; i++) {

   int r = ThreadLocalRandom.current().nextInt(4, 11);
   int c = ThreadLocalRandom.current().nextInt(1, 6);
   cell = CellUtil.getCell(CellUtil.getRow(r-1, sheet), c-1);
   String cellcontent = "";
   if (cell.getCellTypeEnum() == CellType.STRING) {
    cellcontent = cell.getStringCellValue() + " ";
   }
   cell.setCellValue(cellcontent + i + ":R"+r+"C"+c);
  }

  workbook.write(new FileOutputStream("CreateExcelCellsByIndex.xlsx"));
  workbook.close();

 }

}
另一答案

我不确定你的2D索引是什么意思,但Cell知道它属于哪个列,所以这样的东西应该工作:

...
Cell cell = cellIterator.next();

String comment = cell.toString();

int sourceColumnIndex = -1;
if (comment.equals("Comments")) {
    System.out.println("Hello");
    sourceColumnIndex = cell.getColumnIndex();
}
....

类似地,定义类似int targetColumnIndex的东西来表示将处理来自sourceColumnIndex列的所有单元格的结果的列。

以上是关于使用Apache POI时,我可以使用索引遍历excel文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

Apache POI setCellData实际上没有设置单元格数据

无法获得Apache POI以便我的Excel阅读工作

使用Apache POI读取Excel .XLSX时出错

使用Apache POI - Java时,某些单元格不可见

Apache-POI:“无法解析符号”

传递字符串对象时使用 apache poi 格式化日期