Java 如何使用ApachePOI读取.xlsx文件?

Java 如何使用ApachePOI读取.xlsx文件?,java,excel,apache-poi,Java,Excel,Apache Poi,如下图所示,我正在尝试编写一个程序,该程序可以扫描给定的行,不受从哪个单元格到哪个单元格的限制,然后找到所有相同的字符串。有可能吗?多谢各位 举一个例子,这样就不会让人很困惑,例如:在H行,您看到有客户的名字,有Coresystem、华为、维梧等。。。现在的问题是,如果名称没有组合在一起,它们都是分开的,比如,在H5上,它将是华为,在H9上,它将是维梧,等等,就像,与下面提供的图片不同,在H行,所有的名称都是分开的,我希望apache POI找到所有具有相同名称的客户,例如:如果用户进入coRe

如下图所示,我正在尝试编写一个程序,该程序可以扫描给定的行,不受从哪个单元格到哪个单元格的限制,然后找到所有相同的字符串。有可能吗?多谢各位

举一个例子,这样就不会让人很困惑,例如:在H行,您看到有客户的名字,有Coresystem、华为、维梧等。。。现在的问题是,如果名称没有组合在一起,它们都是分开的,比如,在H5上,它将是华为,在H9上,它将是维梧,等等,就像,与下面提供的图片不同,在H行,所有的名称都是分开的,我希望apache POI找到所有具有相同名称的客户,例如:如果用户进入coReSysteM,它应该能够在H行上找到所有Coresystem的所有.equalsIgnoreCase。顺便说一句,用户应该能够输入他们想要输入的客户名称和他们想要搜索的行,并显示A5、B5、C5、D5、E5、F5、G5、H5到A14、B14、C14、D14、E14、F14、G14、H5,这可能吗? 我正在考虑设置一个公式来查找所有客户,例如:=CountIf

以下是我目前正在尝试执行的代码,但随后我被困在其中:

package excel_reader;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ExcelReader2d {
    ExcelReader link = new ExcelReader();
    Scanner scan = new Scanner(System.in);

    // instance data
    private static int numberGrid[][] = null;
    private static String stringGrid[][] = null;

    // constructor
    public ExcelReader2d(String desLink) {

    }

    // methods
    public void ExeScan() throws FileNotFoundException, IOException {
        Scanner scan = new Scanner(System.in);
        XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream("C:\\Users\\Sonic\\Desktop\\20191223 IMPORTS.xlsx"));

        XSSFSheet sheet = workbook.getSheetAt(0);
        final int rowStart = Math.min(15, sheet.getFirstRowNum()), rowEnd = Math.max(1400, sheet.getLastRowNum());

        System.out.print("Enter the rows that you want to search for: (for ex. the rows that stores customer's name) ");
        int searchRows = scan.nextInt();
        System.out.print("Enter the customer's name that you are looking for: ");
        String name = scan.nextLine();
        //int rowNum;

        // Search given row
        XSSFRow row = sheet.getRow(searchRows);
        try {
            for (int j = 4; j < rowEnd; j++) {
                Row r = sheet.getRow(j);
                if (name.equalsIgnoreCase(name)) {
                    row.getCell(j).getStringCellValue();
                }

                // skip to next iterate if that specific cell is empty
                if (r == null)
                    continue;

            }
        } catch (Exception e){
            System.out.println("Something went wrong.");
        }



    }

}

另外,我知道这将是非常令人困惑的,但请随时问任何类型的问题,以帮助您摆脱困惑,并帮助我,因为这一直是我的问题。非常感谢你,我将非常感谢你的帮助。目前正在使用ApachePOI、vscode、java。

我将迭代工作表中的行,并从每行获取单元格7h的字符串内容。如果该字符串满足equalsIgnoreCase搜索值的要求,则该行是结果行之一,否则不是

可以在列表中收集结果行。然后此列表包含之后的结果行

例如:

ExcelWorkbook.xlsx:

代码:

结果:


我将迭代工作表中的行,并从每一行获取单元格7h的字符串内容。如果该字符串满足equalsIgnoreCase搜索值的要求,则该行是结果行之一,否则不是

可以在列表中收集结果行。然后此列表包含之后的结果行

例如:

ExcelWorkbook.xlsx:

代码:

结果:


首先想想:什么是争吵?你试过什么?我将迭代工作表中的行,并从每一行获取单元格7h的字符串内容。如果该字符串满足要求,则该行是所需行之一,否则不是。可以在列表中收集所需的行。顺便说一句:H不是一行,而是一列。@rioV8行就像每一行一样,就像在excel中一样,a行将是第一行的整行。@FlashSonic526:a或H不是行在我阅读了您现在提供的代码之后,您应该首先尝试理解excel工作表中的行是什么。行是水平的。所以4,5,…,41是行。柱是垂直的。所以A,B,…,H是列。H列包含每行的第八个单元格行。getCell7。如何迭代我已经链接过的行。首先想想:什么是行?你尝试过什么?我将迭代工作表中的行,并从每一行获取单元格7h的字符串内容。如果该字符串满足要求,则该行是所需行之一,否则不是。可以在列表中收集所需的行。顺便说一句:H不是一行,而是一列。@rioV8行就像每一行一样,就像在excel中一样,a行将是第一行的整行。@FlashSonic526:a或H不是行在我阅读了您现在提供的代码之后,您应该首先尝试理解excel工作表中的行是什么。行是水平的。所以4,5,…,41是行。柱是垂直的。所以A,B,…,H是列。H列包含每行的第八个单元格行。getCell7。如何在我已经链接的行上进行迭代。它很有效!这有助于我的项目取得很大进展,谢谢。但是我可以问一下,在第39行,您使用了for-each循环,条件语句是Row-Row:sheet,我可以问一下第二个小写字母行是什么意思吗?我猜它是一个数组列表的名称,但是没有一个数组列表名为row。我真的不知道这是什么意思,请帮助我,谢谢。我还想知道为什么在第30行的ArrayList之后使用?谢谢。@FlashSonic526:。所以对于Row-Row:sheet意味着每个org.apache.poi.ss.usermodel.Row在sheet中命名为Row。和列表结果=新的ArrayList;意味着结果将是一个jave.util.ArrayList,其中列出org.apache.poi.ss.usermodel.Rows。非常感谢!我用谷歌搜索过,这让我有些困惑,谢谢你的帮助:由于我对ApachePOI还很陌生,所以仍在努力理解代码,非常感谢:它很管用!这有助于我的项目取得很大进展,谢谢。但是我可以在第39行问一下,您使用了for-each循环,条件语句是Row-Row:sheet,我可以问第二个sm是什么吗
全字母行是什么意思?我猜它是一个数组列表的名称,但是没有一个数组列表名为row。我真的不知道这是什么意思,请帮助我,谢谢。我还想知道为什么在第30行的ArrayList之后使用?谢谢。@FlashSonic526:。所以对于Row-Row:sheet意味着每个org.apache.poi.ss.usermodel.Row在sheet中命名为Row。和列表结果=新的ArrayList;意味着结果将是一个jave.util.ArrayList,其中列出org.apache.poi.ss.usermodel.Rows。非常感谢!我用谷歌搜索过,这让我有些困惑,谢谢你的帮助:由于我对ApachePOI非常陌生,所以仍在努力理解代码,非常感谢:
import org.apache.poi.ss.usermodel.*;

import java.util.List; 
import java.util.ArrayList; 

import java.io.FileInputStream;

public class ExcelReadRowsByColumnValue {

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

  String filePath = "./ExcelWorkbook.xlsx";

  String toSearch = "coresystem";
  int searchColumn = 7; // column H
  List<Row> results = new ArrayList<Row>();

  DataFormatter dataFormatter = new DataFormatter();
  Workbook workbook = WorkbookFactory.create(new FileInputStream(filePath));
  FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator(); 
  Sheet sheet = workbook.getSheetAt(0);

  for (Row row : sheet) { // iterate over all rows in the sheet
   Cell cellInSearchColumn = row.getCell(searchColumn); // get the cell in seach column (H)
   if (cellInSearchColumn != null) { // if that cell is present
    String cellValue = dataFormatter.formatCellValue(cellInSearchColumn, formulaEvaluator); // get string cell value
    if (toSearch.equalsIgnoreCase(cellValue)) { // if cell value equals the searched value
     results.add(row); // add that row to the results
    }
   }
  }

  // print the results
  System.out.println("Found results:");
  for (Row row : results) {
   int rowNumber = row.getRowNum()+1;
   System.out.print("Row " + rowNumber + ":\t");
   for (Cell cell : row) {
    String cellValue = dataFormatter.formatCellValue(cell, formulaEvaluator);
    System.out.print(cellValue + "\t");
   }
   System.out.println();
  }

  workbook.close();
 }
}