繁体   English   中英

从动态数组读取C#ExcelDNA

[英]C# ExcelDNA read from dynamic array

我第一次在这里发帖。 通常,我发现一个人可能需要回答的所有问题。 在这种情况下,对于我的一生,我无法弄清这一点,因此请继续。

我尝试使用ExcelDNA读取Excel中的一系列值。 该范围将始终具有2列,但是行数是动态的,如下所示:

n行数

字符串,浮点数字符串,浮点数...第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();
        }
}

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

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

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

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

您可以使用C API来实现。 您需要xlcSelectEnd函数,该函数可以在一个方向上扩展选择范围。 所以你会打电话

XlCall.Excel(XlCall.xlcSelectEnd, 4);

方向是:

  • 1-左
  • 2-对
  • 3-上
  • 4-下

这意味着您必须设置一个选择( xlcSelect ),然后扩展它( xlcSelectEnd ),然后获得当前选择( xlfSelection )。

关于Google网上论坛的讨论也可能会有用: https : //groups.google.com/group/exceldna/browse_frm/thread/cc87114539c78f53

所有这些听起来有些复杂,让我认为您还应该考虑COM API。

使用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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM