【问题标题】:How to read .xlsx file with apache poi?如何使用 apache poi 读取 .xlsx 文件?
【发布时间】:2020-03-16 13:46:57
【问题描述】:

见下图,我正在尝试编写一个程序,它可以“扫描”给定行,不受从哪个单元格到哪个单元格的限制,然后找到所有相同的“字符串”。有可能这样做吗?谢谢。

举个例子,这样就不会很混乱,例如:在H行,你看到有客户的名字,有“Coresystem”,“Huawei”,“VIVO”等......现在问题是,如果名字没有组合在一起,它们都被拆分了,比如,在H5上是“华为”,在H9上是“VIVO”等等,就像提供的图片不同下面,在 H 行,所有名称都被拆分,我希望 apache POI 找到所有具有相同名称的客户,例如:如果用户输入“coReSysteM”,它应该能够找到所有.equalsIgnoreCase H行所有Coresystem(顺便说一句,用户应该能够输入他们想要输入的客户姓名和他们想要搜索的行),并从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.");
        }



    }

}

ps。我知道这会很令人困惑,但请随时提出任何问题,以帮助您摆脱困惑并帮助我,因为这对我来说一直是个问题。非常感谢您,我将非常感谢您的帮助。目前使用apache poi、vscode、java。

【问题讨论】:

  • 首先想到:什么是
  • 你试过什么?我将遍历工作表中的行并从每一行获取单元格 7 (H) 的字符串内容。如果该字符串满足要求,则该行是所需行之一,否则不是。可以在List&lt;Row&gt; 中收集所需的行。顺便说一句:H 不是一行而是一列。
  • @rioV8 行就像每一行,就像在 excel 上一样,A 行将是第一行的整行。
  • @FlashSonic526 : A 或 H 不是一行
  • 阅读您现在提供的代码后,您首先应该尝试了解Excel 表中的行是什么。行是水平的。所以45、...、41 是行。列是垂直的。所以AB、...、H 是列。列H 包含每行的第八个单元格row.getCell(7)。如何遍历我已经链接的行。

标签: java excel apache-poi


【解决方案1】:

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

可以在List&lt;Row&gt; 中收集结果行。然后这个List 包含之后的结果行。

例子:

ExcelWorkbook.xlsx:

代码:

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();
 }
}

结果:

【讨论】:

  • 有效!它帮助我的项目取得了很大的进展,谢谢。但是请问第39行,你用了for each循环,条件语句是Row row : sheet,请问第二个小写字母row是什么意思?我猜它是一个数组列表的名称,但没有名为row 的数组列表。我真的不知道这是什么意思,请帮帮我,谢谢。我还想知道为什么在第 30 行的 ArrayList 之后使用&lt;Row&gt;?谢谢。
  • @FlashSonic526:How does the Java 'for each' loop work?。所以for (Row row : sheet) 表示sheet 中每个名为roworg.apache.poi.ss.usermodel.Row。而List&lt;Row&gt; results = new ArrayList&lt;Row&gt;(); 表示results 应为jave.util.ArrayList,其中列出了org.apache.poi.ss.usermodel.Rows。
  • 非常感谢!我做了谷歌,这让我有些困惑,谢谢你的帮助:) 仍然试图理解代码,因为我对 apache poi 真的很陌生,非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多