چطور می شه اطلاعات sql server رو تو دلفی مشاهده کرد و بعد به excel فرستاد چه componet هایی نیازه.
چطور می شه اطلاعات sql server رو تو دلفی مشاهده کرد و بعد به excel فرستاد چه componet هایی نیازه.
سلام
برای اتصال با بانک و مشاهده اطلاعات می تونید درباره ado, data access,data control در سایت جستجو نمایید.و برای ارسال اطلاعات به اکسل هم میتونید از کامپوننت های max استفاده نمایید.برای مشاهده اینجا کلیک کنید.دو کامپوننت TmxExports و TmxNativeExcel داده های شما را از dataset و dbgrid و.... به word و excel و.... منتقل میکند.
سلام
کامپوننت نمیدونم داره یا نه. ولی من کدشو نوشتم. اگه بخوای بهت میدم
شرمنده من سرعتم پایینه. هرکاری میکنم کد آپ نمیشه.
سعی می کنم ظرف یکی دو روز برات آپ کنم.
سلام
من خودم هم همین سوال را داشتم که یه کامپوننت بهم معرفی کردند که بسیا ر هم عالی به اکسل export می کنه
اسمش را دقیقا یادم نیست ولی یه سرچی تو سایت بزنی پیداش مکنی
میتونید از کامپوننت EMS Export یا Advanced Export Component استفاده کنید
سلام
این کدی هست که من نوشتم:
procedure ExportToExcel(ADO: TADOTable; ExcelApp: TExcelApplication);این یه پرویسجره که فایل پارامترهای ورودیش نام جدوله از نوع ADOTable تعریف کردم. اگه بخواید می تونید اونو از نوع ADOQuery تعریف کنید.
var
Template: OleVariant;
S: String;
CRec, CField: Integer;
begin{1}
Template := 'C:\Template.xlt';
with ExcelApp do
begin{2}
Connect;
Caption := 'Export';
Workbooks.Add(Template, 0);
ADO.First;
for CField := 0 to ADO.FieldCount - 1 do
begin{3}
S := ADO.Fields[CField].DisplayLabel;
Range[char(CField+65) + '1',char(CField+65) + '1'].Select;
ActiveCell.FormulaR1C1 := S;
end;{4}
for CRec := 1 to ADO.RecordCount do
begin{5}
for CField := 0 to ADO.FieldCount - 1 do
begin{6}
S := ADO.Fields[CField].AsString;
Range[char(CField+65)+ IntToStr(CRec+1),char(CField+65)+ IntToStr(CRec+1)].Select;
ActiveCell.FormulaR1C1 := S;
end;{6}
ADO.Next;
end;{5}
Cells.Select;
Cells.EntireColumn.AutoFit;
Cells.EntireRow.AutoFit;
Range['A1','A1'].Select;
end;{2}
end;{1}
اگه خواستید از نوع کوئری تعریف کنید این رو به جای خط اول بذارید:
procedure ExportToExcel(ADO: TADOQuery; ExcelApp: TExcelApplication);راستی یکی دیگه از ورودی هاش ExcelApp هست که باید یه دونه ExcelApplication از پانل Servers انتخاب کنید و روی فرم بذارید. بعد اسم اونو به عنوان پارامتر ارسال کنید به پروسیجر.
نحوه استفاده:
ExportToExcel(QueryOrTableName, ExcelApplication1);ایشالا که به دردتون بخوره.[/quote]
یه نکته دیگه:
باید یه فایل تمپلیت اکسل به اسم Template.xlt تو مسیر C:\ بسازید. کدی که من نوشتم میاد این فایل رو باز می کنه و یه New ازش می گیره و اطلاعات رو اونجا میریزه.
برای ساختن این فایل برنامه اکسل رو باز کنید و یه قالب طراحی کرده و اون رو Save Az کنید. موقع Save Az کردن از اون پایین فرمت Temlate رو انتخاب کنید.
آخرین ویرایش به وسیله پرواز : چهارشنبه 07 شهریور 1386 در 13:17 عصر دلیل: نحوه ساختن تمپليت رو فراموش كرده بودم توضيح بدم
آقا من یه دونه اصلاحیه نوشتم!!!
در پست قبلی همون طور که می بینید احتیاج به قرار دادن ExcelApplication روی فرم وجود داره. این ممکنه یه کم دست و پا گیر باشه.
این مشکل با ساختن این آبجکت در زمان اجرا حل شد.
سورس این برنامه اصلاح شده رو میذارم. بقیه چیزاش مثل همون برنامه قبلیه.
اگه دوستان اشکالی می بینن یا نکته ای برای بهتر شدن کار دارن لطفا بیان کنن.
البته این نکته هم ناگفته نمونه که همونطور که آقای احدی و بقیه دوستان یادآوری کردن کامپوننت های زیادی برای این کار وجود داره. ولی خیلی وقتا داشتن یه سورس کوچیک بهتر از کامپوننته.
uses ComObj;
procedure ExportToExcel(ADO: TADOTable);
var
Template: OleVariant;
ExcelApp: OleVariant;
S: String;
CRec, CField: Integer;
begin{1}
// Template := 'Z:\Talie\Template.xlt';
Template := 'C:\Template.xlt';
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Caption := 'Export';
ExcelApp.Workbooks.Add(Template);
ADO.First;
for CField := 0 to ADO.FieldCount - 1 do
begin{3}
S := ADO.Fields[CField].DisplayLabel;
ExcelApp.Range[char(CField+65) + '1',char(CField+65) + '1'].Select;
ExcelApp.ActiveCell.FormulaR1C1 := S;
end;{3}
for CRec := 1 to ADO.RecordCount do
begin{4}
for CField := 0 to ADO.FieldCount - 1 do
begin{5}
S := ADO.Fields[CField].AsString;
ExcelApp.Range[char(CField+65)+ IntToStr(CRec+1),char(CField+65)+ IntToStr(CRec+1)].Select;
ExcelApp.ActiveCell.FormulaR1C1 := S;
end;{5}
ADO.Next;
end;{4}
ExcelApp.Cells.Select;
ExcelApp.Cells.EntireColumn.AutoFit;
ExcelApp.Cells.EntireRow.AutoFit;
ExcelApp.Range['A1','A1'].Select;
ExcelApp.Visible := True;
end;{1}
اگه نکته ای هست دوستان حتما مطرح کنند.
سوالی هم داشتین بپرسین.
موفق باشید.
آخرین ویرایش به وسیله پرواز : سه شنبه 20 شهریور 1386 در 08:29 صبح دلیل: اضافه كردن uses به كد
جناب پرواز
اگر امکان داره همین کد را بصورت یک مثال (سورس) بنویس
موفق و پایدار باشی
سلام.
اینم یه سورس برای انتقال یک Table از بانک به اکسل.
البته یه کم دیگه امکانات بهش اضافه کردم.
اولا که برای تابع ExportToExcel توضیح فارسی (کامنت) گذاشتم که فهمش آسون بشه.
ثانیاً امکان انتخاب فیلد و تعیین شرط برای فیلد های قابل نمایش اضافه شد.
برای این کار اومدم از دستورات SQL استفاده کردم. سه تا Memo رو فرم اصلی داریم که اولی برای مقدار Select - دومی برای From و سومی برای Where می باشد.
اینو گذاشتم که برنامه نویسای محترم بتونن هرجور که خواستن تو برنامشون استفاده کنن. (به جای Memo می تونید از یه متغییر استفاده کنید و مقدار رو توی اون ذخیره کنید).
یه فرم دیگه هم طراحی کردم که توی اون میتونید فیلدهای مورد نظر خودتون رو انتخاب کنید و به طور اتوماتیک به Select اضافه کنید.
نکته قابل توجه توی این برنامه اینه که شما برای انتقال به اکسل نام اصلی فیلد رو انتقال نمیدهید. اون چیزی که انتقال پیدا می کنه DisplayLabel هر فیلده که میتونه فارسی باشه.
در ضمن پس از انتقال به اکسل برنامه اندازه همه Cell های اکسل رو تنظیم می کنه که هیچ کدوم از نوشته های درون Cell ها مخفی نمونه و یا جای اضافی نگرفته باشه.
البته مسلما سورس رو ببینید خودتون متوجه میشید. اینا رو گفتم که نخواید خیلی دنبالش بگردید.
از همه شما دوستان می خوام که مشکلات و کمبودهاش رو گوشزد کنید و اگه امکانات جالب دیگه ای هم به ذهنتون می رسه بهش اضافه کنید و همینجا آپ کنید.
اگه سؤال خاصی هم دارید مطرح کنید.
امیدوارم که بدردتون بخوره (هر چند امکانات ناچیزی داره و قابل تأمل نیست)
موفق باشید.
جناب پرواز
چرا بدرد نمی خوره خیلی هم بدرد می خوره خودتون دست کم نگیریدبدردتون بخوره
این طورهم نیستهر چند امکانات ناچیزی داره و قابل تأمل نیست
من برای این گفتن سورسش این برنامه بزار تا دیگران به این مشکل بر خوردند روجوع به این تاپیک کننند و مشکلشون حل بشه
راه حل ساده تر: با دستور write اطلاعات فایل sql را در یک فایل متنی با پسوند csv ثبت و فایل مورد نظر را در اکسل باز کنید. هیچ کامپوننتی هم نمیخواد. حدااکثر یک کد 20 خطی مشک را حل می کند.
جناب رضا
اگه میشه زحمت بکشید کد و یا یه مثال از این روش رو آپلود کنید که ما و بقیه دوستان هم استفاده کنیم.
موفق باشی.
راستی من یه نکته رو فراموش کردم بگم.
تو سورسی که گذاشتم یه فایلت تمپلیت اکسل (.xlt) وجود داره که اگه اونو ویرایش کنید و فونت ها و رنگهاشو به سلیقه خودتون بسازید خروجی گزارشتون هم همون شکلی میشه.
خوبیش اینه که در زمان اجرا و بدون احتیاج به کد نویسی می تونید شکل ظاهری گزارش رو ویرایش کنید.
procedure CreateExcel(jcFileName : String; QTemp: TDataSet);
var FileTxt : TextFile;
ji, i, j : Integer;
jbCancel : Boolean;
begin
with SaveDialog1 do
begin
DefaultExt := 'CSV';
Filter := '*.CSV';
if Execute then
begin
if(FileExists(FileName))then
Exit;
j := QTemp.RecordCount;
Screen.Cursor := CrHourglass;
Try
AssignFile(FileTxt, FileName);
Rewrite(FileTxt);
for ji:=0 to QTemp.FieldCount - 1 do
Write(FileTxt, QTemp.Fields[ji].DisplayLabel ,';');
Writeln(FileTxt,'');
QTemp.First;
i := 1;
while (not QTemp.Eof) do
begin
for ji:=0 to QTemp.FieldCount - 1 do
Write(FileTxt, '"' + QTemp.Fields[ji].AsString + '";');
Writeln(FileTxt,'');
QTemp.Next;
Inc(i);
end;
CloseFile(FileTxt);
Screen.Cursor := crDefault;
Except
Screen.Cursor := crDefault;
end;
end;
end;
end;
آخرین ویرایش به وسیله reza1351 : جمعه 23 شهریور 1386 در 13:15 عصر دلیل: به تایپک 20# مراجعه شود.
مرسی آقا رضا.
اگه کدها رو توی پنجره کد قرار بدی خیلی راحتتر خونده میشه.
موفق باشی
با تشکر قدرت خدا! اشکال اینجا بود که من کد داخل براکت را پاک میکردم بعد متن رو داخل براکت کپی میکردم واقعا که بعضی وقت ها ادم چه کارایی که نمی کنه.
درضمن من برای اینکه بعضی از فیلدها در خروجی اکسل نشون داده نشه. tag فیلد را 1 میذارم و موقع تولید فایل فیلدهایی رو چاپ میکنم که tag آنها 1 نیست. شید بدرد شما هم بخورد.
ضمنا با همین روش import از اکسل را هم نوشتم. البته یه مقدار ریزه کاری دارد ضمن اینکه بر اساس ساختار جدول بانک باید برنامه نوشت و نمیشه یک تابع کلی نوشت.
procedure CreateExcel(jcFileName : String; QTemp: TDataSet);
var FileTxt : TextFile;
ji, i, j : Integer;
jbCancel : Boolean;
begin
with SaveDialog1 do
begin
DefaultExt := 'CSV';
Filter := '*.CSV';
if Execute then
begin
if(FileExists(FileName))then
Exit;
j := QTemp.RecordCount;
Screen.Cursor := CrHourglass;
Try
AssignFile(FileTxt, FileName);
Rewrite(FileTxt);
for ji:=0 to QTemp.FieldCount - 1 do
Write(FileTxt, QTemp.Fields[ji].DisplayLabel ,';');
Writeln(FileTxt,'');
QTemp.First;
i := 1;
while (not QTemp.Eof) do
begin
for ji:=0 to QTemp.FieldCount - 1 do
Write(FileTxt, '"' + QTemp.Fields[ji].AsString + '";');
Writeln(FileTxt,'');
QTemp.Next;
Inc(i);
end;
CloseFile(FileTxt);
Screen.Cursor := crDefault;
Except
Screen.Cursor := crDefault;
end;
end;
end;
end;
ba salam bacheha bebakhshid ke fingilishi shod
goftam ye seri code baraye bachehayi ke az bankaye etelaati sardar nemiyaran az jomle khodam bezaram ke betunan stringgrid ro dar excel zakhire konan omidvaram bedardetun bokhore
function RefToCell(ARow, ACol: Integer): string;
begin
Result := Chr(Ord('A') + ACol - 1) + IntToStr(ARow);
end;
function SaveSGToExcelFile(AGrid: TStringGrid; ASheetName, AFileName: string): Boolean;
const
Worksheet = -4167;
var
XLApp, Sheet, Data: OLEVariant;
i, j: Integer;
begin
Data := VarArrayCreate([1, AGrid.RowCount, 1, AGrid.ColCount], varVariant);
for i := 0 to AGrid.ColCount - 1 do
for j := 0 to AGrid.RowCount - 1 do
Data[j + 1, i + 1] := AGrid.Cells[i, j];
Result := False;
XLApp := CreateOleObject('Excel.Application');
try
XLApp.Visible := False;
XLApp.Workbooks.Add(WorkSheet);
Sheet := XLApp.Workbooks[1].WorkSheets[1];
Sheet.Name := ASheetName;
Sheet.Range[RefToCell(1, 1), RefToCell(AGrid.RowCount,
AGrid.ColCount)].Value := Data;
XLApp.Workbooks[1].SaveAs(AFileName);
Result := True;
finally
if not VarIsEmpty(XLApp) then
begin
XLApp.DisplayAlerts := False;
XLApp.Quit;
XLAPP := Unassigned;
Sheet := Unassigned;
end;
end;
end;
//example
procedure TForm1.Button1Click(Sender: TObject);
begin
if SaveSGToExcelFile(stringGrid1, 'My Stringgrid Data', 'c:\Excel.xls') then
ShowMessage('StringGrid saved!');
end;
faghat darmorede Function RefToCell ye tozihi bedam ke baraye taine Name Sotun ha dar excele A1,B1,...............