No desenvolvimento utilizando a estrutura de classes Office, algumas dicas podem ser levadas em consideração para uma melhor performance:
Como a estrutura de classes de manipulação do Office é complexa (aproximadamente 80 fontes) sua performance tem um incremento considerável quando se utiliza as mesmas como primeira entrada do propath.
Outra maneira de incrementar a performance da biblioteca Office é a utilização do parâmetro -q do Progress. Ao se habilitar o parâmetro, o Progress fará o cache dos arquivos .r em memória, tornando a sua leitura muito mais rápida. KB Progress: http://knowledgebase.progress.com/articles/Article/P12659
Com a utilização de classes, e principalmente em função da arquitetura de integração Progress x LibreOffice, a reutilização de objetos utilizando variáveis torna o desempenho das aplicações Office muito melhor. Desta maneira, um objeto que será utilizado várias vezes no código, para a busca de outros objetos, poderá ser mantido em uma variável e reaproveitado.
Abaixo temos um exemplo prático do formato errado (menos performático) e do formato certo (mais performático):
DEFINE VARIABLE chExcel AS office.iface.excel.ExcelWrapper NO-UNDO.
DEFINE VARIABLE chWorkBook AS office.iface.excel.WorkBook NO-UNDO.
DEFINE VARIABLE chWorkSheet AS office.iface.excel.WorkSheet NO-UNDO.
DEFINE VARIABLE chRange AS office.iface.excel.Range NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
{office/office.i Excel chExcel}
chExcel:SheetsInNewWorkbook = 1.
chWorkBook = chExcel:Workbooks:ADD().
chWorkSheet = chWorkBook:Sheets:ITEM(1).
chWorkSheet:NAME = "Listagem".
chWorkSheet:Range("A1:C1"):Interior:ColorIndex = 23.
chWorkSheet:Range("A1:C1"):FONT:ColorIndex = 2.
chWorkSheet:Range("A1"):SetValue("Celula").
chWorkSheet:Range("B1"):SetValue("Valor").
chWorkSheet:Range("C1"):SetValue("Valor Multiplicado").
REPEAT i = 2 TO 100:
chWorkSheet:Range("A" + String(i)):SetValue("A" + String(i)).
chWorkSheet:Range("B" + String(i)):SetValue(100).
chWorkSheet:Range("C" + String(i)):SetValue(100 * i).
END.
chWorkSheet:Range("A1:C1"):EntireColumn:AutoFit().
DEFINE VARIABLE chExcel AS office.iface.excel.ExcelWrapper NO-UNDO.
DEFINE VARIABLE chWorkBook AS office.iface.excel.WorkBook NO-UNDO.
DEFINE VARIABLE chRange AS office.iface.excel.Range NO-UNDO.
DEFINE VARIABLE i AS INTEGER NO-UNDO.
{office/office.i Excel chExcel}
chExcel:SheetsInNewWorkbook = 1.
chWorkBook = chExcel:Workbooks:ADD().
chWorkBook:Sheets:ITEM(1):NAME = "Listagem".
chWorkBook:Sheets:ITEM(1):Range("A1:C1"):Interior:ColorIndex = 23.
chWorkBook:Sheets:ITEM(1):Range("A1:C1"):FONT:ColorIndex = 2.
chWorkBook:Sheets:ITEM(1):Range("A1"):SetValue("Celula").
chWorkBook:Sheets:ITEM(1):Range("B1"):SetValue("Valor").
chWorkBook:Sheets:ITEM(1):Range("C1"):SetValue("Valor Multiplicado").
REPEAT i = 2 TO 100:
chWorkBook:Sheets:ITEM(1):Range("A" + String(i)):SetValue("A" + String(i)).
chWorkBook:Sheets:ITEM(1):Range("B" + String(i)):SetValue(100).
chWorkBook:Sheets:ITEM(1):Range("C" + String(i)):SetValue(100 * i).
END.
chWorkBook:Sheets:ITEM(1):Range("A1:C1"):EntireColumn:AutoFit().