【问题标题】:Writing an excel sheet using poi and hashmaps使用 poi 和 hashmaps 编写 Excel 工作表
【发布时间】:2013-07-18 22:40:15
【问题描述】:

我正在尝试使用 POI 和 hashMaps 编写 Excel 表。我的代码成功创建并填充了一个 Excel 工作表,但并非所有信息都写入工作表。在调试模式下,它似乎写入了 5 个键值对,然后循环到键 [0] 的开头。谁能告诉我我的逻辑错误在哪里?

HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet(make + " sheet");
        int rowNum = 0;
        ConcurrentHashMap <Integer, String[] > data = new 
                        ConcurrentHashMap<Integer, String[]>();

        data.put(rowNum++, new String[] {"VIN", "Make", "Model", "Year", 
                        "Major Group", "Caption", "Cap Filter", "Illustration",
                        "Illus Filter", "PNC", "Part Name", "Part Number", "Quantity",
                        "Part Filter"});

        for (Part p : plist){
            String PNC = p.getPNC();
            String quantity = p.getQuantity();

            if(vFilterId.contains(p.getId())) {
                data.put(rowNum++ , new String[] {vinId, make, 
                                    model, year, group, caption, capFilter, illusName,
                                    iFilter, PNC, p.getName(), p.getPartNumber(), 
                                    quantity, "NONFILTERED"});

            } else {
                data.put(rowNum++ , new String[] {vinId, make, 
                                    model, year, group, caption, capFilter, illusName,
                                    iFilter, PNC, p.getName(), p.getPartNumber(), 
                                    quantity, "NONFILTERED"});

            }

        }
        int rowIndex = 0;
        Set<Integer> keyset = data.keySet();
        for (Integer key : keyset) {
            Row row = sheet.createRow(rowIndex++);
            Object[] objArr = data.get(key);
            int cellIndex = 0;
            for (Object obj : objArr) {
                Cell cell = row.createCell(cellIndex++);
                cell.setCellValue((String) obj);
            }

        }

        try {
            FileOutputStream fos = new FileOutputStream(outputFile);
            workbook.write(fos);
            fos.close();
            System.out.println("XLS sheet written.");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return ReturnConstants.SUCCESS;
}

提前致谢!

【问题讨论】:

  • 我得到的输出只有三行数据,但是当我运行相同并打印到 csv 表时,我得到 4060 行返回任何帮助。
  • 你在那个 HashMap 中有多少条目?
  • 我将 13 个字符串输入到每个键的数组中,我需要它是动态的以允许输入不同数量的部件,因为每个 ViN 可能有数千或一万个部件。
  • 我在问插入数据后data.size() 的结果是什么?它是否包含您期望的行数?
  • 它确实以 3 的大小结束,而不是我期望的对于这个特定的 VIN 应该有 4060 的结果。由于某种原因,它一直循环到方法的开头,我不知道为什么,如果这似乎是一个糟糕的问题,我刚从大学毕业。

标签: java iterator hashmap apache-poi concurrenthashmap


【解决方案1】:

您正在使用地图来存储表示表中行的数据。最好使用 List,因为地图通常没有排序(即条目的顺序可能会随着时间而改变)。

HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet(make + " sheet");
List<String[]> data = new ArrayList<String[]>();

data.add(new String[] {"VIN", "Make", "Model", "Year", 
        "Major Group", "Caption", "Cap Filter", "Illustration",
        "Illus Filter", "PNC", "Part Name", "Part Number", "Quantity",
"Part Filter"});

for (Part p : plist){
    String PNC = p.getPNC();
    String quantity = p.getQuantity();

    if(vFilterId.contains(p.getId())) {
        data.add(new String[] {vinId, make, 
                model, year, group, caption, capFilter, illusName,
                iFilter, PNC, p.getName(), p.getPartNumber(), 
                quantity, "NONFILTERED"});

    } else {
        data.add(new String[] {vinId, make, 
                model, year, group, caption, capFilter, illusName,
                iFilter, PNC, p.getName(), p.getPartNumber(), 
                quantity, "NONFILTERED"});

    }

}
for (int rowIndex=0; rowIndex<data.size(); rowIndex++) {
    Row row = sheet.createRow(rowIndex);
    Object[] objArr = data.get(rowIndex);
    int cellIndex = 0;
    for (Object obj : objArr) {
        Cell cell = row.createCell(cellIndex++);
        cell.setCellValue((String) obj);
    }
}

【讨论】:

  • @Guilaume 此代码在我的原始代码中给出了相同的结果。
  • 您说 plist 包含 3 个元素,但您希望它包含数千个元素,问题显然出在其他地方
【解决方案2】:

如果不调试您的代码很难确定,但根据您的描述,您的 keyset 变量似乎只包含 3 个条目,这就是您只输出 3 行的原因。所以我要做的第一件事是显示(使用 System.out.println)data.size() 和 keyset.size() 以查看它们有多大。我猜一个或两个都只有 3 号。

您是否显示了所有相关代码?我认为可能不是,因为例如,您的 if 语句似乎是多余的,因为无论您执行 if 代码还是 else 子句,您都输出相同的内容。

我同意第一个答案,即不需要使用 HashMap; ArrayList 也可以。但是,正如您所发现的,这与您只看到 3 行的原因无关。

抱歉,我无法提供更多帮助,但我认为您使用 System.out.println 进行一些调试将有助于发现问题所在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 1970-01-01
    • 2018-03-08
    • 2017-04-18
    相关资源
    最近更新 更多