Уважаемые господа коллеги, если есть желание и возможность посоветуйте плз. где почитать или посмотреть на тему работы под Delphi с офисными приложениями Excell, Word в первую очередь. Может есть публикации или литературка описывающая в доступной форме. А может кто подкинет что. Мне хочется все выходные формы проекта формировать в виде DOC и XLS файлов, поскольку в большинстве своем они нужны не для печати, а для отправки по e-mail, заодно хочется научиться в автомате разбирать входящую почту.
Вот кусок кода (я когда то лепил), разбирайся сам:
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.
Примеры на эту тему лежат в папке Demos/ActiveX
Чё то я не пойму причём тут ЭктивИкс?! ??? Здесь объект ОЛЕ нужен. ОН со стандартными офисными прогр. работает