Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 669

/ вопрос открыт /

Здравствуйте, эксперты!
Подскажите пожалуйста у меня на форме расположены stringgrid, кнопка при нажатии которой данные из stringgrid экспортируются в excel. Как сделать так чтобы при нажатии кнопки можно было выбрать куда сохранять файл excel? Я понемаю что надо использовать компонент SaveDialog, но не знаю как.

Приложение:
  1. unit Unit5;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, Grids, StdCtrls, ComObj, Buttons, OleServer, ExcelXP, DateUtils,
  8. ComCtrls, ExtCtrls, Gauges;
  9.  
  10. type
  11. TForm5 = class(TForm)
  12. StringGrid1: TStringGrid;
  13. BitBtn1: TBitBtn;
  14. ea: TExcelApplication;
  15. Gauge1: TGauge;
  16. SaveDialog1: TSaveDialog;
  17. procedure FormActivate(Sender: TObject);
  18. procedure BitBtn1Click(Sender: TObject);
  19.  
  20.  
  21.  
  22.  
  23. private
  24. { Private declarations }
  25. public
  26. { Public declarations }
  27. end;
  28.  
  29. var
  30. Form5: TForm5;
  31. dir_:string;
  32. implementation
  33.  
  34. uses Unit3, Unit1, Unit2;
  35.  
  36. {$R *.dfm}
  37. procedure TForm5.BitBtn1Click(Sender: TObject);
  38. var
  39. Excel, WorkBook, Sheet:variant;
  40. i, j: integer;
  41. GridPrevFile,extens: string;
  42.  
  43. begin
  44. GetDir(0, dir_);
  45. Excel:=CreateOleObject('Excel.Application');
  46. Excel.DisplayAlerts:=False;
  47. Excel.Visible:= False;
  48. Workbook:=Excel.
  49. Workbooks.Add;
  50. Workbook.SaveAs(dir_ + '\temp_' + IntToStr(DayOfTheMonth(Date)) + '.' + IntToStr(MonthOfTheYear(Date)) + '.' + IntToStr(YearOf(Date)) + '.xls');
  51. Sheet:= Workbook.ActiveSheet;
  52. Gauge1.MaxValue:=100;
  53. Gauge1.Progress:=0;
  54. for i:= 0 to StringGrid1.RowCount - 1 do
  55.  
  56.  
  57. begin
  58. for j:= 0 to StringGrid1.ColCount - 1 do
  59. Sheet.Cells[i+1, j+1]:= StringGrid1.Cells[j, i];
  60.  
  61.  
  62.  
  63. Excel.WorkBooks[1].WorkSheets[1].Columns[1].ColumnWidth := 33;
  64. Excel.WorkBooks[1].WorkSheets[1].Columns[2].ColumnWidth := 15;
  65. Excel.WorkBooks[1].WorkSheets[1].Columns[3].ColumnWidth := 10;
  66. Excel.WorkBooks[1].WorkSheets[1].Columns[4].ColumnWidth := 23;
  67. if StringGrid1.RowCount>0 then
  68. Gauge1.Progress:=Round(((i+1)*100)/StringGrid1.RowCount);
  69. end;
  70.  
  71. Workbook.Save;
  72. Workbook.Close;
  73. Excel.Quit;
  74. Excel:= UnAssigned;
  75. end;
  76.  
  77.  
  78.  
  79. procedure TForm5.FormActivate(Sender: TObject);
  80. var i:integer;
  81. begin
  82.  
  83. try
  84. DM.dbs.Open;
  85. dm.query.Open;
  86. DM.query.First;
  87. except
  88. on e: exception do showmessage(e.Message);
  89. end;
  90. stringgrid1.Visible:=false;
  91. i:=0;
  92.  
  93. DM.query.SQL.Text:='select (select F+'+char(39)+' '+char(39)+'+I+'+char(39)+' '+char(39)+'+O from owner where card_id=card.card_id),spiski.card_number,(select mobile_phone from owner where card_id=card.card_id),(select email_address from owner where card_id=card.card_id)'+
  94. 'from spiski inner join card on card.card_number=spiski.card_number where act_'+Form1.StringGrid1.cells[0,form1.StringGrid1.row]+'=1';
  95.  
  96.  
  97.  
  98.  
  99.  
  100.  
  101.  
  102. StringGrid1.ColWidths[0] := 220;
  103. StringGrid1.ColWidths[1] := 100;
  104. StringGrid1.ColWidths[2] := 70;
  105. StringGrid1.ColWidths[3] := 130;
  106.  
  107. DM.query.Open;
  108. DM.query.First;
  109. while not DM.query.Eof do
  110. begin
  111. inc(i);
  112. stringgrid1.Cells[0,i]:=DM.query.Fields[0].AsString;
  113. stringgrid1.Cells[1,i]:=DM.query.Fields[1].AsString;
  114. stringgrid1.Cells[2,i]:=DM.query.Fields[2].AsString;
  115. stringgrid1.Cells[3,i]:=DM.query.Fields[3].AsString;
  116.  
  117. stringgrid1.RowCount:=i+1;
  118. DM.query.Next;
  119. end;
  120. stringgrid1.FixedRows:=1;
  121. stringgrid1.Visible:=true;
  122. DM.query.Close;
  123.  
  124. end;
  125. end.


slai Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: slai (статус: Посетитель)
Вопрос отправлен: 19 октября 2010, 07:02
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Шичко Игорь

Здравствуйте, slai!
Предлагаю Вам немного другой вариант решения. На форме расположить компоненты: DriveComboBox1 и DirectoryListBox1 со страницы Win 3.1.
...
DriveComboBox1: TDriveComboBox;
DirectoryListBox1: TDirectoryListBox;
...
В свойстве DriveComboBox1 DirList выбрать DirectoryListBox1.

Тогда можно работать практически как с проводником.
Выбранный путь для сохранения файла будет следующим:

....
dir_:= DirectoryListBox1.Directory;
....
Workbook.SaveAs(dir_ + '\temp_' + IntToStr(DayOfTheMonth(Date)) + '.' + IntToStr(MonthOfTheYear(Date)) + '.' + IntToStr(YearOf(Date)) + '.xls');
...

Файл будет сохраняться в выбранном каталоге.
Вопросы - пишите.
Удачи.

Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 19 октября 2010, 07:48
Оценка за ответ: 5

Ответ #2. Отвечает эксперт: min@y™

Ну и какие проблемы?
Положь SaveDialog на форму. Вызвать его и узнать, какое имя файла выбрал юзер, ты можешь так:

SaveDialog.Filter:= 'Файлы MSExcel (*.xls)|*.xls';
SaveDialog.DefaultExt:= 'xls';
SaveDialog.Options:= SaveDialog.Options + [ofOverwritePrompt];
if SaveDialog.Execute()
  then begin
         // Здесь код процедуры BitBtn1Click
         // имя файла, выбранного в SaveDialog - это SaveDialog.FileName.
       end;

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 19 октября 2010, 08:45


Мини-форум вопроса

Всего сообщений: 2; последнее сообщение — 19 октября 2010, 08:22; участников в обсуждении: 2.
slai

slai (статус: Посетитель), 19 октября 2010, 08:11 [#1]:

Спасибо работает. Но все таки хотелось бы попробовать и через SaveDialog.
Шичко Игорь

Шичко Игорь (статус: 9-ый класс), 19 октября 2010, 08:22 [#2]:

Попробуйте. Расположите на форме компонент SaveDialog1.
Применение:

procedure TForm5.BitBtn1Click(Sender: TObject);
....
if SaveDialog1.Execute then
begin
...
Workbook.SaveAs(SaveDialog1.FileName);
...
end;
При нажатии на кнопку открывается окно ввода имени сохраняемого файла. Обращение к нему в программе: SaveDialog1.FileName

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:48
Выполнено за 0.02 сек.