2011-02-23 317 views
0

我有一個問題,實際上並沒有循環的循環。我已經在下面發佈了我的代碼的簡化版本。基本上,使用NPOI excel庫,我有一個Excel數據文件在第一張和第二張,所以我需要做一個循環來通過這兩張紙。For循環C#不循環

下面是我到目前爲止所做的,但是這隻能通過第一張紙然後退出。它不能增加變量w。正如你所看到的,在這個代碼中實現了其他的循環,它運行良好,所以我不明白它。

這是一個非常漫長的一天,也許我錯過了一件非常簡單的事情。我可能會把它放錯或什麼的。如果任何人能發現我可能是做錯了,我會非常感激:)

public class SalesFileProcessor : ISalesProcessor 
    { 
     public List<FTPSalesRow> ProcessSalesFile(string filename) 
     { 
      try 
      { 

      using (FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read)) 
      { 
       int numberOfSheets = 2; 
//Loop through sheets - does not work 
       for (int w = 0; w <= numberOfSheets; w++) 
       { 
        HSSFWorkbook templateWorkbook = new HSSFWorkbook(fs); 

        HSSFSheet sheet = templateWorkbook.GetSheetAt(w); 
        HSSFRow row = null; 


        for (int i = 1; i <= sheet.LastRowNum; i++) 
        { 
         FTPSalesDetails t = null; 
         int currentColumn = 0; 

         try 
         { 
          ModelContainer ctn = new ModelContainer(); 

          row = sheet.GetRow(i); 

          if (row == null) 
          { 
           continue; 
          } 

          t = new FTPSalesDetails 
          { 
           RowNumber = i, 
           InvoiceDate = GetCellValue(row.GetCell(0)), 
           CountrySoldIn = GetCellValue(row.GetCell(1)), 
           NetUnitsSold = GetCellValue(row.GetCell(2)), 
           Item = GetCellValue(row.GetCell(3)), 
           ProductCode = GetCellValue(row.GetCell(5)), 
          }; 

          if (t.ProductCode == null && t.NetUnitsSold == null) 
          { 
           return null; 
          } 

          int Qty = int.Parse(t.NetUnitsSold); 


          for (int x = 0; x < Qty; x++) 
          { 
           ItemSale ts = new ItemSale 
           { 
            ItemID = GetItemID(t.ProductCode), 
            ManufacturerID = GetManufacturerID("Samsung"), 
            DateSold = DateTime.Now, 
           }; 

           ctn.AddToItemSales(ts); 
           ctn.SaveChanges(); 
          } 
         } 
         catch (IndexOutOfRangeException) { } 
        } 
       } //End Loop - the one that doesn't work 
      } 
     } 
     catch (IOException exp) 
     { 
      throw new FTPSalesFileProcessingException("Could not open the Sales data file", exp); 
     } 
     catch (Exception exp) 
     { 
      throw new FTPSalesFileProcessingException("An unknown eror occured during processing the file", exp); 
     } 

     return null; 
    } 
+2

你試過調試嗎?看着我和W? :) – 2011-02-23 16:02:28

+0

@阿門,我當然做到了。 numberOfSheets正如你所期望的那樣,w似乎保持在零,而我的工作原理應該如此。 – 109221793 2011-02-23 16:03:37

+0

您是否通過此代碼來驗證所有值是否按照您的預期設置? – SuperNES 2011-02-23 16:17:20

回答

4
if (t.ProductCode == null && t.NetUnitsSold == null) 
    { 
     return null; 
    } 

我要去猜測,這是被擊中,造成整個函數退出。如果您試圖退出for循環的迭代,請嘗試使用break;,或者像Mike M在評論中指出的那樣繼續。

+0

你是對的,那正是發生了什麼事。我將不得不重新考慮它。理想的情況是「for(int i = 1; i <= sheet.LastRowNum; i ++)」應該照顧一些事情,但由於某些原因,我的Excel問題表顯示它有388行,但實際上只顯示了兩行工作表,這就是爲什麼如果我實現了。感謝您的發現。在時間限制結束時將會標記爲正確。 – 109221793 2011-02-23 16:06:52

+0

我還會猜測,如果當前行是空的,他可能只想繼續到下一行,而不一定移動到下一個表。在這種情況下,你應該繼續使用;不會中斷;當然,我們都只是猜測:) – 2011-02-23 16:08:31

+0

@Mike M,是的,也許我認爲他現在已經明白了。 – msarchet 2011-02-23 16:09:14

0

看代碼,伸出我的唯一明顯的一點就是:

HSSFSheet sheet = templateWorkbook.GetSheetAt(w); 
HSSFRow row = null; 

for (int i = 1; i <= sheet.LastRowNum; i++) 

我猜想,無論是sheet.LastRowNum等於0或1

1

對於你說的話,假設你變量都可以,就是循環不是空的......你有沒有檢查過你沒有在第一次迭代中選擇這條線?

if (t.ProductCode == null && t.NetUnitsSold == null) 
          { 
           return null; 
          } 
0

也許IndexOutOfRangeException異常和多數民衆怎麼一回事,因爲你只有一次迭代,或代替< =你sholud使用<。工作表編號是從零開始的?