المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : نقل البيانات من dbgrid إلى Excel


islem2007
11-04-2008, 10:30 PM
كيف يمكنني نقل البانات من dbgrid إلى Excel ؟

merouane
12-04-2008, 08:47 AM
السلام عليكم

في الحقيقة أظنك تقصد من قاعدة البيانات .. لكن لا بأس سنحاول الطريقتين :)

قبل كل شيء كيف نتصل بالبرنامج 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;

أما الباقي فلا يتغير

لإتمام الفهم أرفقت الملف

ملاحظة : لرؤية الفرق بين العمليتين جرب فقط قاعدة البيانات المرفقة

تحياتي :)

سوالف
12-04-2008, 11:31 PM
بارك الله فيك ، مثال جميل جداً .

لدي استفسار بارك الله فيك .. لو اردت مثلا أن يتم التحديث على نفس النموذج sheet على الاكسل بدون أن يقوم البرنامج بفتح نموذج جديد في كل مرة ، ماهو الجزء الذي اقوم بتعديله في الكود ؟

وكذلك مثلا لو تم اغلاق الاكسل اثناء عملية التحديث أين يكون الكود الخاص exception في دلفي ؟

مع شكري الجزيل على مشاركتك وطرح الراقي.

أطيب التحية

سوالف

merouane
13-04-2008, 02:12 AM
و فيك بركة

أولا أحب أن أوضح أن الشرح السابق ليس متكاملا و إنما هو إجابة حسب السؤال.

لدي استفسار بارك الله فيك .. لو اردت مثلا أن يتم التحديث على نفس النموذج sheet على الاكسل بدون أن يقوم البرنامج بفتح نموذج جديد في كل مرة ، ماهو الجزء الذي اقوم بتعديله في الكود ؟

بكل بساطة لا نستدعي ExcelApplication1.Disconnect إلا عندما نريد (مثلا نضعها في OnClose للفورم أو لجدول قاعدة البيانات حسب المبرمج)

(في رأيي) من الأحسن أن لا نصدر البيانات إلا بعد الإنتهاء. لأنه قد يربك المستعمل.

بالنسبة للتحديث لم أفهم ، هل فقط الشكل أم المحتوى ؟؟

الشكل لا يحتاج إلى شرح مثل مل ذكر شابقا

//في مايلي عبارة عن تلوين الخانات وتغيير الخط ...
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;

أما المحتوى:

علمنا من الشرح أنه

Feuil.Range[ 'A'i , 'A'i ].Value[xlRangeValueDefault] = Table1.Fields.Fields[ i+1 ].AsString

هذا إذا علمنا أي الخانات في قاعدة البيانات غيرنا

أو يمكن إعادة العملية من جديد، و التعديل هو لا نتصل ببرنامج Excel بعد الضغط على زر Export وإنما نجعله - مثلا - بعد فتح قاعدة البيانات

procedure TForm1.Table1AfterOpen(DataSet: TDataSet);
begin
ExcelApplication1.Connect;
ExcelApplication1.Visible[0]:=False;
Tab:=ExcelApplication1.Workbooks.Add(xlWBATWorkshe et,0);
feuil:=Tab.Worksheets[1] as _worksheet;
end;

هكذا نحتفظ باتصال واحد حتى نهاية التطبيق.

وكذلك مثلا لو تم اغلاق الاكسل اثناء عملية التحديث أين يكون الكود الخاص exception في دلفي ؟

كما قلت أولا : من الأحسن أن لا نصدر إلا البيانات الجاهزة للتصدير.

لكن إذا صادفنا مثل هذا المشكل (مثل تطبيق لتحرير جداول في الوقت الحقيقي - أي المستعمل يرى النتيجة آنيا) يمكن استعمال Try ..Exception في طرفي أي عملية مباشرة الاتصال.

في المثال:

procedure TForm1.Table1AfterOpen(DataSet: TDataSet);
begin
Try
ExcelApplication1.Connect;
ExcelApplication1.Visible[0]:=False;
Tab:=ExcelApplication1.Workbooks.Add(xlWBATWorkshe et,0);
feuil:=Tab.Worksheets[1] as _worksheet;
except
on E: Exception do MessageDlg(E.Message,mtError,[mbOK], E.HelpContext);
end;

end;


عند التصدير (من DBGrid)

Try
Try
ExcelApplication1.Visible[0]:=true;
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;

j:=2;
Table1.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;
Finally
ExcelApplication1.Cells.Select;
ExcelApplication1.Columns.AutoFit;
ExcelApplication1.Range['A1','A1'].Select;
End;
Except
on E: Exception do MessageDlg(E.Message,mtError,[mbOK], E.HelpContext);
End;

آمل أنني أجبت ، وإذا أي استفتارات أخرى فمرحبا اجيب انا أو غيري لا فرق

كما أن هذه الحلول لا تصلح لنقلها مباشرة للبرنامج. وإنما توضح الوسيلة فقط.، ربما في المستقبل سيكون لنا لقاء ببرنامج من هذه النوعية.

في الأخير ليس إلا حل أراه ، وكل من لديه حل أحسن فليقدمه وسـأكون من الشاكرين

ما الفائدة إذا لم نتبادل الخبرات

تحياتي :)

cygnux
07-04-2009, 07:17 PM
شكرا لك اخي الكريم على هذه التوضيحات

minou00
15-05-2009, 10:05 AM
بارك الله فيك على هذا المجهود التي تبذله

SOSS_3
13-09-2009, 08:31 PM
عمل رائع مشكورر

ais1969
14-11-2009, 09:50 AM
انا عضو جديد في هذا المنتدى وانا هاوي و ان شاء الله اصل لدرجة الاحترف
فجزاكم الله عن هذه الدروس وبارك الله فيكم

yazidsat
17-01-2010, 07:31 PM
بارك الله فيك دروس رائعة شكرا

chehrour
30-01-2010, 10:16 AM
شكرا على الموضوع وجزاك الله خيرا

الدليل
16-02-2010, 07:44 AM
رائع ........
ومشكور على هذه المعلومات القيمة والشرح الواضح

mourad123
02-03-2010, 11:01 AM
سلام عليكم
شكر على عمل المتقن


لدي سؤال
هل ممكن ان نقل البيانات من
Excel إلى dbgrid او table
شكرو سلام عليكم