2016-05-25 48 views
2

你好,我有一個問題,爲什麼最後一行永遠不會被讀取?不管它在excel文件中只有一行還是100行都不重要。最後一行從不出現在列表中。我不知道爲什麼....爲什麼最後一行永遠不會被讀取?

這裏是我的Excel文件: Excel File

,這是我的方法:

public List<string> getListData(bool skipFirstRow, int numberOfColumns, string filepath) 
{ 
    int startpoint = 1; 
    int cell = 1; 
    int row = 1; 

    List<string> stringList = new List<string>(); 

    //Open Excel (Application) 
    var excelApplication = openExcelApplication(); 
    //Open Excel File 
    Excel.Workbook excelWorkbook = excelApplication.Workbooks.Open(filepath); 
    //Get the Worksheets from the file 
    Excel.Sheets excelSheets = excelWorkbook.Worksheets; 
    //Select the first Worksheet 
    Excel.Worksheet worksheet = (Excel.Worksheet)excelSheets.get_Item(1); 

    if (skipFirstRow == true) 
    { 
     startpoint = 2; 
    } 

    Excel.Range range = worksheet.get_Range("A" + Convert.ToString(startpoint), Missing.Value); 

    while ((range.Cells[startpoint, cell] as Excel.Range).Value2 != null) 
    { 
     for (int i = 1; i <= numberOfColumns + 1; i++) 
     { 
      string sValue = (range.Cells[row, cell] as Excel.Range).Value2.ToString(); 
      stringList.Add(sValue); 
      cell++; 
     } 
     startpoint++; 
     cell = 1; 
     row++; 
    } 

    closeExcelApplication(excelApplication); 

    var result = 
     stringList 
     .Select((item, index) => new { Item = item, Index = index }) 
     .GroupBy(x => x.Index/numberOfColumns) 
     .Select(g => string.Join(";", g.Select(x => x.Item))) 
     .ToList(); 

    return result; 

} 

我用調試器試了一下,甚至谷歌。然後我用最後一次使用的行來嘗試它,但沒有奏效。

Excel.Range last = worksheet.Cells.SpecialCells(Excel.XlCellType.xlCellTypeLastCell, Type.Missing); 
Excel.Range range = worksheet.get_Range("A1", last); 

int lastUsedRow = last.Row; 
int lastUsedColumn = last.Column; 

任何幫助或建議將是偉大的,所以感謝您的時間和幫助。

回答

5

你的算法是越野車。

讓我們看看會發生什麼時skipFirstRow是真實的,您的Excel工作表有三行1,2和3。使用while循環的開始,我們有以下的情況:

startpoint = 2 
row = 1 

在第一次迭代,while循環讀取第1行的內容的迭代後,我們有以下的情況:

startpoint = 3 
row = 2 

在第二次迭代,while循環讀取行2的內容的迭代後,我們有以下情況:

startpoint = 4 
row = 3 

由於range.Cells[startpoint, cell]爲空,您的代碼在此處停止。第1行和第2行已被讀取,第3行被忽略。

正如你可以看到,有關問題的原因是,你檢查startpoint行中row閱讀行,並在這兩個不同,你有問題。建議的解決方案:刪除startpoint變量並改爲使用row

+0

由於這是它現在它的工作原理。 – opelhatza

-1

Excel表單顯示第一行號作爲1 但內部它從0開始,可能是它被讀取的所有數據,將不同的測試數據上最後一列

+0

那麼根據這個問題和MSDN http://stackoverflow.com/questions/14344442/getting-cell-values-from-excel-api-c-sharp單元索引從1開始。 – opelhatza

+0

更改測試數據並查看,最後一行讀取 –

+0

更改第一行數據和最後一行數據,並檢查它們是否被讀取 –

相關問題