【问题标题】:How to get current selected excel sheet data without using oledb connection in c#如何在c#中不使用oledb连接获取当前选定的excel工作表数据
【发布时间】:2016-10-01 03:26:34
【问题描述】:

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

【问题讨论】:

  • 你查看过 Microsoft.Office.Interop.Excel
  • 是的,我有当前选定的工作表参考。
  • 什么样的“vsto 应用程序”:工作簿自定义或加载项?
  • 那么你在寻找类似link的东西吗?
  • @CindyMeister 它是添加的。实际上我想读取数据,然后我想对其应用过滤器并获取选定的数据。

标签: c# excel datatable vsto


【解决方案1】:

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

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

    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/

【讨论】:

  • 谢谢 Cindy,只是想知道选择属性是我从 excel 现在选择的当前 excel 工作表数据吗?
  • 我向您展示的代码会获取 Excel 应用程序中的当前选择 - 无论它是什么。然后它检查当前选择是否是单元格范围。如果是,则将该 Range 分配给一个数组,然后您可以使用该数组。你为什么不试试呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
相关资源
最近更新 更多