2016-11-10 1 views
0

jdk1.6을 기반으로 poi.jar를 사용하여 일부 Excel 2007 데이터를 탐색하려고합니다. 그러나 행을 탐색 할 때 HashMap()) 다음 행 데이터를 java.util에 추가하십시오. ArrayList.Map.clear() 그런 다음 목록에지도를 추가하십시오.

다음 반복기를 시작하면 먼저 Map.clear()를 호출하여 행 데이터를 지 웁니다. 그러나 ArrayList.add() 메서드를 다시 호출하면이 행 데이터가 이전 데이터보다 우선합니다.

Map<String, String> cellForRow = = new HashMap<String, String>(); 
    List<Map<String, String>> rowForSheet = new ArrayList<Map<String, String>>(); 
    for (int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) { 

        row = sheet.getRow(j); 
        if (j == 0) {// the first row is title 
         titleRow = row; 
         continue; 
        } 
        if (row != null && titleRow.getPhysicalNumberOfCells() > 0) { 
         // cellForRow = new HashMap<String, String>(); 
         cellForRow.clear(); 
         for (int k = 0; k < titleRow.getPhysicalNumberOfCells(); k++) {// cell 
          cellForRow.put(getCellValue(titleRow.getCell(k)), getCellValue(row.getCell(k))); 
         } 
        } 
        rowForSheet.add(cellForRow); 
       } 

다음 조각은 rowForSheet (목록)에 대한 디버그 로그

[{ Up =Stream, Email=XXX,Down =Stream}, 
{ Up =Stream, Email=XXX,Down =Stream}, 
{ Up =Stream, Email=XXX,Down =Stream}, 
{ Up =Stream, Email=XXX,Down =Stream}, 
{ Up =Stream, Email=XXX,Down =Stream}] 

나중에 데이터가

당신을 했 오래된 데이터를 오버라이드 (override)를 보여?

+0

왜 같은 맵을 여러 번 목록에 추가하겠습니까? – matt

+1

너 뭐야? 문장을 끝내십시오. –

답변

1

먼저지도에 루프를 작성하여 매번 맵을 추가합니다.

List<Map<String, String>> rowForSheet = new ArrayList<Map<String, String>>(); 
for (int j = 0; j < sheet.getPhysicalNumberOfRows(); j++) { 

    row = sheet.getRow(j); 
    if (j == 0) {// the first row is title 
     titleRow = row; 
     continue; 
    } 
    Map<String, String> cellForRow = = new HashMap<String, String>(); 
    if (row != null && titleRow.getPhysicalNumberOfCells() > 0) { 
     for (int k = 0; k < titleRow.getPhysicalNumberOfCells(); k++) {// cell 
      cellForRow.put(
       getCellValue(titleRow.getCell(k)), 
       getCellValue(row.getCell(k)) 
      ); 
     } 
    } 
    rowForSheet.add(cellForRow); 
} 

이제 목록의 각 항목은 새로 추가 한 데이터와 함께 다른지도가됩니다.

+0

이 방법으로 문제를 해결할 수 있음을 알고 있습니다.하지만이 방법은 낭비입니다. 행 데이터가 10 억 수준이면 메모리를 낭비합니다. – AndyWang

+0

왜 같은지도를 두 번 이상 목록에 넣겠습니까? 너의 길은 망가져있어. 왜 이런 식으로 낭비입니까? – matt

+0

모든 루프가 새로운 해시 맵을 만들었 기 때문에이지도는 무료입니다. 그래서 ... (아마 내 생각 일뿐입니다.) 대체 할 더 좋은 방법이 있겠습니까. 어쨌든 고맙습니다. – AndyWang

관련 문제