0

我第一次在这里发帖。通常,我发现人们可能需要的所有内容都已得到解答。在这种情况下,对于我的生活,我无法弄清楚这一点,所以就这样吧。

我尝试使用 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 或如何使用它。

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

4

2 回答 2

0

您可以使用 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。

于 2012-06-06T19:12:20.527 回答
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;
}
于 2015-12-14T01:16:41.233 回答