2015-10-29 4 views
1

У меня есть следующий код в Excel Add-In в C#:Исключение из HRESULT: 0x800A03EC - Запись массива в диапазоне Excel Add-In

long lngArrayLength = 14; 
long lngArrayLength2 = array2.Length; 

Excel.Range rngValues1 = (Excel.Range)wsNew.Cells[2, 1]; 
Excel.Range rngValues2 = (Excel.Range)wsNew.Cells[lngArrayLength2 + 1, lngArrayLength]; 
Excel.Range rngValues = wsNew.get_Range(rngValues1, rngValues2); 

rngValues.Value = array2; 

Для справки, array2 десять элементов, каждый из которых имеет 14 подэлементов. Пример:

array2 = { (0, "a0", "b0", "c0"... "n0"), ... {9, "a9", "b9", "c9"... "n9) } 

rngValues выше размера, как {[1..10,1..14]}

Каждый раз, когда я пытаюсь запустить, я получаю следующее сообщение об ошибке:

Exception from HRESULT: 0x800A03EC

Я исключал:
1) Формат файла , сохранение Book1 как .xlsx не помогает
2) Достигая предела столбца или строки, делает то же самое с тысячами элементов или 10 из них
3) [0] против [1] - индексированные массивы и/или диапазоны, кажется, не имеет значения/помочь

Я до сих пор возникают проблемы отладки это ... Возможно ли это что-то делать с размерами массив против диапазона? Как бы я определил, так ли это или нет?

UPDATE 1:

Я создал цикл, который заполняет массив с данными:

for (i = 1; i <= lngRows; i++) 
{ 
    for (j = 1; j <= lngCols; j++) 
    { 
     strTest[i-1, j-1] = "test (" + i.ToString() + "," + j.ToString() + ")"; 
    } 
} 

... и это работает отлично.

Теперь мне приходит в голову, что элементы элементов в массиве могут содержать значения NULL.

Я думаю, что это может быть проблемой ... Не так ли?

UPDATE 2:

Хорошо, так что теперь я написал небольшую процедуру для преобразования любых NULLs 0 (б/с типом данных является decimal? (обнуляемым десятичное), и я предполагаю, что мне действительно нужно decimal вместо:

public decimal replaceNullDec(decimal? decInput) 
{ 
    if (decInput != null) 
    { 
     decimal rtn = (decimal)decInput; 
     return rtn; 
    } 
    else 
    { 
     decimal rtn = 0; 
     return rtn; 
    } 
} 

Итак, теперь я подтвердил, что все нули заменяются, но я все еще получаю ошибку при записи массива в диапазоне ...

UPDATE 3:

Итак, я подумал, что, возможно, это проблема с типом данных, поэтому я переписал код для преобразования всех элементов в массив в строки вместо того, чтобы писать на листе. Теперь я получаю данные, но вместо фактических значений я получаю текст, говорящий мне оригинальный TYPE (который в этом случае является обычным классом под названием Response).

Интересная вещь, которую я заметил, это то, что я получаю 10 COLUMNS текста и 4 COLUMNS от #N/A.

Это заставляет меня думать, что, может быть, мне нужно транспонировать массив?

Вождение меня с ума, но все еще пытаясь.

Любая помощь была бы БОЛЬШОЙ!

UPDATE 4:

Хорошо, я верю, что я все ближе. При перекодировании 2-мерного массива в C# я получал некоторые ошибки, которые заставляли меня думать, что на самом деле у меня нет 2d-массива, а вместо этого «массив массивов» (это то, что я думал, что 2-й массив был , честно говоря), и это, вероятно, конверсия моего List в Array с использованием метода ToArray(). Это проблема.

Вот этот код:

object[] array2 = listAllData.ToArray(); 

Итак, следующий вопрос становится «как преобразовать список в 2d массив?»

ответ

0

ОТВЕТ:

вопрос свелся к тому, что я не пишу 2D-массив в диапазон, но вместо этого я строил массив Response объектов и пытаюсь написать, что в диапазон.

Подробнее о решении можно найти в этой связанной почте: How to Convert 2D List to 2D Array in C#