C#ExcelDNA从动态数组中读取

时间:2012-06-06 12:41:07

标签: c# excel-dna

我第一次在这里发帖。通常情况下,我发现可能需要回答的所有内容。在这种情况下,对于我的生活,我无法弄清楚这一点,所以这里。

我在excel中有一系列值,我试图用ExcelDNA读取。此范围始终有2列,但行数是动态的,如下所示:

n行数

String,float 字符串,浮动 ... 第n行

现在我可以使用ExcelDNA和ExcelReference读取范围,如下所示:

object[,] bencharray = ExcelData.ReadArrayValue(0, 10, 0, 1, "Sheet1");


    public static class ExcelData
{
            public static dynamic ReadArrayValue(int rf, int rl, int cf, int cl, string sheet)
        {
            //This reads an array with 4 co-ordinates from the specified sheet
            ExcelReference readarray = new ExcelReference(rf, rl, cf, cl, sheet);
            return readarray.GetValue();
        }
}

因此,这将静态读取11行范围,其中2列从单元格A1开始。

我正在寻找的东西类似于VBA的xlDown或UsedRange。理想情况下,当范围的底部为空白时,这将停止,并允许仍然使用在纸张下方的单元格。

我不确定我是否应该使用Interop.Excel或如何使用它。

任何帮助将不胜感激。非常感谢

2 个答案:

答案 0 :(得分:0)

您可以使用C API执行此操作。您需要xlcSelectEnd功能,该功能可以在其中一个方向上扩展选择范围。所以你打电话给

XlCall.Excel(XlCall.xlcSelectEnd, 4);

方向是:

  • 1 - 左
  • 2 - 对
  • 3 - Up
  • 4 - 向下

这意味着您必须设置选择(xlcSelect),然后对其进行扩展(xlcSelectEnd),然后获取当前选择(xlfSelection)。

关于Google群组的讨论也可能有用:https://groups.google.com/group/exceldna/browse_frm/thread/cc87114539c78f53

所有这些听起来有点复杂,让我觉得你也应该考虑COM API。

答案 1 :(得分:0)

使用Govert的示例ExcelSelectionHelper,您可以执行以下操作:

鉴于以下内容:

public enum DirectionType
{
    Up = 3,
    ToRight = 2,
    Down = 4,
    ToLeft = 1
}

你可以这样:

public static ExcelReference End( this ExcelReference reference, DirectionType direction )
{
    ExcelReference end = null;

    using ( new ExcelSelectionHelper( reference ) )
    {
        // myReference is selected now...
        XlCall.Excel( XlCall.xlcSelectEnd, (int)direction );

        var selection = XlCall.Excel( XlCall.xlfSelection ) as ExcelReference;
        var row = selection.RowFirst;
        var col = selection.ColumnFirst;

        end = new ExcelReference( row, row, col, col, selection.SheetId );
    }

    return end;
}