Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2014, 21:54   #1
BlackRavenRu
 
Регистрация: 16.10.2014
Сообщений: 3
Вопрос Экспорт данных из StringGrid в Word

Приветствую.

Есть работающая процедура экспорта таблицы из StringGrid'а в Word-файл. Проблема в следующем: уже при тысяче строк в таблице, процесс экспорта занимает несколько минут. А по поставленной задаче количество строк может доходить и до нескольких десятков тысяч. В связи с этим экспорт занимает огромное количество времени.

Прошу подсказать, возможно существует способ ускорить экспорт или стоит попробовать какой-то другой способ экспорта (если таковой существует).

Код:
procedure TF1.BsaveClick(Sender: TObject);
var
  WordApp,NewDoc,WordTable: OLEVariant;
  iRows,iCols,iGridRows,jGridCols,i,j: Integer;
begin
  try
    WordApp:=CreateOleObject('Word.Application');
  except
    Exit;
  end;
  NewDoc:=WordApp.Documents.Add;
  NewDoc.PageSetup.Orientation:=1;
  iCols:=F1.SG1.ColCount;
  iRows:=F1.SG1.RowCount+1;
  WordTable:=NewDoc.Tables.Add(WordApp.Selection.Range,2,iCols);

  for iGridRows:=3 to iRows do begin
    WordTable.Rows.Add;
    for jGridCols:=1 to iCols do begin
      WordTable.Cell(iGridRows,jGridCols).Range.Text:=F1.SG1.Cells[jGridCols-1,iGridRows-2];
    end;
  end;

  try
    NewDoc.SaveAs(FileName:=F1.LEsavedirectory.Text+'\'+F1.LEsavename.Text+'.rtf');
  except
    MessageDlg('Ошибка при сохранении файла.',mtError,[mbOk],0);
  end;
  WordApp.Quit;
  WordApp:=Unassigned;
  NewDoc:=Unassigned;
  WordTable:=Unassigned;
end;

Последний раз редактировалось Stilet; 16.10.2014 в 22:06.
BlackRavenRu вне форума Ответить с цитированием
Старый 17.10.2014, 10:38   #2
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Однажды недавно я пытался ускориить процесс поиска в ListBox. Задавал примерно такой же вопрос: не знает ли кто как?
Наиболее дельным оказался совет минимизировать количество процедур и обращений к визуальным объектам в цикле. В результате создание TStringList и копирование в него содержимого ListBox с обращением потом именно к StringList а не ListBox ускорило цикл процентов на сорок.
Попробуй и ты сделать подобное.
Например, тоже создать StringList, в который копировать содержимое строк перед переходом во внутренний цикл, примерно так:
Код:
Var TSL: TStringList;
.......
TSL:=TStringList.Create;

  for iGridRows:=3 to iRows do begin
    WordTable.Rows.Add;
    TSL.Assign(F1.SG1.Rows[iGridRows-2]);
    for jGridCols:=1 to iCols do begin
//      WordTable.Cell(iGridRows,jGridCols).Range.Text:=F1.SG1.Cells[jGridCols-1,iGridRows-2];
      WordTable.Cell(iGridRows,jGridCols).Range.Text:=TSL[jGridCols-1];
    end;
  end;
TSL.Free;
Ship_1 вне форума Ответить с цитированием
Старый 17.10.2014, 15:55   #3
BlackRavenRu
 
Регистрация: 16.10.2014
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
...
Попробуй и ты сделать подобное.
Например, тоже создать StringList, в который копировать содержимое строк перед переходом во внутренний цикл
...
Спасибо за совет. Попробовал. К сожалению в моём случае это непомогло. Ради интереса засёк секундомером, ваш вариант и мой трудились одинаковое время секунда в секунду.
BlackRavenRu вне форума Ответить с цитированием
Старый 18.10.2014, 09:33   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

А чего в ворд? Почему не в эксцель?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 18.10.2014, 10:16   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
WordTable.Rows.Add;
Надо сразу создать таблицу со всеми строками а не дописывать построчно.
http://msdn.microsoft.com/en-us/libr...code-snippet-1
Цитата:
NumRows
Type: System.Int32
Required Integer. The number of rows you want to include in the table.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.10.2014, 11:18   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

NURKZ, не надо лезть в чужую тему. создавайте свою, там и просите помощи!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.10.2014, 17:53   #7
BlackRavenRu
 
Регистрация: 16.10.2014
Сообщений: 3
По умолчанию

Цитата:
Сообщение от min@y™ Посмотреть сообщение
А чего в ворд? Почему не в эксцель?
Закидоны начальства. Выходной Word-файл потом "кушает" другая сторонняя программа.


Цитата:
Сообщение от Stilet Посмотреть сообщение
Надо сразу создать таблицу со всеми строками а не дописывать построчно.
Пробовал. Word не позволяет добавлять более 32767 строк при создании таблицы. Собственно так и было сделано изначально, пока в один прекрасный день не понадобилось экспортировать 62000 строк.
Но и при таблице со всеми строками экспорт скоростью не блистал.
BlackRavenRu вне форума Ответить с цитированием
Старый 18.10.2014, 18:09   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Когда-то аналогичную проблему с выгрузкой в Excel решал - на выходе в шаблон нужно было записать очень много строк. Средствами SQL нельзя, потому что сложный шаблон, через OLE очень медленно. Выгрузил шаблон в XML-формате, разобрался с его устройством и писал в XML. Скорость на порядок лучше. В Word-е тоже есть возможность выгрузки в XML. Можно поступить аналогично. После формирования документа через OLE открыть в Word-е и сохранить в DOC-формате
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 18.10.2014, 19:55   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не понадобилось экспортировать 62000 строк.
Офанареть.... А несколькими таблицами не пробовал?
И кста, может действительно под Экзель переписать?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.10.2014, 09:16   #10
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

Дык у ворда нужно дизаблить отрисовку и проверку арфаграфии
Код:
Application.ScreenUpdating = False 
try
'Здесь должен быть код Вашей программы. 
finally
Application.ScreenUpdating = True
end;
Код:
 wdApp.Options.CheckSpellingAsYouType = False
http://vbabesaba.com/uroki/uskorenie.htm
http://www.programmersforum.ru/showthread.php?t=227736
Не стесняемся, плюсуем!

Последний раз редактировалось Slym; 20.10.2014 в 14:58.
Slym вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экспорт из StringGrid в Word Polotenchik Общие вопросы Delphi 12 23.09.2011 23:22
экспорт из StringGrid в Word Бусурманин хлоров Общие вопросы Delphi 1 11.12.2010 09:20
Экспорт двух или более таблиц Stringgrid в MS word RomanDemidov Общие вопросы Delphi 4 16.11.2010 16:18
Экспорт со Stringgrid в Word (работа с несколькими табицами) RomanDemidov Помощь студентам 0 12.11.2010 23:28