28 de julho de 2010

Integrando programas Delphi com o Excel - parte II

No post anterior, mostrei os passos iniciais e os conceitos básicos para se fazer uma aplicação Delphi que seja capaz de ler ou gravar informações em uma planilha Excel. Neste post eu avanço um pouco, mostrando como acessar as propriedades de uma célula ou grupo de células, seus valores, formatações e fórmulas.

Conforme escrevi em "Classes para automatização do Excel", o acesso a todas essas informações se dá através de objetos do tipo Range do Excel, não importa se você está trabalhando com uma única célula, uma linha, uma coluna ou um grupo qualquer de células dentro de uma planilha.

O exemplo abaixo mostra como preparar um Range que representa uma única célula, acessando seu valor e formatando-a como um título para o WorkSheet:
procedure TForm1.SetExcelTitle;
var ov: OleVariant;
lRange: ExcelRange;
begin
ov := _Sheet.Cells.Item[1, 1];
lRange := _Sheet.Range[ov, ov];
lRange.Font.Color := RGB(40, 40, 127);
lRange.Font.Size := 14;
lRange.Font.Bold := True;
lRange.Item[1, 1] := 'Conhecimento de Transporte eletrônico';
{ ... }
A variável _Sheet foi criada nos moldes descritos no post anterior. Para conseguirmos acessar um Range desse _Sheet, é preciso estipular quais são os limites que o definem, isto é, o Range deverá englobar uma área retangular da planilha, limitada por duas células: uma no canto superior esquerdo da área desejada e a outra no canto inferior direito dessa área. O acesso é conseguido através da propriedade Range da folha, à qual informamos essas duas células que definem a área.

E como obter essas duas células? A propriedade Cells da folha de trabalho é a resposta pois através dela conseguimos referências a localizações específicas dentro da planilha. No trecho de código no quadro anterior, é recuperada uma referência para a célula correspondente à linha 1, coluna 1 e esta referência é repassada ao Range para ganharmos acesso às propriedades que necessitamos. É o que acontece nas linhas seguintes do programa listado, onde uso o Range recuperado para alterar as caracteristicas da fonte (negrito, tamanho, etc.) e o texto a ser usado como título. Repare apenas que para mudar a cor foi preciso usar a função RGB ao invés de um dos TColor definidos pelo Delphi. Isso ocorre porque o formato de cores usado pelo Delphi é diferente do estabelecido para uso por objetos COM, com o Excel.

O conceito de acesso é o mesmo caso queira, por exemplo, mudar o formato de apresentação dos dados numa linha ou coluna:
procedure TForm1.SetExcelFormat;
var ov, ov2: OleVariant;
lRange: ExcelRange;
begin
ov := _Sheet.Cells.Item[3, 6];
ov2 := _Sheet.Cells.Item[10, 6];
lRange := _Sheet.Range[ov, ov2];
lRange.ColumnWidth := 12;
lRange.NumberFormatLocal := 'R$ #.##0,00_);[Red](R$ #.##0,00)';
lRange.HorizontalAlignment := xlRight;
{ ... }
No exemplo acima, eu recupero as localizações das células F3 e F10 (coluna 6, linhas 3 e 10) e monto com elas um Range abrangendo essas 7 células da coluna F. De posse do Range, eu modifico o comprimento da coluna para exibir 12 caracteres, instruo-o para alinhar à direita o conteúdo das células e para que esses conteúdos sejam apresentados como valores monetários (com o símbolo de Reais e duas casas decimais). Observe que para ajustar essa formatação eu usei a propriedade NumberFormatLocal de forma que eu pudesse estipular uma máscara de apresentação compatível com minha localização (ponto como separador de milhar e vírgula para separar as decimais).

Esse mesmo tipo de cuidado deve considerado quando for ajustar fórmulas em seus Ranges pois funções que podem ser usadas em fórmulas são traduzidas. Por exemplo, a função para somar o conteúdo de células tem o nome de SUM mas para o Excel em português ela pode ser inserida como SOMA. As linhas abaixo são equivalentes para quem tem o Excel em português:
lRange.Formula := '=SUM(B2:B31)';
lRange.FormulaLocal := '=SOMA(B2:B31)';
Veja outras considerações a respeito da manipulação de fórmulas neste post.

Nenhum comentário :

Postar um comentário

OBS: Os comentários enviados a este Blog são submetidos a moderação. Por isso, eles serão publicados somente após aprovação.

Observação: somente um membro deste blog pode postar um comentário.