Форум: "Основная";
Текущий архив: 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