| 
| 
 | Вопрос # 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 tryDM.dbs.Open;dm.query.Open;DM.query.First;excepton 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 dobegininc(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);varExcel, 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, то может замедление и не такое большое будет.
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |