【问题标题】:Read excel using apache poi - Hashmap,ArrayList使用 apache poi 读取 excel - Hashmap,ArrayList
【发布时间】:2016-09-30 15:02:51
【问题描述】:

嗨,

我正在尝试使用 excel 中的列标题读取列值(使用 java)。如图所示,假设我想读取标题“城市”,列下的所有后续单元格并显示它们。我该怎么做?

查看互联网上的示例,我发现大多数示例使用迭代器在行上进行迭代。

假设我有一个键的哈希图作为 excel 的标题和存储在 ArrayList 中的后续值。像

HashMap<String, ArrayList<String>> hashmap = 
                new HashMap<String, ArrayList<String>>();

我应该如何进行?谁能帮我写代码和逻辑?

请不要将此标记为重复,我已尝试在 * 和 Internet 上进行搜索,但其中大多数都使用该行进行迭代。

【问题讨论】:

  • 不清楚问题出在哪里。只需遍历行和getCell(4),即每行的E 列。
  • 我想让它通用。不是特定的行或列。对于特定的列标题,我想提取所有单元格值。如果你能帮我写一段相同的代码,那就太好了。

标签: java excel apache-poi


【解决方案1】:

如果不遍历行,就无法直接读取列中的所有单元格,因为这是数据存储在 Excel 工作表中的方式(以行而不是列)。一种解决方法可能是像here 所示那样转置行和列,然后遍历行以在Hashmap 中获取数据,如您在问题中指出的那样。

【讨论】:

  • 感谢您的信息。除了转置行和列,有没有办法,我们可以根据列标题名称检索所有单元格?
  • 我不知道任何其他方式,并且不认为有任何其他方式,至少对于 CSV 或 excel 格式的表格,因为数据方式所施加的基本限制存储(逐行)在其中。从一个单元格到一行中的下一个单元格有一个直接指针(某种意义上),但是对于跨不同行的列中的单元格不存在这种链接。以这种方式想象 - 相同长度的线水平放置在桌子上,一个在另一个下方(行)。您可以遍历线程的长度,但不能从一个线程上的一个点跳转到下一个线程上的对应点!
【解决方案2】:

首先,在获取所有列值后,您将读取第一行,下面我给出了如何读取第一行

public void readFirstRow(String filename)
{

    List<String> fieldsArrayList = new ArrayList<String>();

     try{

            FileInputStream myInput = new FileInputStream(new File(filename));

            Workbook workBook = null;

            workBook    = new HSSFWorkbook(myInput);

            Sheet sheet = workBook.getSheetAt(0);

            Row firstRow = sheet.getRow(0);

            int length  = firstRow.getLastCellNum();

            Cell cell = null;

            for( int i = 0 ; i < length ; i++ )

                {
                     cell = firstRow.getCell(i);

                     fieldsArrayList.add(cell.toString());

                }

     }
     catch(Exception e)
     {
         e.printStackTrace();
     }
}

读取列值代码:

//你只需传递cityPostion和文件名

public void readColumnValues(int cityPosition,String fileName)
{
    try
    {
        FileInputStream myInput = new FileInputStream(fileName);

        Workbook workBook = null;

        workBook = new HSSFWorkbook(myInput);
        Sheet sheet = workBook.getSheetAt(0);

        for ( int i = 0 ; i <= sheet.getLastRowNum() ; i++ )
        {
            Row row = sheet.getRow(i);

            if (i > 0) //skip first row
            {

                Cell cityCell   = row.getCell(cityPosition);


                String cityNames      = cityCell.toString();
            }

        }

    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
}

也许对你有帮助……

【讨论】:

  • 检查空行和空单元格,除非您需要 NullPointerExceptions。
  • @parthi: public void readFirstRow(String filename) {try{ FileInputStream myInput = new FileInputStream(new File(filename));工作簿 workBook = null; workBook = new HSSFWorkbook(myInput); Sheet sheet = workBook.getSheetAt(0);第一行 = sheet.getRow(0); int 长度 = firstRow.getLastCellNum();单元格 = null; for( int i = 0 ; i
相关资源