为什么Dimension.End.Column返回的索引大于上一列的任何值?

时间:2014-05-07 19:34:35

标签: .net epplus

使用EPPlus阅读电子表格时,我惊讶地看到Dimension.End.Column返回的索引比我知道的最后一列(1)更高。

例如,在这样的电子表格中:

   A       B       C       D...
1  value

我希望Dimension.End.Column为1,对应第一列。

但是,它通常更大。那是为什么?

2 个答案:

答案 0 :(得分:3)

要回答这个问题,需要深入研究EpPlus的源代码。

无论如何,这是一个扩展方法,我用它来获得一个实际的(有价值的)维度,即使对于边缘情况它也能正常工作:

public static ExcelAddressBase GetValuedDimension(this ExcelWorksheet worksheet)
{
    var dimension = worksheet.Dimension;
    if (dimension == null) return null;
    var cells = worksheet.Cells[dimension.Address];
    Int32 minRow = 0, minCol = 0, maxRow = 0, maxCol = 0;
    var hasValue = false;
    foreach (var cell in cells.Where(cell => cell.Value != null))
    {
        if (!hasValue)
        {
            minRow = cell.Start.Row;
            minCol = cell.Start.Column;
            maxRow = cell.End.Row;
            maxCol = cell.End.Column;
            hasValue = true;
        }
        else
        {
            if (cell.Start.Column < minCol)
            {
                minCol = cell.Start.Column;
            }
            if (cell.End.Row > maxRow)
            {
                maxRow = cell.End.Row;
            }
            if (cell.End.Column > maxCol)
            {
                maxCol = cell.End.Column;
            }
        }
    }
    return hasValue ? new ExcelAddressBase(minRow, minCol, maxRow, maxCol) : null;
}

答案 1 :(得分:0)

            int rowCount = 0;
            int colCount = 0;
            for (int i = 1; i <= sheet.Dimension.End.Row; i++ )
            {
                if(string.IsNullOrEmpty(sheet.Cells[i, 1].Text))
                {
                    break;
                }
                rowCount++;
            }
            for (int i = 1; i <= sheet.Dimension.End.Column; i++)
            {
                if (string.IsNullOrEmpty(sheet.Cells[1, i].Text))
                {
                    break;
                }
                colCount++;
            }
        }

这不是最佳的性能指标,但是可以完成工作。