【问题标题】:Why the last row never gets read?为什么最后一行永远不会被读取?
【发布时间】:2016-05-25 16:07:57
【问题描述】:

你好,我有一个问题,为什么最后一行永远不会被读取? excel文件中只有一行还是100行都没有关系。最后一行永远不会出现在列表中。而且我不知道为什么....

这是我的 Excel 文件:

这是我的方法:

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;

任何帮助或建议都会很棒,所以感谢您的时间和帮助。

【问题讨论】:

    标签: c# excel excel-interop


    【解决方案1】:

    你的算法有问题。

    让我们看看当 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

    【讨论】:

      【解决方案2】:

      excel表格显示第一行号为1 但内部是从 0 开始的,可能是在读取所有数据,在最后一列放不同的测试数据

      【讨论】:

      • 好吧,根据这个so question和msdn stackoverflow.com/questions/14344442/…,单元格索引从1开始。
      • 更改第一行数据和最后一行数据并检查它们是否被读取
      • 现在我尝试了不同的值,但没有区别。如果没有上述更改,它仍然不会读取最后一行。不过还是谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 2013-07-22
      • 2018-11-02
      • 1970-01-01
      相关资源
      最近更新 更多