web-dev-qa-db-de.com

So erhalten Sie einen Wert aus einer bestimmten Zelle einer xlsx-Datei mithilfe von Java Apache poi

ich schreibe ein Java-Programm, um eine Excel-Tabelle (xlsx) mit Apache poi zu lesen. Ich kann in der Lage sein, alle Zellen zu durchlaufen und alle Werte zu erhalten. Ich kann jedoch keinen bestimmten Zellenwert erhalten, sagen wir E10. Gibt es eine Möglichkeit, dies zu finden? 

Sehen Sie sich den Code an, den ich für das Durchlaufen aller Zellen verwendet habe.

package application;

import Java.io.FileInputStream;
import Java.io.FileOutputStream;
import Java.io.IOException;
import Java.io.InputStream;
import Java.util.Iterator;

import org.Apache.poi.hssf.usermodel.HSSFCell;
import org.Apache.poi.hssf.usermodel.HSSFRow;
import org.Apache.poi.hssf.usermodel.HSSFSheet;
import org.Apache.poi.hssf.usermodel.HSSFWorkbook;

import org.Apache.poi.xssf.usermodel.XSSFCell;
import org.Apache.poi.xssf.usermodel.XSSFRow;
import org.Apache.poi.xssf.usermodel.XSSFSheet;
import org.Apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadFromXLSX {
    public static void readXLSXFile() throws IOException
    {
        InputStream ExcelFileToRead = new FileInputStream("C:\\Test.xlsx");
        XSSFWorkbook  wb = new XSSFWorkbook(ExcelFileToRead);
        XSSFWorkbook test = new XSSFWorkbook(); 
        XSSFSheet sheet = wb.getSheetAt(0);
        XSSFRow row; 
        XSSFCell cell;
        Iterator rows = sheet.rowIterator();
        while (rows.hasNext())
        {
            row=(XSSFRow) rows.next();
            Iterator cells = row.cellIterator();
            while (cells.hasNext())
            {
                cell=(XSSFCell) cells.next();   
                if (cell.getCellType() == XSSFCell.CELL_TYPE_STRING)
                {
                    System.out.print(cell.getStringCellValue()+" ");
                }
                else if(cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC)
                {
                    System.out.print(cell.getNumericCellValue()+" ");
                }
                else
                {
                }
            }
            System.out.println();
        }
    }   
}
7

Um beispielsweise E10 des ersten Arbeitsblatts zu erhalten:

wb.getSheetAt(0).getRow(9).getCell(4); 

Hinweis: Ziehen Sie eins ab, da die Indizes nullbasiert sind.

Sie können diese bequeme Methode auch verwenden, um E auf 4 abzubilden.

wb.getSheetAt(0).getRow(9).getCell(CellReference.convertColStringToIndex("E"));
19
wvdz

Um einen Wert aus einer bestimmten Zelle in Excel zu erhalten, können Sie die folgende Codezeile verwenden.

wb.getSheetAt(0).getRow(1).getCell(1);
2

XSSFSheet hat die Methode getRow (int rownum) Es gibt die logische Zeile (0-basiert) zurück. Wenn Sie nach einer Zeile fragen, die nicht definiert ist, erhalten Sie eine Null. Dies bedeutet, dass Zeile 4 die fünfte Zeile auf einem Blatt darstellt.

Sobald Sie die Zeile abgerufen haben, können Sie die getCell-Methode (int cellnum) des XSSFRow-Objekts aufrufen. Sie gibt die Zelle am angegebenen (0-basierten) Index zurück.

2
public class XmlFileRead {

public static void main(String[] args) throws IOException {
    FileInputStream fi = new FileInputStream("abc.xls");
    ArrayList<EmployeeVo> al = new ArrayList<>();
    EmployeeVo evo = null;
    Scanner scanner = null;

    Workbook wb = new XSSFWorkbook(fi);
    Sheet sh = wb.getSheet("Sheet0");
    int starRow = sh.getFirstRowNum();
    int endRow = sh.getLastRowNum();

    for (int i = starRow + 1; i < endRow; i++) {
        scanner = new Scanner(System.in);
        evo = new EmployeeVo();
        Cell c = wb.getSheetAt(0).getRow(i).getCell(1);
        evo.setEmployeeId((int) c.getNumericCellValue());

        Cell c2 = wb.getSheetAt(0).getRow(i).getCell(2);
        evo.setEmployeeName(c2.toString());
        // add to collection
        al.add(evo);
    } // for

    al.forEach(i -> {
        System.out.println(i.getEmployeeId() + " " + i.getEmployeeName());
    });

}
}
1

Versionsversion der getCell-Methode

public XSSFCell getCell(string cellName){
    Pattern r = Pattern.compile("^([A-Z]+)([0-9]+)$");
    Matcher m = r.matcher(cellName);
    if(m.matches()) {
        columnName = m.group(1);
        rowNumber = Integer.parseInt(m.group(2));
        if(rowNumber > 0) {
            return wb.getSheetAt(0).getRow(rowNumber-1).getCell(CellReference.convertColStringToIndex(columnName))
        }
    }
    // throw an exception or return a null
}

Nun können Sie die Zelle einfach über diese Linie abrufen

getCell("E10")
0
midishero