Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];

Вниз

Передача данных в Word через TWordApplication происходит медленно   Найти похожие ветки 

 
Nikolai_S   (2002-09-09 11:25) [0]

Я использую компоненты TWordApplication и TExcelApplication для передачи данных в MS Word и MS Excel. Данные представляют из себя таблицы. Но почему-то передача одних и тех же данных в MS Excel происходит в несколько раз быстрее в MS Word? Кто-нибудь знает тонкости, чтобы ускорить этот процесс?


 
Nikolai_S   (2002-09-09 11:27) [1]

В вопросе была опечатка. Вот исправленный вопрос:

Я использую компоненты TWordApplication и TExcelApplication для передачи данных в MS Word и MS Excel. Данные представляют из себя таблицы. Но почему-то передача одних и тех же данных в MS Excel происходит в несколько раз быстрее, чем в MS Word? Кто-нибудь знает тонкости, чтобы ускорить этот процесс?



 
Ученик   (2002-09-09 11:30) [2]

Создавать временные RTF (XLS)-файл и открывать их.


 
AFrolov   (2002-09-09 11:38) [3]

Как передаешь? Разговор при наличии кода будет более предметным.


 
Nikolai_S   (2002-09-09 11:39) [4]

А какой смысл? Медленно происходит сам процесс передачи текста в Word. Не важно новый ли файл создать или использовать существующий. А в Excel аналогичные операции по передаче текста выполняются в несколько раз быстрее.


 
Nikolai_S   (2002-09-09 11:45) [5]

function CreateMSWordFile(FileName: string; DBGrid: TDBGrid): boolean;
const
xlLCID = LOCALE_USER_DEFAULT;
var
i, CurCol, CurRow, RowCount, ColCount: integer;
WordApplication: Word97.TWordApplication;
WordDocument: Word97.TWordDocument;
iWordDocument: Word97._Document;
iTable: Word97.Table;
DataSet: TDataSet;
ErrorMsg: string;
OleFileName, OleTrueParam, OleFalseParam, Template, NewTemplate, StartInd: OleVariant;
begin
Result := False;

if not Assigned(DBGrid) or not Assigned(DBGrid.DataSource) or
not Assigned(DBGrid.DataSource.DataSet) then Exit;

Screen.Cursor := crHourGlass;

DataSet := DBGrid.DataSource.DataSet;

WordApplication := Word97.TWordApplication.Create(Application);
WordDocument := Word97.TWordDocument.Create(Application);

DataSet.DisableControls;
DataSet.First;

try
WordApplication.Connect;
WordApplication.ConnectKind := ckRunningOrNew;
WordApplication.Caption := FileName;

Template := EmptyParam;
NewTemplate := False;
iWordDocument := WordApplication.Documents.Add(Template, NewTemplate);
WordDocument.ConnectTo(iWordDocument);

WordApplication.Options.CheckSpellingAsYouType := False;
WordApplication.Options.CheckGrammarAsYouType := False;

ColCount := DBGrid.Columns.Count;
RowCount := DataSet.RecordCount + 1;

StartInd := WordDocument.Characters.Count-1;

iTable := WordDocument.Tables.Add(WordDocument.Range(StartInd), RowCount, ColCount);
CurRow := 1;
CurCol := 1;

for i := 0 to DBGrid.Columns.Count - 1 do
begin
if not DBGrid.Columns[i].Visible then Continue;

iTable.Cell(CurRow, CurCol).Range.Font.Size := 10;
iTable.Cell(CurRow, CurCol).Range.Font.Bold := 0;
iTable.Cell(CurRow, CurCol).Range.InsertAfter(DBGrid.Columns[i].Title.Caption);
iTable.Cell(CurRow, CurCol).Borders.OutsideLineStyle := Word97.wdLineStyleSingle;
iTable.Cell(CurRow, CurCol).VerticalAlignment := Word97.wdCellAlignVerticalTop;

Inc(CurCol);
end;
Inc(CurRow);
// ---

// --- Write Data
while not DataSet.Eof do
begin
CurCol := 1;

for i := 0 to DBGrid.Columns.Count - 1 do
begin
if not DBGrid.Columns[i].Visible then Continue;

iTable.Cell(CurRow, CurCol).Range.Font.Size := 10;
iTable.Cell(CurRow, CurCol).Range.Font.Bold := 0;
iTable.Cell(CurRow, CurCol).Range.InsertAfter(DBGrid.Columns[i].Field.Text);
iTable.Cell(CurRow, CurCol).Borders.OutsideLineStyle := Word97.wdLineStyleSingle;

Inc(CurCol);
end;

DataSet.Next;
Inc(CurRow);
end;

iTable.Columns.AutoFit;

WordApplication.ScreenUpdating := True;
WordApplication.Visible := True;

Result := True;
except
on E: Exception do
begin
Result := False;
ErrorMsg := E.Message;
end
end;

DataSet.First;
DataSet.EnableControls;

FreeAndNil(WordDocument);
FreeAndNil(WordApplication);

Screen.Cursor := crDefault;

if not Result then ShowMessage(ErrorMsg);
end;


 
Рыжик   (2002-09-09 12:56) [6]

Во-первых, нет смысла форматировать каждую ячейку в цикле, если они все форматируются одинаково. Лучше отформатировать всю таблицу разом. Быстрее будет.
Во-вторых, перед началом вставки поставить WordApplication.ScreenUpdating := false;
WordApplication.Visible := false
А когда всё закончиться, показать снова



 
Nikolai_S   (2002-09-10 10:20) [7]

Спасибо. Про форматирование я уже и сам догадался. А вот ScreenUpdating попробую, ну а Visible и так False по умолчанию.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.009 c
1-61078
Happy
2002-09-06 09:40
2002.09.19
Можно ли соранить кусочек изображания в image?


3-60983
juster
2002-08-24 11:31
2002.09.19
SQL запрос


3-60991
Igoryan
2002-08-29 13:08
2002.09.19
Подсчет кол-ва записей возвращаемых TQuery


1-61146
Valeris
2002-09-05 18:34
2002.09.19
Operation must use an updateable query


1-61177
Gayrus
2002-09-08 08:15
2002.09.19
Процедуры через Pointer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский