2016-09-06 5 views
0

У меня есть 2D Object Array, извлеченный из таблицы Excel с помощью Excel Interop.Передача значений Excel Interop для Deedle DataFrame

data = activeWorksheet.UsedRange.Value2; 

data.GetType() 
{Name = "Object[,]" FullName = "System.Object[,]"} 

Looking at the Deedle documentation on Frames, кажется, что я мог бы создать кадр из 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[]"} 

Я полагаю, я мог бы написать функцию, чтобы восстановить свои данные, based on the Github examples, но прежде, чем я могу это сделать ....

Есть ли преобразование типов/Литой я должен смотреть, чтобы легко Excel -> Вставка Dedle DataFrame?


Edit:

При попытке использовать 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 quirk в официальной документации, но SO усеян ответами, говорящими так же. Пример: https://stackoverflow.com/a/14345372/1886901

+1

Какая ошибка возникает при попытке использовать 'FromArray2D'? –

+0

Обновлен мой вопрос, чтобы включить ошибку для 'FromArray2D' – getglad

ответ

0

Не уверен, что это лучший метод или нет, но переключение массива на 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);