Экспорт XLS в Delphi + Массив Variant

Уважаемые Delphi специалисты (Использую Delphi 7)

Вот такая вот задача, при экспорте XLS файла в stringgrid средствами COM.

Начало и заголовки стандартные, интереса не представляют.

Но, есть тип RangeMatrix: Variant, в который помещаются данные при вызове
RangeMatrix := XLApp.Range['A1', XLApp.Cells.Item[X, Y]].Value;

Затем данные из RangeMatrix по циклу помещаются в StringGrid.Cell[ROW,COL]

Вот так:
StringGrid.Cells[ROW, COL] := RangeMatrix [ROW,COL];
Этот код работает.

Все данные помещаются нормально, за исключением DateTime, которое помещается в виде Double, т.е. время в ячейке вместо 16:30 выглядит как 0.ХХХХХХХХ, т.е. 0.324234234

Вопрос: Как сделать распознать тип текущих данных в RangeMatrix [ROW,COL]; дабы совершить над ними какие либо действия в процессе обработки?

В отличие от кода выше, код ниже, когда значение RangeMatrix [ROW,COL] присвавается переменной, не работает
MyTest := RangeMatrix[ROW,COL];

Этот код выдает ошибку: Variant or safe array index out of bounds

Голова сломалась совсем. Прошу совета, почему переменной MyTest нельзя присвоить RangeMatrix[ROW,COL]?
  • Вопрос задан
  • 4631 просмотр
Решения вопроса 1
ncix
@ncix
Предприниматель
StringGrid.Cells[ROW, COL] := RangeMatrix [ROW,COL];
Этот код работает.


Покажите, как вы индексы массива перебираете. Как границы определяете.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@drVano
MyTest := RangeMatrix[K, R];
Этот код выдает ошибку: Variant or safe array index out of bounds
Ответ написан
@pokryshkin
чтобы не было Variant or safe array index out of bounds используейте .value как в первом случае, т.е.

MyTest := RangeMatrix[ROW,COL].value;

с временем тоже все правильно — время это дробная часть числа. А вот как определить формат числа уже не вспомню, но установить его можно было через NumberFormat, может и определится через него.
Ответ написан
@xdenser
так в случае
AGrid.Cells[ROW, COL] := RangeMatrix[K, R];
идет приведение типа к String;

попробуйте объявить
var
myTest: OleVariant;

или вот так написать

var
myTest: Variant;

myTest:=String(RangeMatrix[ROW,COL].Value);

но проблему определения типа данных в ячейке это не решит
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы