2

我有一个 Excel 表,其中有近 150 列。我正在编写一个实用程序,其中将获取列名称为 X 的列。在另一个线程中,我看到了如何阅读 XL 工作簿和工作表.. 编写了以下代码..

        HSSFSheet sheet = workbook.getSheetAt(0);
        Iterator rows = sheet.rowIterator();


        while (rows.hasNext()) 
        {
            HSSFRow row = (HSSFRow) rows.next();
            Iterator cells = row.cellIterator();

            List data = new ArrayList();
            while (cells.hasNext()) 
            {
                HSSFCell cell = (HSSFCell) cells.next();
                data.add(cell);
            }

            sheetData.add(data);
        }
    } 

那么如何从给定列名的 XL 表中获取确切的列..?

4

4 回答 4

8

Apache POI API HSSFSheet 是基于行的,您需要通过迭代提取列数据,下面的链接可能会回答您的问题:

在 Apache POI API 中提取电子表格列中的数据

修改代码以在第一个工作表的第 1 行中搜索字符串

package projectTest.test;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

public class Poi {


    public static void main(String[] args) throws Exception {  
    //test file is located in your project path         
    FileInputStream fileIn = new FileInputStream("test.xls");
    //read file 
    POIFSFileSystem fs = new POIFSFileSystem(fileIn); 
    HSSFWorkbook filename = new HSSFWorkbook(fs);
    //open sheet 0 which is first sheet of your worksheet
    HSSFSheet sheet = filename.getSheetAt(0);

    //we will search for column index containing string "Your Column Name" in the row 0 (which is first row of a worksheet
    String columnWanted = "Your Column Name";
    Integer columnNo = null;
    //output all not null values to the list
    List<Cell> cells = new ArrayList<Cell>();

    Row firstRow = sheet.getRow(0);

    for(Cell cell:firstRow){
        if (cell.getStringCellValue().equals(columnWanted)){
            columnNo = cell.getColumnIndex();
        }
    }


    if (columnNo != null){
    for (Row row : sheet) {
       Cell c = row.getCell(columnNo);
       if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
          // Nothing in the cell in this row, skip it
       } else {
          cells.add(c);
       }
    }
    }else{
        System.out.println("could not find column " + columnWanted + " in first row of " + fileIn.toString());
    }

    }
}
于 2012-10-06T16:41:03.660 回答
0

你也可以这样尝试。您可以遍历标题行。

Row headerRow = sheet.get(0);

for (int cellIndex = 0; cellIndex < 150; cellIndex++) {
    Cell cell = row.getCell(cellIndex);
    if (columnName.equals(cell.getStringCellValue())) {
        // do your thing
    }
}

注意:如果您的单元格可以为空,请使用:

Cell cell = row.getCell(cellIndex);

if (cell!=null) {
    if (columnName.equals(cell.getStringCellValue())) {
        // do your thing
    }
}

我希望这有帮助!

于 2020-06-21T17:17:10.600 回答
0

阅读特定列

   File myFile = new File(path);
    FileInputStream fis = new FileInputStream(myFile);

    // Finds the workbook instance for XLSX file
    XSSFWorkbook myWorkBook = new XSSFWorkbook (fis);

    //XSSFWorkbook workBook = new XSSFWorkbook();
    //Reading sheet at number 0 in spreadsheet(image attached for reference
    Sheet sheet = myWorkBook.getSheetAt(0);

    //creating a Sheet object to retrieve object  
    Iterator<Row> itr = sheet.iterator();//iterating over excel file  

    while (itr.hasNext())                 
    {  
        Row row = itr.next();
        Iterator<Cell> cellIterator = row.cellIterator();//iterating over each column
        //Reading cell in my case column name is ppm
        Cell ppmEx= row.getCell(0);

        //Cell cell = cellIterator.next();
        while (cellIterator.hasNext())
        {  
            Cell cell = cellIterator.next();
            //Check the cell type and format accordingly
            switch (cell.getCellType()) 
            {
                case Cell.CELL_TYPE_NUMERIC:
                    //System.out.println(cell.getNumericCellValue() + "    ");
                    al.add(cell.getNumericCellValue());
                    break;
                case Cell.CELL_TYPE_STRING:
                    //System.out.println(cell.getStringCellValue()+" ");
                    al.add(cell.getStringCellValue());
                    break;
                case Cell.CELL_TYPE_BOOLEAN:
                    //System.out.println(cell.getBooleanCellValue()+" ");
                    al.add(cell.getBooleanCellValue());
                case Cell.CELL_TYPE_BLANK:
                    //System.out.println("blank");
                    al.add("blank");

            }  
        }  
        System.out.println("-");
    }
于 2020-02-13T03:22:40.707 回答
0

这是非常简单有效的代码,并且按预期工作

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class TestExcelFile {

    public static void main(String[] args) {
        String envFilePath = System.getenv("AZURE_FILE_PATH");

        // upload list of files/directory to blob storage
        File folder = new File(envFilePath);
        File[] listOfFiles = folder.listFiles();

        for (int i = 0; i < listOfFiles.length; i++) {
            if (listOfFiles[i].isFile()) {
                System.out.println("File " + listOfFiles[i].getName());

                Workbook workbook;
                //int masterSheetColumnIndex = 0;
                try {
                        workbook = WorkbookFactory.create(new FileInputStream(envFilePath + "\\"+ listOfFiles[i].getName()));
                        // Get the first sheet.
                        Sheet sheet = workbook.getSheetAt(0);
                        // Get the first cell.
                        Row row = sheet.getRow(0);
                        //Cell cell = row.getCell(0);
                        for (Cell cell1 : row) {
                            // Show what is being read.
                            System.out.println(cell1.toString());   
                            //masterSheetColumnIndex++;
                        }
                        //we will search for column index containing string "Your Column Name" in the row 0 (which is first row of a worksheet
                        String columnWanted = "Modality Name";
                        Integer columnNo = null;
                        //output all not null values to the list
                        List<Cell> cells = new ArrayList<Cell>();

                        Row firstRow = sheet.getRow(0);

                        for(Cell cell1:firstRow){
                            if (cell1.getStringCellValue().equals(columnWanted)){
                                columnNo = cell1.getColumnIndex();
                            }
                        }

                        if (columnNo != null){
                            for (Row row1 : sheet) {
                               Cell c = row1.getCell(columnNo);
                               if (c == null || c.getCellType() == Cell.CELL_TYPE_BLANK) {
                                  // Nothing in the cell in this row, skip it
                               } else {
                                  cells.add(c);
                               }
                            }
                            System.out.println("");
                        }else{
                            System.out.println("could not find column " + columnWanted + " in first row of " + listOfFiles[i].getName());
                        }

                } catch (InvalidFormatException | IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
于 2017-03-21T11:31:47.003 回答