Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Excel. Проблемы с чтением.


Автор: AVronsky 16.11.2011, 14:29
Имеем EXCEL файл типа, 3 столбца:

вс    00:00:00    23:59:59
вт    00:00:00    16:54:59
вт    16:50:00    23:59:59
пн    00:00:00    23:59:59

При чтении данных из EXCEL файла методом:

Код

weekDay := vartostr(x.activeworkbook.activesheet.Range['A'+IntToStr(i)]);
timeFrom := vartostr(x.activeworkbook.activesheet.Range['B'+IntToStr(i)]);
timeTo := vartostr(x.activeworkbook.activesheet.Range['C'+IntToStr(i)]);


и записи в TXT файл получаем лог:

('вс','00:00:00','23:59:59')
('вт','00:00:00','0,704849537037037')
('вт','0,701388888888889','23:59:59')
('пн','00:00:00','23:59:59')

Что не так ?

Автор: 14SatanA88 16.11.2011, 15:27
Код

weekDay := vartostr(x.activeworkbook.activesheet.Range['A'+IntToStr(i)]);
timeFrom := timetostr(x.activeworkbook.activesheet.Range['B'+IntToStr(i)]);
timeTo := timetostr(x.activeworkbook.activesheet.Range['C'+IntToStr(i)]);

Автор: Данкинг 16.11.2011, 15:29
А что не так-то? Какие значения есть - такие и получились.

Добавлено через 1 минуту и 6 секунд
А, понял. Вообще как вариант - изначально попробовать установить в ячейке нужный формат, т.е. текстовый.

Автор: AVronsky 16.11.2011, 16:09
Цитата(14SatanA88 @ 16.11.2011,  15:27)
Код

weekDay := vartostr(x.activeworkbook.activesheet.Range['A'+IntToStr(i)]);
timeFrom := timetostr(x.activeworkbook.activesheet.Range['B'+IntToStr(i)]);
timeTo := timetostr(x.activeworkbook.activesheet.Range['C'+IntToStr(i)]);

Код

...
var
  x: variant;
begin
  x:=CreateOleObject('Excel.Application');
...


Ошибка:
  "Could not convert variant of type (Dispatch) into type (Double)"

Автор: Данкинг 16.11.2011, 16:31
AVronsky, если у тебя всего 3 столбца, не проще вместо RANGE считать в цикле каждую ячейку?

Автор: AVronsky 16.11.2011, 16:45
Цитата(Данкинг @ 16.11.2011,  16:31)
AVronsky, если у тебя всего 3 столбца, не проще вместо RANGE считать в цикле каждую ячейку?

1. Их далеко не 3
2. Это все равно не снимает проблемы.

Автор: 14SatanA88 16.11.2011, 16:49
AVronsky, с помощью магии и правильного положения звезд у меня все работает
приаттачьте проект и тот самый злополучный файл xls, я посмотрю

Автор: Данкинг 16.11.2011, 17:20
Мне кажется, там в ячейках ссылка / формула стоит, а не значение как таковое.

Автор: 14SatanA88 17.11.2011, 08:11
Цитата(Данкинг @  16.11.2011,  17:20 Найти цитируемый пост)
Мне кажется, там в ячейках ссылка / формула стоит, а не значение как таковое.


я у себя тестовый проект набросал, все нормально было
так что надо бы взгялнуть на проект ТС полностью

Автор: Данкинг 17.11.2011, 09:25
Цитата(14SatanA88 @  17.11.2011,  09:11 Найти цитируемый пост)
я у себя тестовый проект набросал, все нормально было

Ну правильно, я и говорю, что у ТС там вероятно ссылка на что-то указана.

Автор: AVronsky 17.11.2011, 09:47
В связи с тем, что XLS файл размером более 8к строк
ведется и корректируется ручками разными людьми,
за форматом ячеек никто не следит
договорился о смене формата данных в столбце с 00:00:00 на 00|00|00.

В дальнейшем меняю "|" на ":" обратно через StringReplace.
Всем спасибо.

PS:
  Для 14SatanA88 файл прилагаю.
  Для Данкинг - формулы никакой нет


Автор: 14SatanA88 17.11.2011, 12:38
Цитата(AVronsky @  17.11.2011,  09:47 Найти цитируемый пост)
Для 14SatanA88 файл прилагаю

там у вас в разных ячейках разный формат
там где формат текстовый, vartostr забирает в нормальном представлении (например, "23:59:59")
там где формат ячеек указан как общий, функция отдает что-то типа "0,701388888888889"
а timetostr вообще валится из-за несоответствия типов

следующий код решает вашу проблему

Код

    weekDay := vartostr(Excel.activeworkbook.activesheet.Range['C'+IntToStr(i)]);
    try
      timeFrom := timetostr(Excel.activeworkbook.activesheet.Range['D'+IntToStr(i)]);
      timeTo := timetostr(Excel.activeworkbook.activesheet.Range['E'+IntToStr(i)]);
    except
      timeFrom := vartostr(Excel.activeworkbook.activesheet.Range['D'+IntToStr(i)]);
      timeTo := vartostr(Excel.activeworkbook.activesheet.Range['E'+IntToStr(i)]);
    end;

Автор: AVronsky 17.11.2011, 13:51
Спасибо, так работает.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)