2016-05-25 50 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

更改第一行数据和最后一行数据,并检查它们是否被读取 –

相关问题