2013-11-22 136 views
0

這是我使用的代碼,我在Excel工作表中讀取其內容,並從每個列中添加一個GUID。索引越界異常:重複多次重複相同的行

UPDATE 代碼:

public class PublishOutputFile { 

    public void publishOutputWithGuids(List<String> guids, File file) 
      throws Exception { 
     FileInputStream fileStream = new FileInputStream(file); 
     HSSFWorkbook workbook = new HSSFWorkbook(fileStream); 
     HSSFSheet sheet = workbook.getSheetAt(0); 
     Row toprow = sheet.getRow(0); 
     int cellsNum = toprow.getLastCellNum(); 
     Iterator<Row> rowIterator = sheet.iterator(); 
     while (rowIterator.hasNext()) { 
      Row row = rowIterator.next(); 
      int rownum = row.getRowNum(); 
      System.out.println(rownum); 
      Iterator<Cell> cellIterator = row.cellIterator(); 
      while (cellIterator.hasNext()) { 
       Cell cell = cellIterator.next(); 
       switch (cell.getCellType()) { 
       case Cell.CELL_TYPE_BOOLEAN: 
        break; 
       case Cell.CELL_TYPE_NUMERIC: 
        break; 
       case Cell.CELL_TYPE_STRING: 
        break; 
       } 
       if (rownum == 0) { 
        row.createCell(cellsNum).setCellValue("GUID"); 
       } else { 
//     System.out.println(rownum); 
        row.createCell(cellsNum).setCellValue(guids.get(rownum-1)); 
       } 
      } 
     } 
     fileStream.close(); 
     FileOutputStream out = new FileOutputStream(
       new File(
         "C:/Users/U0172959/Desktop/Themes_20131120_234645-hierarchy with GUIDS.xls")); 
     workbook.write(out); 
     out.close(); 
    } 
} 

UPDATE輸出:

0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
41 
42 
43 
44 
45 
46 
47 
48 
49 
50 
51 
52 
53 
54 
55 
56 
57 
58 
59 
60 
61 
62 
63 
64 
65 
66 
67 
68 
69 
70 
71 
72 
73 
74 
75 
76 
77 
78 
79 
80 
81 
82 
83 
84 
85 
86 
87 
88 
89 
90 
91 
92 
93 
94 
95 
96 
97 
98 
99 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
140 
141 
142 
143 
144 
145 
146 
147 
148 
149 
150 
151 
152 
153 
154 
155 
156 
157 
158 
159 
160 
161 
162 
163 
164 
165 
166 
167 
168 
169 
170 
171 
172 
173 
174 
175 
176 
177 
178 
179 
180 
181 
182 
183 
184 
185 
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196 
197 
198 
199 
200 
201 
202 
203 
204 
205 
206 
207 
208 
209 
210 
211 
212 
213 
214 
215 
216 
217 
218 
219 
220 
221 
222 
223 
224 
225 
226 
227 
228 
229 
230 
231 
232 
233 
234 
235 
236 
237 
238 
239 
240 
241 
242 
243 
244 
245 
246 
247 
248 
249 
250 
251 
252 
253 
254 
255 
256 
257 
258 
259 
260 
261 
262 
263 
264 
265 
266 
267 
268 
269 
270 
271 
272 
273 
274 
275 
276 
277 
278 
279 
280 
281 
282 
283 
284 
285 
286 
287 
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 286, Size: 286 
    at java.util.ArrayList.rangeCheck(Unknown Source) 
    at java.util.ArrayList.get(Unknown Source) 
    at mappingForEtl.PublishOutputFile.publishOutputWithGuids(PublishOutputFile.java:43) 
    at mappingForEtl.InputFileParsing.main(InputFileParsing.java:75) 

在輸出中,每一行被重複像5倍,我認爲這是什麼原因造成的了界限例外。但我無法弄清楚是什麼導致了這種情況發生。

(我昨天對一個不同的文件使用了相同的代碼,而且工作正常......)它可以與我作爲輸入的Excel表中的列數有任何關係。我昨天用過的有8列,我現在用的有20列。

任何人都有什麼想法可能會導致這種情況?感謝幫助。

+0

你爲什麼在每一行迭代每個單元並創建相同的GUID列? – everton

+0

你有參考引用預期大小列表的指導嗎? – Keerthivasan

回答

2

您正在迭代一行內的單元格以及您打印行號的每個單元格。您是否確定在else案件中打印出正確的數據?

if (row.getRowNum() == 0) { 
    row.createCell(cellsNum).setCellValue("GUID"); 
} else { 
    System.out.println((row.getRowNum())); // row number for each cell? 
    row.createCell(cellsNum).setCellValue(guids.get((row.getRowNum()))); 
} 

更新:

與重複輸出的問題是,你必須在你行的循環。每行由許多單元組成。你也循環遍歷單元格。重複的輸出來自這樣一個事實,即當您循環訪問行中的單元格時,該行不會改變。 爲了更好地理解,你應該將輸出更改爲:

System.out.println("Being at row: " + row.getRowNum() + " creating cell at cellnum: " + cellsNum); 

這應該清理是怎麼回事的理解。

更新2:

將拋出IndexOutOfBoundsException因爲GUID的大小是286,但該指數是從零開始的,當你踩的第一行不同,你應該改變guids.get(row.getRowNum())guids.get(row.getRowNum() - 1)沒有通過1開始。這可以工作,但不一定。只要我們不知道詳細的數據結構,這可能是你沒有價值的...

+0

事實上,'IndexOutOfBoundsException'來自'ArrayList'(下面一行),而不是'System.out.println' ... –

+0

很高興我還沒有提到IndexOutOfBoundsException和一個單詞。我的回答集中在5次重複輸出。感謝您指出與我的答案無關的內容。隨時享受upvote,downvote或跳舞...... – WarrenFaith

+0

'row.getRowNum()'返回同一行5次。這就是讓我困惑的原因。我無法弄清楚這是什麼原因 – DT7

-1

的問題是在這裏:

} else { 
    row.createCell(cellsNum).setCellValue(
     guids.get((row.getRowNum()))); 
} 

guids.get拋出異常,因爲它在索引286中不包含元素。

解決方法:在檢索索引中的元素row.getRowNum - 1,所以你現在從檢索元素0至285:

} else { 
    row.createCell(cellsNum).setCellValue(
     guids.get((row.getRowNum() - 1))); 
} 

更新:

,因爲它看起來你不是要解決IndexOutOfBoundsException (很奇怪),但更多關於爲什麼數字打印4到5次,然後檢查您當前的算法:

Iterator<Row> rowIterator = sheet.iterator(); 
//verify if there's a row to read in the current Excel sheet 
while (rowIterator.hasNext()) { 
    //get the row 
    Row row = rowIterator.next(); 
    //get an iterator of the cells 
    Iterator<Cell> cellIterator = row.cellIterator(); 
    //while there's a cell to read... 
    while (cellIterator.hasNext()) { 
     //get the cell 
     //note: if the cell is empty, it won't be considered by the CellIterator, so even 
     //if you open the file and see 20 cells, this Iterator will seek for cells with some value 
     //from your current output, this looks to be only 5 cells 
     Cell cell = cellIterator.next(); 
     //verify the type of the cell... 
     switch (cell.getCellType()) { 
     case Cell.CELL_TYPE_BOOLEAN: 
      //do nothing? 
      break; 
     case Cell.CELL_TYPE_NUMERIC: 
      //do nothing? 
      break; 
     case Cell.CELL_TYPE_STRING: 
      //do nothing? 
      break; 
     } 
     if (row.getRowNum() == 0) { 
      row.createCell(cellsNum).setCellValue("GUID"); 
     } else { 
      //prints the number of the row (per cell) 
      //this causes the 1\n1\n1\n1\n2\n2\n... output 
      System.out.println((row.getRowNum())); 
      //writes the element in guids at index of row num 
      row.createCell(cellsNum).setCellValue(
        //guids.get((row.getRowNum()))); 
        guids.get((row.getRowNum() - 1))); 
     } 
    } 
} 
+0

是的,我想到了..但正如我所說的,因爲不知何故'row.getRowNum()'返回同一行5次。這就是讓我困惑的原因。 – DT7

+0

@ DT7這不是問題。請注意,控制檯輸出對此非常明確:首先,它打印286(來自'System.out.println((row.getRowNum()));')然後是Exception。順便說一句,你會得到相同的行打印5次,因爲你是通過行中的單元格導航,這似乎是5.#: –

+0

'System.out.println(guids.size());'是什麼打印286,因爲這是傳遞給方法的列表的大小。並且工作表中的單元格數爲20 – DT7

2

關於異常

你可能不期而遇創造了一些新的(大概空白),而且在你的List爲沒有GUID。這可能會導致此異常。

也許這除了可以幫助你:

while (rowIterator.hasNext()) { 
    Row row = rowIterator.next(); 
    if (row.getLastCellNum() < cellsNum) 
     continue; 

關於你遍歷每一行重複輸出

,然後再遍歷每個單元格,然後打印行數。考慮到一行有4個單元格,這將最終打印行號4次。

+0

編輯:解決OP提到的兩個問題 – everton