将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

将Excel互操作值传递给Deedle数据框架

不确定这是否是最好的方法,但是将数组转换为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);