2013-07-19 2 views
0

POI 및 hashMaps를 사용하여 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

출력은 3 행 밖에되지 않지만 동일한 것을 실행하고 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 절을 ​​실행하는지 여부에 관계없이 동일한 내용을 출력 할 때 if 문이 중복되는 것처럼 보일 수 있습니다.

나는 HashMap을 사용할 필요가 없다는 첫 번째 대답에 동의한다. ArrayList도 마찬가지로 작동합니다. 그러나, 당신이 발견했듯이, 그것은 왜 당신이 단지 3 개의 행을 보는지와 관련이 없습니다.

미안하지만 도움이 될 수는 없지만 System.out.println을 사용하여 디버깅을하면 문제가 무엇인지 알 수 있습니다.