|
Вопрос # 4 654/ вопрос открыт / |
|
Здравствуйте, эксперты!
Подскажите пожалуйста. У меня есть форма на ней расположен stringgrid и кнопка. Как сделать так что бы при нажатии на кнопку данные из таблицы stringgrid экспортировались в Excel ?
К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)
Приложение: Переключить в обычный режим- unit Unit5;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, Grids;
-
- type
- TForm5 = class(TForm)
- StringGrid1: TStringGrid;
- procedure FormActivate(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form5: TForm5;
-
- implementation
-
- uses Unit3, Unit1;
-
- {$R *.dfm}
-
-
-
- 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';
-
-
-
-
-
-
-
- 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 (статус: Посетитель)
Вопрос отправлен: 14 октября 2010, 05:25
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Шичко Игорь
Здравствуйте, slai!
Предлагаю Вам следующий вариант решения задачи.
Код в приложении.
Исходник расположен по адресу: Экспорт в Excel
Удачи.
Приложение: Переключить в обычный режим-
-
- unit Unit1;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, Grids, ComObj;
-
- type
- TForm1 = class(TForm)
- StringGrid1: TStringGrid;
- Button1: TButton;
- procedure Button1Click(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
- dir_:string;
-
- implementation
-
- {$R *.dfm}
-
- procedure TForm1.Button1Click(Sender: TObject);
- var
- Excel, WorkBook, Sheet:variant;
- i, j: integer;
-
- begin
-
- Excel:=CreateOleObject('Excel.Application');
- Excel.DisplayAlerts:=False;
- Excel.Visible:= True;
- Workbook:=Excel.
- Workbooks.Add;
-
- Sheet:= Workbook.ActiveSheet;
-
-
-
-
- begin
- for j:= 0 to StringGrid1.ColCount - 1 do
- Sheet.Cells[i, j+1]:= StringGrid1.Cells[j, i];
-
-
-
- end;
- Workbook.Save;
- Workbook.Close;
- Excel.Quit;
- Excel:= UnAssigned;
- end;
-
- end.
-
-
 |
Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 14 октября 2010, 07:47
Оценка за ответ: 5
Комментарий к оценке: Спасибо.
|
Мини-форум вопроса
Всего сообщений: 17; последнее сообщение — 14 октября 2010, 12:28; участников в обсуждении: 3.
|
slai (статус: Посетитель), 14 октября 2010, 08:05 [#1]:
Спасибо большое. А как сделать так чтобы в таблице stringgrid ширина колонки подгонялась под длину строк?
|
|
slai (статус: Посетитель), 14 октября 2010, 08:44 [#3]:
Спасибо. Вот еще вопрос как сделать так чтобы он сохранял Excel файл в зависимости от того какой офис на компьютере установлен? Я имею ввиду расширение xlsx и xls.
|
|
slai (статус: Посетитель), 14 октября 2010, 08:57 [#4]:
И еще как сделать так чтобы название файла Excel изменялось, а не обновлялось?
|
14 октября 2010, 09:02: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » COM, ActiveX и взаимодействие с другими приложениями модератором Ерёмин А.А.
|
Шичко Игорь (статус: 9-ый класс), 14 октября 2010, 09:09 [#5]:
Каким образом должно меняться название файла?
|
|
slai (статус: Посетитель), 14 октября 2010, 09:13 [#6]:
Чтобы добавлялось число дня создания к названию файла.
|
|
Шичко Игорь (статус: 9-ый класс), 14 октября 2010, 09:21 [#7]:
Для этого можно подключить модуль DateUtils.
И тогда сохранять файл например:
Workbook.SaveAs(dir_ + '\temp_' + IntToStr(DayOfTheMonth(Date)) + '.xls');
DayOfTheMonth(Date) - функция из модуля DateUtils - номер дня в месяце от даты
|
|
slai (статус: Посетитель), 14 октября 2010, 09:40 [#8]:
Спасибо. А какая функция чтобы показывало день месяц и год ?
|
|
Шичко Игорь (статус: 9-ый класс), 14 октября 2010, 09:50 [#9]:
IntToStr(DayOfTheMonth(Date)) - день
IntToStr(MonthOfTheYear(Date)); - месяц
IntToStr(YearOf(Date)); - год
|
|
Шичко Игорь (статус: 9-ый класс), 14 октября 2010, 09:52 [#10]:
IntToStr(DayOfTheMonth(Date)) + "_" + IntToStr(MonthOfTheYear(Date)) + "_" + IntToStr(YearOf(Date));
Получится строка: "14_10_2010"
|
|
slai (статус: Посетитель), 14 октября 2010, 09:57 [#11]:
Спасибо большое. А как сделать так чтобы он сохранял Excel файл в зависимости от того какой офис на компьютере установлен? Я имею ввиду расширение xlsx и xls ?
|
|
Шичко Игорь (статус: 9-ый класс), 14 октября 2010, 10:15 [#12]:
Никогда не пользовался, но можно попробовать:
var
versia: string;
....
begin
....
// После запуска Excel:
versia:= Excel.Version[0];
...
// В зависимости от переменной versia прописывать расширение.
// Excel2003 по-моему распознается как версия 11.0
|
|
slai (статус: Посетитель), 14 октября 2010, 10:41 [#13]:
Сейчас попробовал экспортировать таблицу с 7000 строками уже минут 7 экспортируется как то можно увеличить быстродействие?
|
|
Шичко Игорь (статус: 9-ый класс), 14 октября 2010, 10:52 [#14]:
Можно попробовать использовать массивы. Т.е. по запросу к БД кроме вывода в StringGrid формировать массив записей. Потом экспортировать не из таблицы, а из массива. Только это потребует ресурсов памяти. Я бы попробовал сначала на данных примерно в 300 строк и посмотрел время по каждому варианту.
|
|
slai (статус: Посетитель), 14 октября 2010, 11:03 [#15]:
Я решил так оставить. Только вот добавил progressbar чтобы пользователь видел ход процесса. А как привязать progressbar к экспорту?
|
|
Шичко Игорь (статус: 9-ый класс), 14 октября 2010, 11:33 [#16]:
Где-то так:
Вначале устанавливаем максимальное значение:
ProgressBar1.Max:= StringGrid1.RowCount - 1;
Далее идет экспорт:
...
for i:= 1 to StringGrid1.RowCount - 1 do
...
ProgressBar1.Position:= i; // установка позиции ProgressBar
...
|
|
Вадим К (статус: Академик), 14 октября 2010, 12:28 [#17]:
Это называется "Добавь прогрессбар и получи крутое замедление "
Правда если строк 7000, то может замедление и не такое большое будет.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|