当前位置: 首页 > 知识库问答 >
问题:

使用POI Apache从Excel读取数据时向ArrayList添加数据

宫俊远
2023-03-14

我正在尝试使用POI Apache从Excel表中读取数据。我遇到的问题是,我想同时读取一行中所有单元格的数据,并将其存储在类类型的ArrayList中,但输出只是一个单元格接一个单元格。

下面是打开excel表并逐单元读取数据的类。

package testing;

import javax.swing.JFileChooser;
import java.io.File;
import java.io.FileInputStream;

import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
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.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadExcelDemo 
{
    ArrayList<Data> list = new ArrayList<>();
    String path;

   public ReadExcelDemo(String path)
   {
       this.path = path;

        try
        {
            FileInputStream file = new FileInputStream(new File(path));

            //Create Workbook instance holding reference to .xlsx file
            XSSFWorkbook workbook = new XSSFWorkbook(file);

            //Get first/desired sheet from the workbook
            XSSFSheet sheet = workbook.getSheetAt(0);

             System.out.println("");

            //Iterate through each rows one by one
            Iterator<Row> rowIterator = sheet.iterator();
            while (rowIterator.hasNext()) 
            {
                Row row = rowIterator.next();
                //For each row, iterate through all the columns
                Iterator<Cell> cellIterator = row.cellIterator();

                while (cellIterator.hasNext()) 
                {
                    Cell cell = cellIterator.next();
                    //Check the cell type and format accordingly
                    switch (cell.getCellType()) 
                    {
                        case Cell.CELL_TYPE_NUMERIC:
                            System.out.print(cell.getNumericCellValue() + "\t");

                            break;
                        case Cell.CELL_TYPE_STRING:
                            System.out.print(cell.getStringCellValue() + "\t");
                            break;
                    }
                }


                System.out.println("");
            }
            file.close();
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }
    }
}

数据类

package testing;


public class Data {


    int ID;
    String F_Name,L_Name;




    public Data(int ID, String F_Name, String L_Name) {
        this.ID = ID;
        this.F_Name = F_Name;
        this.L_Name = L_Name;
    }


    public int getID() {
        return ID;
    }

    public String getF_Name() {
        return F_Name;
    }

    public String getL_Name() {
        return L_Name;
    }

List.add(new Data(1,"Amit","shukla"));

共有1个答案

濮阳翔
2023-03-14

this.path=路径;

    try
    {
        FileInputStream file = new FileInputStreaHashMap<K, V>ile(path));
        HashMap<Integer, Data> mp= new HashMap<Integer, Data>();
        //Create Workbook instance holding reference to .xlsx file
        XSSFWorkbook workbook = new XSSFWorkbook(file);

        //Get first/desired sheet from the workbook
        XSSFSheet sheet = workbook.getSheetAt(0);

         System.out.println("");

        //Iterate through each rows one by one
        Iterator<Row> rowIterator = sheet.iterator();
        while (rowIterator.hasNext()) 
        {
            Row row = rowIterator.next();
            //For each row, iterate through all the columns
            Iterator<Cell> cellIterator = row.cellIterator();

            while (cellIterator.hasNext()) 
            {
                Cell cell = cellIterator.next();
                //Check the cell type and format accordingly
                int i=0;
                int j=0;
                switch (cell.getCellType()) 
                {
                    case Cell.CELL_TYPE_NUMERIC:
                        System.out.print(cell.getNumericCellValue() + "\t");
                            i=Integer.parseInt(cell.getNumericCellValue());
                            Data d= new Data();
                            d.setId(cell.getNumericCellvalue());


                        break;
                    case Cell.CELL_TYPE_STRING:
                        System.out.print(cell.getStringCellValue() + "\t");
                        if( j==0){
                        Data data= mp.get(i);
                        data.setName(cell.getStringCellValue());
                        mp.put(i, data);
                        j=j+1;
                        }
                        else
                        {
                            Data data= mp.get(i);
                            data.setLastName(cell.getStringCellValue());
                            mp.put(i, data);
                            j=0;
                        }
                        break;
                }
            }


            System.out.println("");
        }
        List<Data> dataList=  new ArrayList<Data>();
        for (Data d : mp.values()) {
           dataList.add(d);

        }
        file.close();
    } 
    catch (Exception e) 
    {
        e.printStackTrace();
    }
 类似资料:
  • 问题内容: 我正在使用POI HSSF读取excel数据,并且正在使用JUnit根据数据库proc RefCursor检查数据。 将来自Refcursor的数字数据(例如100)与excel工作表100中的数据进行比较时,Junit测试失败,但由于POI将其读取为100.0,因此Junit测试失败。 这是我正在构建的通用框架程序,因此该框架应该足够智能以忽略“ .0”。关于如何解决这个问题的任何投

  • 本文向大家介绍Python pandas如何向excel添加数据,包括了Python pandas如何向excel添加数据的使用技巧和注意事项,需要的朋友参考一下 pandas读取、写入csv数据非常方便,但是有时希望通过excel画个简单的图表看一下数据质量、变化趋势并保存,这时候csv格式的数据就略显不便,因此尝试直接将数据写入excel文件。 pandas可以写入一个或者工作簿,两种方法介绍

  • 我有Excel表格,在不同的单元格中有用户名、电子邮件ID、电话和位置。我已将所有单元格值添加到Arraylist中。然而,现在我需要遍历索引,每次读取用户名并将其传递给其他应用程序中的文本框。 我写了代码,直到添加到ArrayList,但不确定如何每次都从列表中读取每个值,并停留在这里。 意味着,第一次我应该读取用户名为“A”,电子邮件ID为“a.b@c.com”,电话号码为“12333”,位置

  • 我正在使用Maven创建一个Selenium项目,其中我试图从Excel文件(xlsx)中读取“username”和“password”。 这是密码- 我得到的错误在这一行: Driver.FindElement(By.XPath(“//input[@type='text']”)).SendKeys(Sheet.GetRow(i).GetCell(j).GetStringCellValue());

  • 客观的 阅读通过Avassetrader从iTunes商店购买的文件。通过传输,并被使用。 我所尝试的 据我所知,只生成音频原始数据,所以我想我应该在每个样本前面添加ADTS标头。 所以,我的问题是,如何循环每个样本并添加ADTS头?

  • 嗨, 我正在尝试使用excel中的列标题读取列值(使用java)。如图中所示,假设我想读取标题“城市”、列下的所有后续单元格并显示它们。我该怎么做? 通过查看internet上的示例,我发现大多数示例都使用迭代器在行上迭代。 请不要将此标记为重复,我已经尝试在stackoverflow和internet上搜索,但大多数都使用行迭代。