Как прочитать значение ячейки Excel через OLE?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как прочитать значение ячейки Excel через OLE?

Сообщение ТёМ » 23.09.2011 15:05:15

Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
var
EA : variant;
WBk: variant;
WS : variant;
c : variant;
begin
  EA := CreateOleObject('Excel.Application');
  ea.Visible := true;
  wbk := ea.Workbooks.open( 'c:\test.xls',
                emptyparam,emptyparam,emptyparam,
                emptyparam,emptyparam,emptyparam,emptyparam,
                emptyparam,emptyparam,emptyparam,emptyparam,
                emptyparam);
   WS := WBk.ActiveSheet;
   WS.Activate;
   try
   Application.MessageBox(pchar(VarToStr(ws.cells.item[1,1].text)),'',0);
  except
   on E:exception do Application.MessageBox(pchar(AnsiToUtf8(e.Message)),'',0);
  end;

   ws := Unassigned;
   ws := null;
   wbk := Unassigned;
   wbk := null;
   ea.quit;
   ea := Unassigned;
   ea := null;
end;

В Дельфи работает.
В Лазарусе:
При ws.cells.item[1,1].text возникает исключение "Недопустимое число параметров".
Если поменять на ws.cells(1,1) - "Член группы не найден"
При этом присваивание ws.cells(1,1) := 'xxx'; - работает.

Короче, как прочитать данные из ячейки?
ТёМ
незнакомец
 
Сообщения: 4
Зарегистрирован: 23.09.2011 14:01:05

Re: Как прочитать значение ячейки Excel через OLE?

Сообщение Sergei I. Gorelkin » 23.09.2011 15:59:59

Нужно брать компилятор из trunk, или из ветки 2.6.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Как прочитать значение ячейки Excel через OLE?

Сообщение sign » 23.09.2011 17:14:08

Я делаю так:
Код: Выделить всё
        S := Excel.Cells[iRow, iCol].Value;  // Читаем значение
        Excel.Cells[iRow, iCol].Value := 'Пишем в ячейку значение';

Код: Выделить всё
implementation
uses comobj, variants, LConvEncoding, strutils;

var Cell, Range, Sheet, Workbook, Excel: variant;

constructor TExcel.Create(aVisible: Boolean = False);
begin
  inherited Create;
  Excel := CreateOleObject('Excel.Application');
  Excel.Visible := aVisible;  // Показывать или скрытно
  Excel.DisplayAlerts := False;  // Подавить всякие сообщения
  Excel.Application.EnableEvents := false; // Подавить всякие сообщения
  Cell     := Unassigned;
  Range    := Unassigned;
  Sheet    := Unassigned;
  Workbook := Unassigned;
end;

destructor TExcel.Destroy;
begin
  inherited Destroy;
  Excel.Application.Quit;  // Чтоб в памяти не болтался EXCEL
  VarClear(Cell);      Cell     := nil;
  VarClear(Range);     Range    := nil;
  VarClear(Sheet);     Sheet    := nil;
  VarClear(Workbook);  Workbook := nil;
  VarClear(Excel);     Excel    := nil;
end;

procedure TExcel.Open(aFileName: String; aEnableEvents: Boolean = False);
begin
  Excel.Workbooks.Open(widestring(UTF8ToCP1251(aFileName)), 0, True);  // У меня файлы в кодировке utf8
  Excel.Application.EnableEvents := aEnableEvents;
end;

  procedure LoadAllExcel;  // Всё загрузить
  var iCol, iRow: Integer;
        S: string;
  begin
    MaxRow := Excel.ActiveSheet.UsedRange.Rows.Count;      // область данных
    MaxCol := Excel.ActiveSheet.UsedRange.Columns.Count;  // область данных
    for iRow := 1 to MaxRow do begin
      for iCol := 1 to MaxCol do begin

        S := Excel.Cells[iRow, iCol].Value;  // Читаем значение
        Excel.Cells[iRow, iCol].Value := 'Пишем в ячейку значение';

      end;
    end;
  end;

или

var RangeMatrix: variant;

      RangeMatrix := Excel.Range[Excel.Cells[3, 2], Excel.Cells[MaxRow, MaxCol]].Value;  // Читаем в двухмерный массив указанный диапазон
      for iRow := 3 to MaxRow do begin
        for iCol := 2 to MaxCol do begin
          S := RangeMatrix[iRow, iCol];
          RangeMatrix[iRow, iCol] := '10';   // Пишем. что хотим
        end;
      end;
      RangeMatrix := Unassigned;

sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru