Здравствуйте!
Вывожу данные из своей программы в документ Ms Word программно, используя COM.
Почему-то это делается слишком медленно.
Вот привожу кусок кода:
//Enter into WORD, create new document.
QAxObject* pWordApplication=new QAxObject("Word.Application"); // Создаю интерфейс к MSWord
QAxObject* pWordDocuments = pWordApplication->querySubObject( "Documents()" ); // Получаю интерфейсы к его подобъекту "коллекция открытых документов":
pWordDocuments->querySubObject( "Add()" ); // Создаю новый документ
pWordApplication->setProperty("Visible", true); // Делаем Word видимым
// отключение грамматики
QAxObject* pGrammatic = pWordApplication->querySubObject("Options()");
pGrammatic->setProperty("CheckSpellingAsYouType(bool)", false); // отключение грамматики
//Get active document.
QAxObject* pActiveDocument = pWordApplication->querySubObject("ActiveDocument()");
//Set landscape orientation.
QAxObject *pPageSetup = pActiveDocument->querySubObject("PageSetup");
pPageSetup->setProperty("Orientation", "wdOrientLandscape");
//Inserting automatically pages numerations.
pActiveDocument->querySubObject("Sections(Index)", 1)
->querySubObject("Footers(WdHeaderFooterIndex)", "wdHeaderFooterPrimary")
->querySubObject("PageNumbers")
->dynamicCall("Add(PageNumberAlignment,FirstPage)", "wdAlignPageNumberCenter", TRUE);
//Get selection.
QAxObject *pSelection = pWordApplication->querySubObject("ActiveDocument")->querySubObject("ActiveWindow")->querySubObject("Selection");
// создание таблицы
QAxObject* pTables = pActiveDocument->querySubObject("Tables()");
QAxObject* pNewTable = pTables->querySubObject("Add(Range, NumRows, NumColumns, DefaultTableBehavior, AutoFitBehavior)", pSelection->property("Range"), 1, 5, 1, 1);
//5 columns.
//Resize table width to whole page width.
pNewTable->setProperty("PreferredWidthType", "wdPreferredWidthPercent");
pNewTable->setProperty("PreferredWidth", 100);
//Align table to center.
pNewTable->querySubObject("Rows()")->setProperty("Alignment", "wdAlignRowCenter");
//Iterate found records.
QAxObject *pCell=NULL, *pCellRange=NULL;
int cur_row = 0;
while(cur_row < 100)
{
//Inserting new row for each new data.
pSelection->dynamicCall("InsertRowsBelow()");
//Column-0.
pCell = pCurRow->querySubObject("Cells(Index)", 1); //Warning! Arg of col num is 1-based.
pCellRange = pCell->querySubObject("Range()");
pCellRange->dynamicCall("InsertAfter(Text)","My 1 cell");
//Column-1.
pCell = pCurRow->querySubObject("Cells(Index)", 2);
pCellRange = pCell->querySubObject("Range()");
pCellRange->dynamicCall("InsertAfter(Text)","My 2 cell");
//Column-2.
pCell = pCurRow->querySubObject("Cells(Index)", 3);
pCellRange = pCell->querySubObject("Range()");
pCellRange->dynamicCall("InsertAfter(Text)","My 3 cell");
//Column-3.
pCell = pCurRow->querySubObject("Cells(Index)", 4);
pCellRange = pCell->querySubObject("Range()");
pCellRange->dynamicCall("InsertAfter(Text)","My 4 cell");
//Column-4. State.Begin.
pCell = pCurRow->querySubObject("Cells(Index)", 5);
pCellRange = pCell->querySubObject("Range()");
pCellRange->dynamicCall("InsertAfter(Text)","My 5 cell");
//Update cur row index.
cur_row++;
}
//Iterate found records.End.
В коде происходит следующее:
- Открывается MS Word
- Добавляется новый документ
- отключается грамматика
- расположение страницы делается альбомная
- Добавляется автоматическая нумерация страниц.
- Создается таблица
- Ширина таблицы делается на всю страницу
- Таблица выравнивается по центру по горизонтали
- Заполняется таблица текстом
На каждую страницу документа уходит много времени.
Подскажите, пожалуйста, как это ускорить. Может как то переделать код?