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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 4 654

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

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

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1. unit Unit5;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, Grids;
  8.  
  9. type
  10. TForm5 = class(TForm)
  11. StringGrid1: TStringGrid;
  12. procedure FormActivate(Sender: TObject);
  13. private
  14. { Private declarations }
  15. public
  16. { Public declarations }
  17. end;
  18.  
  19. var
  20. Form5: TForm5;
  21.  
  22. implementation
  23.  
  24. uses Unit3, Unit1;
  25.  
  26. {$R *.dfm}
  27.  
  28.  
  29.  
  30. procedure TForm5.FormActivate(Sender: TObject);
  31. var i:integer;
  32. begin
  33.  
  34. try
  35. DM.dbs.Open;
  36. dm.query.Open;
  37. DM.query.First;
  38. except
  39. on e: exception do showmessage(e.Message);
  40. end;
  41. stringgrid1.Visible:=false;
  42. i:=0;
  43.  
  44. 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)'+
  45. 'from spiski inner join card on card.card_number=spiski.card_number where act_'+Form1.StringGrid1.cells[0,form1.StringGrid1.row]+'=1';
  46.  
  47.  
  48.  
  49.  
  50.  
  51.  
  52.  
  53. DM.query.Open;
  54. DM.query.First;
  55. while not DM.query.Eof do
  56. begin
  57. inc(i);
  58. stringgrid1.Cells[0,i]:=DM.query.Fields[0].AsString;
  59. stringgrid1.Cells[1,i]:=DM.query.Fields[1].AsString;
  60. stringgrid1.Cells[2,i]:=DM.query.Fields[2].AsString;
  61. stringgrid1.Cells[3,i]:=DM.query.Fields[3].AsString;
  62.  
  63.  
  64.  
  65. stringgrid1.RowCount:=i+1;
  66. DM.query.Next;
  67. end;
  68. stringgrid1.FixedRows:=1;
  69. stringgrid1.Visible:=true;
  70. DM.query.Close;
  71.  
  72. end;
  73.  
  74. end.


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

Вопрос задал: slai (статус: Посетитель)
Вопрос отправлен: 14 октября 2010, 05:25
Состояние вопроса: открыт, ответов: 1.

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

Здравствуйте, slai!
Предлагаю Вам следующий вариант решения задачи.
Код в приложении.
Исходник расположен по адресу: Экспорт в Excel
Удачи.

Приложение:
  1.  
  2.  
  3. unit Unit1;
  4.  
  5. interface
  6.  
  7. uses
  8. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  9. Dialogs, StdCtrls, Grids, ComObj;
  10.  
  11. type
  12. TForm1 = class(TForm)
  13. StringGrid1: TStringGrid;
  14. Button1: TButton;
  15. procedure Button1Click(Sender: TObject);
  16. private
  17. { Private declarations }
  18. public
  19. { Public declarations }
  20. end;
  21.  
  22. var
  23. Form1: TForm1;
  24. dir_:string;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. procedure TForm1.Button1Click(Sender: TObject);
  31. var
  32. Excel, WorkBook, Sheet:variant;
  33. i, j: integer;
  34.  
  35. begin
  36.  
  37. Excel:=CreateOleObject('Excel.Application');
  38. Excel.DisplayAlerts:=False;
  39. Excel.Visible:= True;
  40. Workbook:=Excel.
  41. Workbooks.Add;
  42.  
  43. Sheet:= Workbook.ActiveSheet;
  44.  
  45.  
  46.  
  47.  
  48. begin
  49. for j:= 0 to StringGrid1.ColCount - 1 do
  50. Sheet.Cells[i, j+1]:= StringGrid1.Cells[j, i];
  51.  
  52.  
  53.  
  54. end;
  55. Workbook.Save;
  56. Workbook.Close;
  57. Excel.Quit;
  58. Excel:= UnAssigned;
  59. end;
  60.  
  61. end.
  62.  
  63.  


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

Комментарий к оценке: Спасибо.

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

Всего сообщений: 17; последнее сообщение — 14 октября 2010, 12:28; участников в обсуждении: 3.
slai

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

Спасибо большое. А как сделать так чтобы в таблице stringgrid ширина колонки подгонялась под длину строк?
Шичко Игорь

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

Не будем писать, то что уже написано. Подгонка ширины столбца:
Ширина колонки StringGrid
Удачи.
slai

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

Спасибо. Вот еще вопрос как сделать так чтобы он сохранял Excel файл в зависимости от того какой офис на компьютере установлен? Я имею ввиду расширение xlsx и xls.
slai

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

И еще как сделать так чтобы название файла Excel изменялось, а не обновлялось?

14 октября 2010, 09:02: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » COM, ActiveX и взаимодействие с другими приложениями модератором Ерёмин А.А.

Шичко Игорь

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

Каким образом должно меняться название файла?
slai

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

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

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

slai (статус: Посетитель), 14 октября 2010, 10:41 [#13]:

Сейчас попробовал экспортировать таблицу с 7000 строками уже минут 7 экспортируется как то можно увеличить быстродействие?
Шичко Игорь

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

Можно попробовать использовать массивы. Т.е. по запросу к БД кроме вывода в StringGrid формировать массив записей. Потом экспортировать не из таблицы, а из массива. Только это потребует ресурсов памяти. Я бы попробовал сначала на данных примерно в 300 строк и посмотрел время по каждому варианту.
slai

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, то может замедление и не такое большое будет.
Галочка "подтверждения прочтения" - вселенское зло.

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

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