2013-07-19 2 views
0

Я пытаюсь написать лист Excel с использованием POI и hashMaps. Мой код успешно создает и заполняет лист excel, но не вся информация записывается на лист. В режиме отладки, похоже, написано 5 пар ключей, значений, а затем петли до начала с ключом [0]. Может ли кто-нибудь сказать мне, где ошибка в моей логике?Запись листа excel с использованием poi и hashmaps

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

Вы используете карту для хранения данных, представляющих строки в таблице. Вам будет лучше использовать список, так как карты обычно не сортируются (т. Е. Порядок записей может меняться со временем).

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 кажется лишним, поскольку вы выводите одно и то же, независимо от того, выполняете ли вы оператор if или else.

Я согласен с первым ответом, что нет необходимости использовать HashMap; ArrayList будет работать так же хорошо. Но, как вы обнаружили, это не имеет никакого отношения к тому, почему вы видите только три строки.

Извините, но я не могу быть более полезным, но я думаю, что некоторая отладка с вашей стороны с System.out.println будет иметь большое значение в обнаружении проблемы.

Смежные вопросы