merouane
11-04-2008, 11:30 PM
كيف يمكنني نقل البانات من قاعدة بيانات إلى Excel ؟
قبل كل شيء كيف نتصل بالبرنامج EXcel
بكل بساطة عبر المكون TExcelApplication الموجود في الطرف Servers أو Serveurs (النسخة الفرنسية)
خلال عملنا سيكون لدينا
Table1: TTable;
DataSource1: TDataSource;
DBGird1: TDBGrid;
ExcelApplication1: TExcelApplication
السطرين الأتيين يضافان برمجيا
Tab: _workbook;
Fuil: _worksheet
وللعلم خانات Excel تدعى [ Range[ i, j حيث i و j عبارة عن مكان الخانة مثل A1، b3
تملء بواسطة دلفي :
Feuil.Range[A1,A1].Value[xlRangeValueDefault] :='Text to insert';
xlRangeValueDefault : (عبارة عن RangeValueDataType التي تعبر عن نوع المعطيات) ترجع Empty إذا كانت الخانة المعنية فارغة، وإذا Range أخذت أكثر من خانة فيرجع جدول من القيم.
راجع موقع ميكروسوفت http://msdn2.microsoft.com/fr-fr/library/microsoft.office.tools.excel.namedrange.value(VS.8 0).aspx
أولا من DBGrid :
للعمل مع DBGrid يجب أن ننتبه إلى أمرين عنوان و المحتوى
نبدا بالعنوان :
لكي أستطيع استعمال حلقة (لأن كمية المعلومات غير معلومة) سأستعمل جدول يحتوي على الحروف من A حتى Z
var
Form1: TForm1;
a:array [1..26]of string[1]=('A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','u','V','W','X','Y ','Z');
لا ننسى أن نتصل بالبرنامج Excel
var Tab: _workbook;
Feuil: _worksheet;
i,j:Integer; //تسعمل لاحقا j
S:shortstring;//أيضا سنراها لاحقا
begin
ExcelApplication1.Connect;
ExcelApplication1.Visible[0]:=False;
Tab:=ExcelApplication1.Workbooks.Add(xlWBATWorkshe et,0);
ExcelApplication1.Visible[0]:=true;
feuil:=Tab.Worksheets[1] as _worksheet;
بعدها نقوم بالآتي:
For i:=0 to DBGrid1.Columns.Count-1 do begin
with Feuil.Range[A[i+1]+'1',A[i+1]+'1'] do begin
Value[xlRangeValueDefault]:= DBGrid1.Columns.Items[i].Title.Caption;
//في مايلي عبارة عن تلوين الخانات وتغيير الخط ...
Font.Name:='times new roman';
Font.Size:=10;
Font.Bold:=True;
With Interior do begin
ColorIndex := 15;
Pattern := xlSolid;
PatternColorIndex := xlAutomatic;
End;
With Borders do begin
LineStyle := xlContinuous;
Weight := xlThin;
ColorIndex := xlAutomatic;
End;
end;
end;
الآن ننتقل إلى محتوى DBGrid :
j:=2;
// نوقف إظهار التغييرات و الانتقالات
TableTemp.DisableControls;
Table1.First;
While not Table1.Eof do begin
For i:= 1 To DBGrid1.Columns.Count Do
begin
s:=A[i]+inttostr(j);
Feuil.Range[s,s].Value[xlRangeValueDefault] :=DBGrid1.Fields[i-1].AsString;
end;
Table1.Next;
j:=j+1;
end;
إذا لاحظت لقد أظهرنا ملف Excel قبل العملية ExcelApplication1.Visible[0]:=true
أي سترى الجدول يمتلء بالبيانات ، أما إذا أردت إخفاء عملية الملء عن المستعمل فقط لا تستدعي الإظهار قبل الانتهاء.
الآن لم يبقى أي شيء مهم، فقط إذا أردت تعديل الخطوط والمساحة
مثلا عند انتهاء العملية سنقوم بالتعديل على طول الخانات للتتناسب و المحتوى
ExcelApplication1.Cells.Select;
ExcelApplication1.Columns.AutoFit;
ExcelApplication1.Range['A1','A1'].Select;
ثم إغلاق الإتصال مع الملف
ExcelApplication1.Disconnect
ثانيا مباشرة من قاعدة البيانات:
هنا ليس لدينا عناوين وإنما أسماء الحقول
For i:=0 to Table1.FieldCount-1 do begin
with Feuil.Range[A[i+1]+'1',A[i+1]+'1'] do begin
Value[xlRangeValueDefault]:= Table1.Fields.Fields[i].FieldName; // الخانة تأخذ اسم الحقل
Font.Name:='times new roman';
Font.Size:=10;
Font.Bold:=True;
With Interior do begin
ColorIndex := 15;
Pattern := xlSolid;
PatternColorIndex := xlAutomatic;
End;
With Borders do begin
LineStyle := xlContinuous;
Weight := xlThin;
ColorIndex := xlAutomatic;
End;
end;
end;
أما بالنسبة للمحتوى فنقوم بالأتي:
j:=2;
Table1.First;
While not Table1.Eof do begin
For i:= 1 To Table1.FieldCount Do
begin
s:=A[i]+inttostr(j);
Feuil.Range[s,s].Value[xlRangeValueDefault] :=Table1.Fields.Fields[i-1].AsString;
end;
Table1.Next;
j:=j+1;
end;
أما الباقي فلا يتغير
لإتمام الفهم أرفقت الملف
ملاحظة : لرؤية الفرق بين العمليتين جرب فقط قاعدة البيانات المرفقة
تحياتي :)[/COLOR]
قبل كل شيء كيف نتصل بالبرنامج EXcel
بكل بساطة عبر المكون TExcelApplication الموجود في الطرف Servers أو Serveurs (النسخة الفرنسية)
خلال عملنا سيكون لدينا
Table1: TTable;
DataSource1: TDataSource;
DBGird1: TDBGrid;
ExcelApplication1: TExcelApplication
السطرين الأتيين يضافان برمجيا
Tab: _workbook;
Fuil: _worksheet
وللعلم خانات Excel تدعى [ Range[ i, j حيث i و j عبارة عن مكان الخانة مثل A1، b3
تملء بواسطة دلفي :
Feuil.Range[A1,A1].Value[xlRangeValueDefault] :='Text to insert';
xlRangeValueDefault : (عبارة عن RangeValueDataType التي تعبر عن نوع المعطيات) ترجع Empty إذا كانت الخانة المعنية فارغة، وإذا Range أخذت أكثر من خانة فيرجع جدول من القيم.
راجع موقع ميكروسوفت http://msdn2.microsoft.com/fr-fr/library/microsoft.office.tools.excel.namedrange.value(VS.8 0).aspx
أولا من DBGrid :
للعمل مع DBGrid يجب أن ننتبه إلى أمرين عنوان و المحتوى
نبدا بالعنوان :
لكي أستطيع استعمال حلقة (لأن كمية المعلومات غير معلومة) سأستعمل جدول يحتوي على الحروف من A حتى Z
var
Form1: TForm1;
a:array [1..26]of string[1]=('A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','u','V','W','X','Y ','Z');
لا ننسى أن نتصل بالبرنامج Excel
var Tab: _workbook;
Feuil: _worksheet;
i,j:Integer; //تسعمل لاحقا j
S:shortstring;//أيضا سنراها لاحقا
begin
ExcelApplication1.Connect;
ExcelApplication1.Visible[0]:=False;
Tab:=ExcelApplication1.Workbooks.Add(xlWBATWorkshe et,0);
ExcelApplication1.Visible[0]:=true;
feuil:=Tab.Worksheets[1] as _worksheet;
بعدها نقوم بالآتي:
For i:=0 to DBGrid1.Columns.Count-1 do begin
with Feuil.Range[A[i+1]+'1',A[i+1]+'1'] do begin
Value[xlRangeValueDefault]:= DBGrid1.Columns.Items[i].Title.Caption;
//في مايلي عبارة عن تلوين الخانات وتغيير الخط ...
Font.Name:='times new roman';
Font.Size:=10;
Font.Bold:=True;
With Interior do begin
ColorIndex := 15;
Pattern := xlSolid;
PatternColorIndex := xlAutomatic;
End;
With Borders do begin
LineStyle := xlContinuous;
Weight := xlThin;
ColorIndex := xlAutomatic;
End;
end;
end;
الآن ننتقل إلى محتوى DBGrid :
j:=2;
// نوقف إظهار التغييرات و الانتقالات
TableTemp.DisableControls;
Table1.First;
While not Table1.Eof do begin
For i:= 1 To DBGrid1.Columns.Count Do
begin
s:=A[i]+inttostr(j);
Feuil.Range[s,s].Value[xlRangeValueDefault] :=DBGrid1.Fields[i-1].AsString;
end;
Table1.Next;
j:=j+1;
end;
إذا لاحظت لقد أظهرنا ملف Excel قبل العملية ExcelApplication1.Visible[0]:=true
أي سترى الجدول يمتلء بالبيانات ، أما إذا أردت إخفاء عملية الملء عن المستعمل فقط لا تستدعي الإظهار قبل الانتهاء.
الآن لم يبقى أي شيء مهم، فقط إذا أردت تعديل الخطوط والمساحة
مثلا عند انتهاء العملية سنقوم بالتعديل على طول الخانات للتتناسب و المحتوى
ExcelApplication1.Cells.Select;
ExcelApplication1.Columns.AutoFit;
ExcelApplication1.Range['A1','A1'].Select;
ثم إغلاق الإتصال مع الملف
ExcelApplication1.Disconnect
ثانيا مباشرة من قاعدة البيانات:
هنا ليس لدينا عناوين وإنما أسماء الحقول
For i:=0 to Table1.FieldCount-1 do begin
with Feuil.Range[A[i+1]+'1',A[i+1]+'1'] do begin
Value[xlRangeValueDefault]:= Table1.Fields.Fields[i].FieldName; // الخانة تأخذ اسم الحقل
Font.Name:='times new roman';
Font.Size:=10;
Font.Bold:=True;
With Interior do begin
ColorIndex := 15;
Pattern := xlSolid;
PatternColorIndex := xlAutomatic;
End;
With Borders do begin
LineStyle := xlContinuous;
Weight := xlThin;
ColorIndex := xlAutomatic;
End;
end;
end;
أما بالنسبة للمحتوى فنقوم بالأتي:
j:=2;
Table1.First;
While not Table1.Eof do begin
For i:= 1 To Table1.FieldCount Do
begin
s:=A[i]+inttostr(j);
Feuil.Range[s,s].Value[xlRangeValueDefault] :=Table1.Fields.Fields[i-1].AsString;
end;
Table1.Next;
j:=j+1;
end;
أما الباقي فلا يتغير
لإتمام الفهم أرفقت الملف
ملاحظة : لرؤية الفرق بين العمليتين جرب فقط قاعدة البيانات المرفقة
تحياتي :)[/COLOR]