Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с офисными компанентами
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
C2H5OH
Уважаемые господа коллеги, если есть желание и возможность посоветуйте плз. где почитать или посмотреть на тему работы под Delphi с офисными приложениями Excell, Word в первую очередь. Может есть публикации или литературка описывающая в доступной форме. А может кто подкинет что. Мне хочется все выходные формы проекта формировать в виде DOC и XLS файлов, поскольку в большинстве своем они нужны не для печати, а для отправки по e-mail, заодно хочется научиться в автомате разбирать входящую почту.
mj
Вот кусок кода (я когда то лепил), разбирайся сам:
unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleServer, Excel97, StdCtrls, ComCtrls, CheckLst, ExtCtrls;

type
  TInfForm4 = record
    List: String;
    Count: Integer;
    Data: array of record
      Name: String;
      Shift: String;
      Policlenik: Integer;
      New: Integer;
      SetDiagn: Integer;
      DataObr: TDateTime;
    end;
  end;

  TForm4 = class(TForm)
    EA: TExcelApplication;
    CheckListBox1: TCheckListBox;
    MonthCalendar1: TMonthCalendar;
    MonthCalendar2: TMonthCalendar;
    Button1: TButton;
    Button2: TButton;
    ComboBox1: TComboBox;
    ComboBox2: TComboBox;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
  private
  public
    Data: TInfForm4;
  end;

procedure ShowForm4(Info: TInfForm4);
function IndexToStr(X, Y: Integer): String;

var
  ZeroPos: record
    X, Y: Integer;
  end;


implementation

{$R *.dfm}

function IndexToStr(X, Y: Integer): String;
var
  E: String;
begin
  Inc(X, ZeroPos.X);
  Inc(Y, ZeroPos.Y);
  if X>26 then
    Result := Char(Byte((X-1) div 26+64))
  else
    Result := '';
  Result := Result+Char(Byte((X-1) mod 26+65))+IntToStr(Y);
  E := Result;
  Result := E;
end;

procedure ShowForm4(Info: TInfForm4);
var
  Form4: TForm4;
  ST: TSystemTime;
  F: Integer;
begin
 Form4 := TForm4.Create(Application);
 try
   Form4.Data := Info;
   Form4.CheckListBox1.Items.Text := Info.List;
   for F := 0 to Form4.CheckListBox1.Items.Count-1 do
     Form4.CheckListBox1.Checked[F] := True;
   GetLocalTime(ST);
   Form4.MonthCalendar2.Date := SystemTimeToDateTime(ST);
   St.wMonth := 1;
   St.wDay := 1;
   Form4.ComboBox1.ItemIndex := 2;
   Form4.ComboBox2.ItemIndex := 4;
   Form4.MonthCalendar1.Date := SystemTimeToDateTime(ST);
   Form4.ShowModal;
 finally
   Form4.Free;
 end;
end;

procedure TForm4.Button1Click(Sender: TObject);
var
  F, F1, F2: Integer;
  List: array of record
    Shifr: String;
    P: array of record
      Vperv, Sost: Integer;
      PVperv, PSost: Byte;
    end;
    Vperv, Sost: Integer;
  end;
  S, S1, S2: String;
  Date2001: TDateTime;
  CCount: Integer;

  function ShifrToIndex(S: String): Integer;
  var
    F: Integer;
  begin
    Result := Length(List)-1;
    for F := 0 to Length(List)-2 do
      if AnsiLowerCase(List[F].Shifr)=AnsiLowerCase(S) then
        Result := F;
  end;

begin
  try
    EA.Connect;
  except
    ShowMessage('Невозможно присоединится к Excel''ю');
    Exit;
  end;
  EA.Visible[0] := True;
  Panel1.Visible := True;
  Panel1.Caption := 'Загрузка данных';
  Panel1.Refresh;
  ZeroPos.X := ComboBox1.ItemIndex+1;
  ZeroPos.Y := ComboBox2.ItemIndex+1;
  F := 0;
  try
    EA.Range[IndexToStr(0, 0), IndexToStr(0, 0)].Formula
  except
    EA.FindFile;
    EA.ActiveWindow.Activate;
    EA.Visible[0] := True;
    try
      EA.Range[IndexToStr(0, 0), IndexToStr(0, 0)].Formula
    except
      ShowMessage('Невозможно присоединится к книге Excel''я');
      Panel1.Visible := False;
      Exit;
    end;
    ShowMessage('Выбирете нужный лист книги Excel''я');
  end;
  try
    while EA.Range[IndexToStr(0, F), IndexToStr(0, F)].Formula<>'' do
    begin
      SetLength(List, F+1);
      List[F].Shifr := EA.Range[IndexToStr(0, F), IndexToStr(0, F)].Formula;
      SetLength(List[F].P, Data.Count);
      Inc(F);
    end;
  except
    ShowMessage('Ошибка чтения книги Excel''я');
    Panel1.Visible := False;
    Exit;
  end;
  SetLength(List, F+1);
  SetLength(List[F].P, Data.Count);
  Panel1.Caption := 'Сортировка';
  Panel1.Refresh;
  Date2001 := StrToDate('1.1.2001');
  for F := 0 to Length(Data.Data)-1 do
  begin
    F1 := Data.Data[F].Policlenik;
    if F1<0 then
      F1 := 0;
    if CheckListBox1.Checked[F1] then
    begin
      F2 := ShifrToIndex(Data.Data[F].Shift);
      if ClassName='TForm4' then
       if (Data.Data[F].DataObr>=MonthCalendar1.Date) and
         (Data.Data[F].DataObr<=MonthCalendar2.Date) and
         (Data.Data[F].New<2) and (Data.Data[F].SetDiagn=1) then
       begin
         Inc(List[F2].Vperv);
         Inc(List[F2].P[F1].Vperv);
       end;
      if ClassName='TForm5' then
       if (Data.Data[F].DataObr>=MonthCalendar1.Date) and
         (Data.Data[F].DataObr<=MonthCalendar2.Date) and
         (Data.Data[F].New=1) then
       begin
         Inc(List[F2].Vperv);
         Inc(List[F2].P[F1].Vperv);
       end;
      if ((Data.Data[F].DataObr<=MonthCalendar2.Date) and
        (Data.Data[F].New=1)) or ((Data.Data[F].DataObr<Date2001) and
        (Data.Data[F].New<>3)) then
      begin
        Inc(List[F2].Sost);
        Inc(List[F2].P[F1].Sost);
      end;
    end;
  end;
  try
    CCount := 0;
    for F := 0 to CheckListBox1.Items.Count-1 do
      if CheckListBox1.Checked[F] then
        Inc(CCount);
    for F1 := 0 to Length(List)-1 do
    begin
      S1 := '=';
      S2 := '=';
      F := -1;
      for F2 := 0 to Data.Count-1 do
        if CheckListBox1.Checked[F2] then
        begin
          Inc(F);
          S1 := S1+IndexToStr(F*4+1, F1)+'+';
          S2 := S2+IndexToStr(F*4+3, F1)+'+';
          EA.Range[IndexToStr(F*4+1, F1), IndexToStr(F*4+1, F1)].FormulaLocal := List[F1].P[F2].Vperv;
          EA.Range[IndexToStr(F*4+2, F1), IndexToStr(F*4+2, F1)].FormulaLocal := 
  '=ЕСЛИ(И('+IndexToStr(F*4+1, F1)+'>0; '+IndexToStr(CCount*4+1, F1)+'>0); ЦЕЛОЕ('+
  IndexToStr(F*4+1, F1)+'*100/'+IndexToStr(CCount*4+1, F1)+'*10)/10; "-")';
          EA.Range[IndexToStr(F*4+3, F1), IndexToStr(F*4+3, F1)].FormulaLocal := List[F1].P[F2].Sost;
          EA.Range[IndexToStr(F*4+4, F1), IndexToStr(F*4+4, F1)].FormulaLocal :=
  '=ЕСЛИ(И('+IndexToStr(F*4+3, F1)+'>0; '+IndexToStr(CCount*4+2, F1)+'>0); ЦЕЛОЕ('+
  IndexToStr(F*4+3, F1)+'*100/'+IndexToStr(CCount*4+2, F1)+'*10)/10; "-")';
        end;
      SetLength(S1, Length(S1)-1);
      SetLength(S2, Length(S2)-1);
      EA.Range[IndexToStr(F*4+5, F1), IndexToStr(F*4+5, F1)].FormulaLocal := S1;
      EA.Range[IndexToStr(F*4+6, F1), IndexToStr(F*4+6, F1)].FormulaLocal := S2;
      if EA.Range[IndexToStr(F*4+5, F1), IndexToStr(F*4+5, F1)].Text<>List[F1].Vperv then
        ShowMessage('Ощибки в вычислениях:'#13'Ячейка: '+IndexToStr(F*4+5, F1)+
  #13'Должно быть: '+IntToStr(List[F1].Vperv)+#13'Содержится: '+
  IntToStr(EA.Range[IndexToStr(F*4+5, F1), IndexToStr(F*4+5, F1)].Text));
      if EA.Range[IndexToStr(F*4+6, F1), IndexToStr(F*4+6, F1)].Text<>List[F1].Sost then
        ShowMessage('Ощибки в вычислениях:'#13'Ячейка: '+IndexToStr(F*4+6, F1)+
  #13'Должно быть: '+IntToStr(List[F1].Sost)+#13'Содержится: '+
  IntToStr(EA.Range[IndexToStr(F*4+6, F1), IndexToStr(F*4+6, F1)].Text));
      Panel1.Caption := 'Вставка (завершено '+IntToStr(F1*100 div (Length(List)-1))+'%)';
      Panel1.Refresh;
    end;
  except
    Panel1.Visible := False;
    ShowMessage('Произошла ошибка синхронизации таблици!'#13'Замечено изменение таблици...');
  end;
  Panel1.Visible := False;
  EA.Disconnect;
end;

end.
mj
Примеры на эту тему лежат в папке Demos/ActiveX
Forsag
Чё то я не пойму причём тут ЭктивИкс?! ??? Здесь объект ОЛЕ нужен. ОН со стандартными офисными прогр. работает
mj
Цитата
Чё то я не пойму причём тут ЭктивИкс?! ??? Здесь объект ОЛЕ нужен. ОН со стандартными офисными прогр. работает

Второе предупреждение!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.