2013-07-19 91 views
0

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

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; 
} 

在此先感谢!

+0

我得到的输出只有三行数据,但是当我运行相同并打印到csv表时,我得到了4060行返回任何帮助,将不胜感激。 – rhennigan

+0

您在该HashMap中有多少条目? – Guillaume

+0

我每个键输入13个字符串到数组中,我需要它是动态的,以允许不同数量的零件进入,因为每个ViN可能有数千或数千个零件。 – rhennigan

回答

0

您正在使用地图来存储表格中的行数据。您最好使用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); 
    } 
} 
+0

@Guilaume此代码在我的原始代码中给出了相同的结果。 – rhennigan

+0

你说plist包含3个元素,但你期望它包含数千个,问题很明显在别处 – Guillaume

0

很难确定没有调试代码,但是从你所描述的,好像你的键集变量只包含3项,这就是为什么你只输出3行。所以我要做的第一件事就是显示(使用System.out.println)data.size()和keyset.size()来查看它们的大小。我猜一个或两个都只有大小3.

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

我同意第一个答案,不需要使用HashMap;一个ArrayList也可以工作。但是,正如你发现的那样,这与你为什么只看到3排没有关系。

对不起,我不能更有帮助,但我认为你的System.out.println的一些调试将发现什么问题很长的路要走。