如何在不使用 C# 中的 oledb 连接的情况下获取当前选择的 excel sheet 数据

How to get current selected excel sheet data without using oledb connection in c#

我正在开发 vsto 应用程序,我有一个打开的工作簿。我想在不使用任何 oledb 连接的情况下从该工作簿中读取选定的 sheet 数据,有什么方法可以读取数据并将其存储在数据表中。

棘手的部分是确定当前选择是否对您要执行的操作有效。在 Excel 的 VBA 世界中,您将使用 VBA 信息函数 TypeName 来确定当前 Selection 是否为 Range 对象。 C# 没有直接的等效项,因此您必须解决它。如果您只对范围感兴趣,那么您可以检查直接转换为 Excel.Range 是否有效并从那里继续。 Range 对象将 return 一个数组,您可以将其放入数据集中。

以下代码示例展示了如何测试选择并使用结果数组。它对数据集没有任何作用 - 那将是一个不同的问题。

    object oSel = Globals.ThisAddIn.Application.Selection;
    if ((oSel as Excel.Range) != null)
    {
        Excel.Range rngSelection = (Excel.Range)oSel;
        object[,] data = rngSelection.Value2;
        int rank = data.Rank;
        int lbound = data.GetLowerBound(rank-1);
        int ubound = data.GetUpperBound(rank-1);
        for (int i = 1; i <= rank; i++)
        {
            for (int l = lbound; l <= ubound; l++)
            {
                System.Diagnostics.Debug.Print(data[i,l].ToString());
            }
        }
    }

使用转换测试的替代方法涉及使用 COM API。如果您需要根据选择的类型采取各种操作,则此方法可能更有效。此处描述:https://www.add-in-express.com/creating-addins-blog/2011/12/20/type-name-system-comobject/