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


Автор: Jonnik 21.3.2011, 12:05
Здравствуйте.
Вот мой исходник чтения с Excel
Код

 Excel:=CreateOleObject('Excel.Application');
      Excel.Visible:=false;
      Excel.WorkBooks.Open(Form1.OpenDialog1.FileName);
      sleep(500);
      k:=1;
      n:=1;
      ListBox1.Clear;
      while k<5 do
        begin
          s:=Excel.Cells[1,n];
          if s<>'' then
            begin
              ListBox1.Items.Add(s);
              sstolb[n]:=s;
              Inc(n);
            end
          else
            begin
              inc(k);
              Inc(n);
            end;
        end;
      Excel.Quit;

Все работает нормально, но есть один недостаток.
Если во время чтения из экселя я открою другой файл экселя в ручную, то программа начинает читать данный уже с открытого мною файла. Т.е. программа сама переключается между файлами эксель. 
Как я понимаю это все происходит из-за того, что чтение происходит из активного листа в данный момент времени. И когда я открываю другой файл, то естественно меняется текущий активный лист. Поэтому и программа начинает читать данные из другого файла.
Как решить эту проблему?

Автор: Данкинг 21.3.2011, 18:18
Цитата(Jonnik @  21.3.2011,  12:05 Найти цитируемый пост)
Если во время чтения из экселя я открою другой файл экселя в ручную, 

Нельзя при создании Excel-объекта открывать параллельно Excel.

Автор: cat512 22.3.2011, 00:54
Цитата(Данкинг @ 21.3.2011,  18:18)
Цитата(Jonnik @  21.3.2011,  12:05 Найти цитируемый пост)
Если во время чтения из экселя я открою другой файл экселя в ручную, 

Нельзя при создании Excel-объекта открывать параллельно Excel.

Данкинг,  а собсно кто запрещает?

Автор: Данкинг 22.3.2011, 01:14
Цитата(cat512 @  22.3.2011,  00:54 Найти цитируемый пост)
а собсно кто запрещает? 

Запрещает вероятность глюков, которые мы видим и в данном примере.

Автор: Jonnik 22.3.2011, 17:54
Понятно. Значит вариантов нет. А жаль.

Автор: Fanatik 24.3.2011, 08:25
Попробовать так

Код

var
    XLApp, wb, Sheet : OleVariant;

      Excel:=CreateOleObject('Excel.Application');
      Excel.Visible:=false;
      wb := Excel.WorkBooks.Open(Form1.OpenDialog1.FileName);
      Sheet := wb.WorkSheets[1];
      Sheet.Activate; --не обязательно
      sleep(500);
      k:=1;
      n:=1;
      ListBox1.Clear;
      while k<5 do
        begin
          s:=Sheet.Cells[1,n];
          if s<>'' then
            begin
              ListBox1.Items.Add(s);
              sstolb[n]:=s;
              Inc(n);
            end
          else
            begin
              inc(k);
              Inc(n);
            end;
        end;
      Excel.Quit;
excel := unassigned;


Автор: Albinos_x 7.5.2011, 14:49
Я писал об этом в своей статье.
Старайтесь избегать обращений через объекты excel (типа обращений к активной книге или листу, это касается и ворда), старайтесь сразу создавать объект который привязывать к книге или если работаете только с листом, то к листу.
И работать уже через этот объект.

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