gpt4 book ai didi

c# - 是否可以使用 com interop 将变体数组传递给 C#?

转载 作者:行者123 更新时间:2023-11-30 16:30:05 26 4
gpt4 key购买 nike

我尝试在 Excel 和 C# 之间传输一些数据。为此,我编写了一个简单的 C# 类,其中包含用于设置和获取数据的属性。

[Guid("xxx")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(true)]
public class Vector
{
private object[,] _values;

public object[,] ExcelValues
{
get { ... }
set { ... }
}
}

在 VBA 中获取 ExcelValues 属性效果很好,但无法在 VBA 中设置它。如果我尝试设置属性,VBA 代码不会编译:

    Dim values As Variant
With myRange
' typo: Set values = Range(.Offset(0, 0), .Offset(100, 0))
values = Range(.Offset(0, 0), .Offset(100, 0))
End With

Dim data As New Vector

' this doesn't compile
data.ExcelValues = values

' this works
values = data.ExcelValues

有什么建议我可以如何完成这个,而不是一次设置一个变量数组中的每个值?

最佳答案

我根据发布的代码找到了解决方案 here .变体数组必须作为对象(不是对象 [,])从 VBA 传递到 C#。然后可以使用反射将其转换为更方便的东西:

[Guid("xxx")]
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.AutoDual)]
public class Vector
{
[ComVisible(false)]
public IList<double> Values { get; set; }

public object[,] GetExcelValues()
{
// own extension method
return Values.ConvertToExcelColumn();
}

public void SetExcelValues(object comArray)
{
IEnumerable<object> values = ConvertExcelCloumnToEnumerable(comArray);
Values = new List<double>(values.Select(Convert.ToDouble));
}

private static IEnumerable<object> ConvertExcelCloumnToEnumerable(object comObject)
{
Type comObjectType = comObject.GetType();

if (comObjectType != typeof(object[,]))
return new object[0];

int count = (int)comObjectType.InvokeMember("Length", BindingFlags.GetProperty, null, comObject, null);
var result = new List<object>(count);

var indexArgs = new object[2];
for (int i = 1; i <= count; i++)
{
indexArgs[0] = i;
indexArgs[1] = 1;
object valueAtIndex = comObjectType.InvokeMember("GetValue", BindingFlags.InvokeMethod, null, comObject, indexArgs);
result.Add(valueAtIndex);
}

return result;
}
}

另一种方式 - 从 C# 到 VBA - 它可以作为 object[,] 或 double[,] 更舒适地传递。
希望没有语法错别字 :)。

关于c# - 是否可以使用 com interop 将变体数组传递给 C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5952640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com