Delphi and Excel

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Все действия над объектами MSOffice выполняются в Delphi совершенно аналогично VBA.
Только надо учитывать некоторые особенности синтаксиса. Наример
VBA: ...Cells(1,1)
Pascal: ...Cells[1,1]

Для работы с границами используется коллекция Borders

VBA: Ячейка.Borders(xlEdgeBottom).LineStyle = xlContinuous
Pascal: Ячейка.Borders[9].LineStyle=1

Значения констант VBA для нас в Excel.pas никто не прописал, поэтому возьмем VBA выполним макрос

Код: Выделить всё

Sub zzz()
  MsgBox xlEdgeBottom & ", " & xlContinuous
End Sub
Вот откуда взялись 9 и 1
vav1lon
Сообщения: 23
Зарегистрирован: 25 май 2007, 08:20
Откуда: Екатеринбург
Контактная информация:

Такой вопрос
вот я выполняю

Код: Выделить всё

procedure ExportDBGrid(toExcel: Boolean);
var
  bm: TBookmark;
  col, row: Integer;
  sline: string;
  ExcelApp: Variant;
begin
  Form1.Button3.Enabled := false;
  Form1.DBGrid1.DataSource.DataSet.DisableControls;
  bm := Form1.DBGrid1.DataSource.DataSet.GetBookmark;
  Form1.DBGrid1.DataSource.DataSet.First;

  if toExcel then
  begin
    ExcelApp := CreateOleObject('Excel.Application');
    ExcelApp.WorkBooks.Add(xlWBatWorkSheet);
    ExcelApp.WorkBooks[1].WorkSheets[1].name := 'ErrorsDB';
  end;

    Form1.mem.Visible := false;
    Form1.mem.Parent := Form1;
    Form1.mem.Clear;
    sline := '';

  for col := 0 to Form1.DBGrid1.FieldCount-1 do
    sline := sline + Form1.DBGrid1.Fields[col].DisplayLabel + #9;
  Form1.mem.Lines.Add(sline);


  for row := 0 to Form1.DBGrid1.DataSource.DataSet.RecordCount-1 do
  begin
    sline := '';
    for col := 0 to Form1.DBGrid1.FieldCount-1 do
       sline := sline + Form1.DBGrid1.Fields[col].AsString + #9;
    Form1.mem.Lines.Add(sline);
    Form1.DBGrid1.DataSource.DataSet.Next;
  end;

    Form1.mem.SelectAll;
    Form1.mem.CopyToClipboard;

 if toExcel then
  begin
    ExcelApp.Workbooks[1].WorkSheets['ErrorsDB'].Paste;
    ExcelApp.Visible:=true;

  end;

  FreeAndNil(ExcelApp);
  Form1.DBGrid1.DataSource.DataSet.GotoBookmark(bm);
  Form1.DBGrid1.DataSource.DataSet.FreeBookmark(bm);
  Form1.DBGrid1.DataSource.DataSet.EnableControls;

end;
Все выполняется ок. он создает книгу закидывает вне мемо но
- после формирования книги вылетает ошибка ACCESS VIOLATION AT ADDRESS 0040366A IN MODULE MYPROGS.EXE. READ OF ADDRESS 0000009
- после закрытия сформированной книги в через диспетчер задач обнаружил что у меня висит EXECL.EXE хотя я свою книгу закрыл и в трее тоже ничего нету.


Как быть...
Ответить