将Excel互操作值传递给Deedle数据框架
本文关键字:Deedle 数据 框架 Excel 互操作 值传 | 更新日期: 2023-09-27 18:06:01
我使用Excel Interop从Excel电子表格中提取了一个2D对象数组。
data = activeWorksheet.UsedRange.Value2;
data.GetType()
{Name = "Object[,]" FullName = "System.Object[,]"}
看一下关于框架的Deedle文档,似乎我可以从2D数组FromArray2D(array)
或"任何。net对象序列"FromRecords(values)
中创建一个框架,但它似乎不能接受这个对象数组。
我也尝试过转换到一个数组,但这只给了我一个com对象数组,从中我可以引用Value2
。所以这真的没有帮助。
cellArray = activeWorksheet.UsedRange.Cells.Cast<Excel.Range>().ToArray<Excel.Range>();
cellArray.GetType()
{Name = "Range[]" FullName = "Microsoft.Office.Interop.Excel.Range[]"}
我想我可以写一个函数来重建我的数据,基于Github的例子,但在我这样做之前....
是否有一个类型转换/强制转换,我应该看看,使一个简单的Excel -> Deedle数据框插入?
编辑:
当尝试使用FromArray2D
时,我得到以下内容:
Frame df = Frame.FromArray2D(data);
'Frame.FromArray2D(data)' threw an exception of type 'System.IndexOutOfRangeException'
Data: {System.Collections.ListDictionaryInternal}
HResult: -2146233080
HelpLink: null
InnerException: null
Message: "Index was outside the bounds of the array."
Source: "Deedle"
StackTrace: " at Deedle.Frame.FromArray2D[T](T[,] array) in C:''code''deedle''src''Deedle''FrameExtensions.fs:line 281'r'n at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1)"
TargetSite: {Deedle.Frame`2[System.Int32,System.Int32] FromArray2D[T](T[,])}
这可能是因为Excel Interop使用1索引数组,而不是0索引,所以存在不匹配?
我在官方文档中找不到Excel的怪癖,但是SO到处都是这样说的答案。例如:https://stackoverflow.com/a/14345372/1886901
不确定这是否是最好的方法,但是将数组转换为0索引可以让FromArray2D
没有错误地通过。
data = activeWorksheet.UsedRange.Value2;
string[,] newData = new string[data.GetLength(0), data.GetLength(1)];
for (int x = 0; x < data.GetLength(0); x++)
{
for (int y = 0; y < data.GetLength(1); y++)
{
newData[x, y] = data[x + 1, y + 1].ToString();
}
}
var df = Frame.FromArray2D(newData);