|
Вопрос # 4 669/ вопрос открыт / |
|
Здравствуйте, эксперты!
Подскажите пожалуйста у меня на форме расположены stringgrid, кнопка при нажатии которой данные из stringgrid экспортируются в excel. Как сделать так чтобы при нажатии кнопки можно было выбрать куда сохранять файл excel? Я понемаю что надо использовать компонент SaveDialog, но не знаю как.
Приложение: Переключить в обычный режим- unit Unit5;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, Grids, StdCtrls, ComObj, Buttons, OleServer, ExcelXP, DateUtils,
- ComCtrls, ExtCtrls, Gauges;
-
- type
- TForm5 = class(TForm)
- StringGrid1: TStringGrid;
- BitBtn1: TBitBtn;
- ea: TExcelApplication;
- Gauge1: TGauge;
- SaveDialog1: TSaveDialog;
- procedure FormActivate(Sender: TObject);
- procedure BitBtn1Click(Sender: TObject);
-
-
-
-
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form5: TForm5;
- dir_:string;
- implementation
-
- uses Unit3, Unit1, Unit2;
-
- {$R *.dfm}
- procedure TForm5.BitBtn1Click(Sender: TObject);
- var
- Excel, WorkBook, Sheet:variant;
- i, j: integer;
- GridPrevFile,extens: string;
-
- begin
- GetDir(0, dir_);
- Excel:=CreateOleObject('Excel.Application');
- Excel.DisplayAlerts:=False;
- Excel.Visible:= False;
- Workbook:=Excel.
- Workbooks.Add;
- Workbook.SaveAs(dir_ + '\temp_' + IntToStr(DayOfTheMonth(Date)) + '.' +
IntToStr(MonthOfTheYear(Date)) + '.' + IntToStr(YearOf(Date)) + '.xls');
- Sheet:= Workbook.ActiveSheet;
- Gauge1.MaxValue:=100;
- Gauge1.Progress:=0;
- for i:= 0 to StringGrid1.RowCount - 1 do
-
-
- begin
- for j:= 0 to StringGrid1.ColCount - 1 do
- Sheet.Cells[i+1, j+1]:= StringGrid1.Cells[j, i];
-
-
-
- Excel.WorkBooks[1].WorkSheets[1].Columns[1].ColumnWidth := 33;
- Excel.WorkBooks[1].WorkSheets[1].Columns[2].ColumnWidth := 15;
- Excel.WorkBooks[1].WorkSheets[1].Columns[3].ColumnWidth := 10;
- Excel.WorkBooks[1].WorkSheets[1].Columns[4].ColumnWidth := 23;
- if StringGrid1.RowCount>0 then
- Gauge1.Progress:=Round(((i+1)*100)/StringGrid1.RowCount);
- end;
-
- Workbook.Save;
- Workbook.Close;
- Excel.Quit;
- Excel:= UnAssigned;
- end;
-
-
-
- procedure TForm5.FormActivate(Sender: TObject);
- var i:integer;
- begin
-
- try
- DM.dbs.Open;
- dm.query.Open;
- DM.query.First;
- except
- on e: exception do showmessage(e.Message);
- end;
- stringgrid1.Visible:=false;
- i:=0;
-
- 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)'+
- 'from spiski inner join card on card.card_number=spiski.card_number where
act_'+Form1.StringGrid1.cells[0,form1.StringGrid1.row]+'=1';
-
-
-
-
-
-
-
- StringGrid1.ColWidths[0] := 220;
- StringGrid1.ColWidths[1] := 100;
- StringGrid1.ColWidths[2] := 70;
- StringGrid1.ColWidths[3] := 130;
-
- DM.query.Open;
- DM.query.First;
- while not DM.query.Eof do
- begin
- inc(i);
- stringgrid1.Cells[0,i]:=DM.query.Fields[0].AsString;
- stringgrid1.Cells[1,i]:=DM.query.Fields[1].AsString;
- stringgrid1.Cells[2,i]:=DM.query.Fields[2].AsString;
- stringgrid1.Cells[3,i]:=DM.query.Fields[3].AsString;
-
- stringgrid1.RowCount:=i+1;
- DM.query.Next;
- end;
- stringgrid1.FixedRows:=1;
- stringgrid1.Visible:=true;
- DM.query.Close;
-
- end;
- end.
 |
Вопрос задал: 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 (статус: Посетитель), 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
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|