You are on page 1of 22

Delphi e OpenOffice(BROffice) - Parte 1 I - INTRODUÇÃO Vamos inicar um novo passeio; um passeio diferente, um passeio pelo mundo do software

de código aberto. Abro esse artigo, não querendo dar a idéia de que será algo original. Mas de apresentar a idéia da comunicação OLE entre aplicações Delphi e a família de documentos BrOffice (ou OpenOffice - Writer, Calc, Base e Impress). Porque estou querendo dar ênfase a essa idéia? Simples! o Sistema da empresa onde trabalho, comunica-se tranquilamente com a família Microsoft Office, porém um de nossos clientes resolveu adotar a família BrOffice para sua empresa, e o mais cômico disso tudo, foi porque eu que os incentivei. Mas não tinha idéia de que a parte da comunicação seria tão complexa, mais complexa do que pegar e rodar uma macro no Office e rapidamente obter as propriedades que poderiam ser acessadas e as incorporar em nosso aplicativo. A minha idéia não é nem um pouco original, mas como falei, ela é interessante porque nos remete a um novo aprendizado, e muitas vezes deixamos de implementar algo, já que a quantidade de informação é rara ou, o trabalho cobrará suas dívidas em relação ao tempo perdido, tornando-o muito oneroso, tanto para sua empresa como para os clientes. Mas o mais importante de tudo é tomar a iniciativa e seguir em frente. II – REFERÊNCIAS Leio muitos artigos escritos em revistas de programação e sites relacionados ao Delphi e raramente vejo uma referência dando crédito aos que nos ensinaram e que nos possibilitaram dar os pontapés iniciais no assunto; nesse caso, gostaria de ressaltar o documento escrito por Sérgio Hernandes que está hospedado no site www.broffice.org e pode ser obtido no seguinte endereço: http://ooomacros.org/dev.php#133853. Uma segunda referênca que poderá lhe dar uma luz é o livro chamado: OpenOffice.org Macros Explained do escritor Andrew Pitonyak de 2004 (velho, mas todo que é velho é importante para nossas vidas). III - OBSERVAÇÕES IMPORTANTES Não será apresentado detalhes pertinentes ao uso dos aplicativos, isto é, como salvar, abrir e editar arquivos ou executar comandos de compilação. Esses são pressupostos necessários para os que estão interessados nesse assunto. IV – PROBLEMAS No caso de encontrar erros nos procedimentos, favor relatar. Não sou dono da verdade, portanto as críticas construtivas serão bem-vindas. Não darei atenção para qualquer crítica ríspida, pois trato todos com respeito. V – APLICATIVOS Delphi 7 ou qualquer versão superior e também a Suite BrOffice - estou usando a versão 3.1 com o Builder 9420 - Instalação Padrão. VI - DIREITOS DE CÓPIA Assunto autorizado somente para o site www.PlanetaDelphi.com.br. Esse conteúdo não pode ser copiado ou re-linkado sem prévia autorização do seu autor ou do responsável pelo site, nesse caso Sr. Felipe Monteiro. Toda a cópia e re-linkagem sem autorização prévia e por escrito dos responsáveis mencionados anteriormente, estarão sujeitas aos termos da lei de pirataria. Delphi e BrOffice Iniciando as aplicações do pacote IMPORTANTE: sempre declarar na seção USES a Unit ComObj para todos os exemplos apresentados. Para que possamos executar as diversas aplicações do pacote BrOffice, faremos uso basicamente de um procedimento chamado LoadComponentFromURL que recebe 4 parâmetro e segue este formato: LoadComponentFromURL(sURL, sFrame, FlagDeBusca, Array); As tabelas abaixo,

apresentam os valores permitidos para cada um dos parâmetros. Tabela 1 - URL – String – Primeiro Parâmetro

Tabela 2 - Frames – Segundo Parâmetro

Flag de Busca - Terceiro Parâmetro É um valor constate que define o algoritmo que será usado para encontra o quadro de destino. Use o valor 0 nesse parâmetro para cancelar. Array – Quarto Parâmetro Nesse parâmetro são passados parâmetros para o descritor de mídia do arquivo, definindo diversar propriedades para o carregamento. Executando os diversos Frames - Criando o nosso primeiro aplicativo Não esqueça que o BROffice deve estar instalado. Nesse aplicativo, vamos simplesmente fazer com que o nosso programa execute um dos programas BROffice que o usuário desejar executar. Execute o Delphi, crie uma nova aplicação e no form adicione um componente radiogroup contendo os nomes das aplicações (factory´s) na propriedade itens, uma variável pública chamada aplicação e um botão. Conforme a figura abaixo.

9 : Aplicacao := '.sun.end. 04.begin 05. Executar := Unassigned. begin 07. '_blank'. A variant BROffice é a inicialização.frame.star.ServiceManager'). for colocada em maiúscula. a variável Executar será encarregada de ser uma referência a aplicação. 8 : Aplicacao := 'private:factory/schart'. VarArrayCreate([0. Executar terá todo o conjunto de módulos pertinentes ao Calc. 10. No evento onClick do radiogroup edite o seguinte código: view sourceprint? 01. varVariant)). quando clicar no botão para executar o programa desejado. 08. 02.Application' estará chamando um elemento chamado Service Manager do módulo 'com.ItemIndex <> 0 then 06. Para o evento onClick do botão. a partir dele. uma exceção lhe será apresentada. Veja que foram declaradas três variáveis do tipo Variant – São elas: BrOffice. Planilhas e Células. 05. 5 : Aplicacao := 'private:factory/sdraw'. //2ª Linha 09. Executar := Desktop. 6 : Aplicacao := 'private:factory/smath'. 07. //1ª Linha 08. 13.Desktop').Button1Click(Sender: TObject). edite o seguinte código: view sourceprint? 01.Case RadioGroup1. Desktop := Unassigned. 09.star'.component:Bibliography/View1'. 06. muito parecido com a chamada do Office.procedure TForm1.CreateInstance('com. Desktop := BrOffice. BrOffice := CreateOleObject('com. poderemos acessar as propriedades de Pastas. Se a palavra frame por exemplo 17.ItemIndex of 02.star.sun. if RadioGroup1. 0. 11. //3ª Linha 10. end.} 18. {Atente para as letras maísculas e minúsculas. 4 : Aplicacao := 'private:factory/swriter/GlobalDocument'. 03. . isto quer dizer que.LoadComponentFromURL(Aplicacao. por exemplo o Calc. BrOffice := Unassigned. 3 : Aplicacao := 'private:factory/swriter/web'. Desktop e Executar. 1 : Aplicacao := 'private:factory/scalc'. 0 : Aplicacao := ''.var 03. 7 : Aplicacao := 'private:factory/simpress'. 12. Desktop. 2 : Aplicacao := 'private:factory/swriter'. 14. 15.Vamos escrever algum código agora.end. 12. 11. 04. Executar : Variant.-1]. Já a variável Desktop criar uma instância contendo os elementos comuns da plataforma. BrOffice. ao invés de chamar por exemplo 'Excel. Vou fazer agora um pequeno detalhemento do que foi feito no evento onclick do botão.sun. 16.

rar Até a próxima aula !!! Continuação . eu não pretendo fazer isso agora. um ListBox e como não pode faltar. Deixo a formatação da tela para você. . vemos declaradas as três variáveis mencionadas anteriormente. um SpinEdit. a medida que o spinedit tem seu valor modificado o número de linhas é incrementado ou decrementado e automaticamente gera os índices. No campo do Edit você poderá escolher qualquer nome para o arquivo e o destino do arquivo. um CheckBox. e para finalizar. Download desta aula Delphi e BrOffice .Parte 2 Trabalhando com Arquivos e Planilhas no Calc I – REQUISITOS NECESSÁRIOS PARA O MÓDULO Ter entendido e treinado a versão do artigo apresentada como introdução. um botão. porém recebendo a atribuição de Unassigned. um StringGrid. Quando iniciamos o processamento. pois é ele quem coloca as planilhas em ordem dentro da pasta (o mesmo que no Excel). não edite o campo índice do stringgrid. mais nada. IV – INICIANDO Vamos criar uma nova aplicação. Os principais cuidados para ter sucesso no processo de transferência de dados OLE entre Delphi 7 e BrOffice. Muitas vezes os tutoriais induzem a ter que fazer tudo dentro de uma certa configuração. vamos capturar o nome das planilhas que registramos e seus respectivos índices dentro da pasta.Por fim. podemos marcar a opção que verifica se já existe uma planilha com um dos nomes que estamos registrando (não podem haver duas planilhas com o mesmo nome na mesma pasta). Delphi e OpenOffice(BROffice) .Delphi e OpenOffice(BROffice) . O que faremos nessa parte de nosso tutorial? Simples!! Através do spinedit.Parte 2 II – OBJETIVOS Entender a dinâmica de trabalho com planilhas e arquivos do Calc. definiremos o número de planilhas que serão criadas em nossa aplicação. e nela adiconaremos os seguintes componentes do Delphi: Um Edit. Estamos somente limpando as variáveis. já que a linguagem é case-sensitive. III – IMPORTANTE Atente para os comandos.Parte 1.

Value + 1.RowCount := 2.procedure TForm1.Cells[0.begin 12. N. 05.Vamos inserir o código em nosso sistema e iniciar as explicações necessárias.end. 19.0] := 'Nome da Planilha'. 04.SpinEdit1Change(Sender: TObject). StringGrid1. 21.x] := Format('%d'.Value := 1. 17.1]). StringGrid1. Vamos para a parte nervosa!!! view sourceprint? 01. 22. view sourceprint? 01. 02.2] of String.OnChange(sender). StringGrid1. ela necessita de pelo menos uma planilha. 05. begin 06.procedure TForm1.begin 03. If (SpinEdit1. end else begin 18. Nada de “phenomenal”. StringGrid1.Value = 1) then 13.. 08. x : Integer. x : SHORT. O evento onChange do spinEdit1 tem um pequeno if limitando o número de planilhas existentes para um documento. 11.RowCount do 20. ShowMessage('Uma planilha deve estar presente obrigatoriamente na pasta'). 09.procedure TForm1.FormShow(Sender: TObject).Cells[1. . 16. 06.[x . 07. begin 14. StringGrid1. Remover : array[0.end. end.Cells[0. Para que a pasta possa existir. SpinEdit1.var 10. 02. For x := 1 to StringGrid1.0] := 'Indice'. SpinEdit1.Button1Click(Sender: TObject). 15. O evento onShow do formulário simplesmente coloca os indices nas linhas quando a aplicação é iniciada e atribui o número de linhas pelo evento onChange do SpinEdit1. Os eventos dos componentes estão com seus nomes sublinhados. var 03. 04.RowCount := SpinEdit1.

Desktop').Cells[1. For x := 0 to 2 do 14.Cells[1.CreateInstance('com. O Índice da função insertNewByName sempre inicia do ZERO (0). O primeiro parâmetro da função é uma String e o segundo um valor Inteiro. 0. lbNomes. 27. ShowMessageFmt('A planilha que você inseriu com o nome de %s não será criada' + #13 + 26. Documento. se quiser inserir uma nova planilha com o nome de 'Contabilidade'. x . Documento. 09. False – obviamente! Como foi dito. O que estou querendo dizer é. apresenta o nome no ListBox } 38. caso contrário. varVariant)).getByIndex(x). o retorno da função é True.Items. veremos mais tarde como fazer a exclusão ou renomear através de um módulo 32. x]) then 23. VarArrayCreate([0. { Insere as planilhas nomeadas pelo usuarios. x . 29. x] . 30. //Vai guardar o nome para excluir as planilhas originais na sequência 13.getSheets. sistema } 18. Obviamente que a propriendade Name nos retornará o nome da planilha. se o nome existe. Documento.removeByName(Remover[x]). 16. um documento sempre será um container para armazenar diversas folhas ou planilhas como sabemos.RowCount . 42.ServiceManager'). vamos usar uma função nova chamada insertNewByName('NomeDaPlanilha'. O que fiz não foi pegar o número de planilhas na pasta. begin 20.getByIndex(x). [x. Format('Index da Plan: %d . { Recupera novamente a quantidade de planilhas registrada ou inseridas e 37.getSheets. For x := 0 to 2 do 34.Sheets. Documento := Desktop.1) 24.getSheets. '_blank'. como sabemos que a pasta sempre conterá três planilhas (a não ser que o miserável do usuário altere alguma configuração) então não coletei esse valor.getByIndex(x). somente foi feita a declaração das variáveis para criar os elementos do Broffice. porém. if not Documento. a segunda Um. é iniciado o processo de inserir as planilhas que registramos no StringGrid. através da função hasByName verificamos se existe alguma planilha contendo o nome que passamos em nosso grid. A variável documento armazena as propriedades. É uma função simples e seu único parâmetro é o nome da planilha.Checked then 21.Cells[1. 'porque ela já existe na pasta!'. Remover[x] := Documento. No primeiro for lhe foi apresentado a seguinte situação: Documento. Vamos agora enteder o que foi programado. 39. end else 28. For x := 0 to Pred(N) do 40.07. Mas esse procedimento seria o mais correto.sun.Insert(x.Sheets. Documento. { remove as planilhas criadas automaticamente pelo sistema 31. Assim getSheets() retornará todos os objetos de planilhas dentro da pasta.1 do 19. 41. baseados no índice de nosso 17.LoadComponentFromURL('private:factory/scalc'.Name.1). É uma função Boleana. else 25. end.Nome: %s'. chamado de UNO } 33.star. Através da função hasByName('NomeDaPlanilha') podemos verificar se ela já existe.Sheets. diminua o valor real menos 1 – A primeira planilha tem o índice Zero. capturar o número de planilhas de uma pasta e na sequência obter seus nomes. N := Documento.insertNewByName(StringGrid1. 15. 36. 08. x] . isso seria o mais correto. 10. if CheckBox1.Cells[1. Desktop := BrOffice.-1]. O que faz o CheckBox1? Ele questiona se o usuário deseja verificar se já existe o nome da planilha na pasta em que estamos trabalhando. funções e procedimentos relativos ao documento. 11. .star. BrOffice := CreateOleObject('com. 35. O primeiro bloco como podemos assim dizer. For x := 1 to StringGrid1. em uma pasta e que ela esteja na segunda folha.Name. end. Veja também que. avançamos para a propriedade da planilha (Sheets) e através da função getByIndex capituramos o índice da planilha dentro da pasta.sun. a terceira Dois e assim por diante. No segundo for.hasByName(StringGrid1. begin 22. 12.frame.insertNewByName(StringGrid1.getSheets.GetCount.Name])). se não existir. x]]).[StringGrid1.Sheets. Índice).

odt e por esse motive inserimos a função TranformaDeCaminhoParaURL.var 3.Elementos[0] := 1. 08.function TForm1. parecido com as plataformas Linux..Text). 2. Valores := VarArrayCreate([0. Não irei tratar de detalhes reais de um programa. Como falei. quando salvamos um documento no BrOffice. sendo então o primeiro parâmetro o tamanho do array e o segundo. O BrOffice é uma ferramenta desenvolvida por diversos profissionais e seu objetivo e atender os diversos sistemas operacionais que estão presentes no mercado. 04. Logo o exemplo do primeiro for foi meramente ilustrativo conforme explicado inicialmente.var 03. varInteger) estará fazendo uma referência a algo assim: view sourceprint? 1.Button2Click(Sender: TObject). Se você pensar em salvar um arquivo em algo parecido com: C:\Meus Documentos\Minha Pasta\Subpasta\MinhaPlanilha. 11. Passa a idéia de um array multidimensional.odt. Destino := TranformaDeCaminhoParaURL(Edit1.ods'. Um detalhe importante e por isso fiz essa pequena introdução. Em nosso exemplo. logo. '\'. para que você salve um arquivo do Calc é necessário alterar a formato de definição do caminho. Documento. isso foi feito colocando os nomes em um array quando pressionamos o botão Executar Calc.Para remover uma planilha você usará a função removeByName('NomeDaPlanilha'). Não haveria necessidade de fazer isso. Outro pequeno detalhe. 'Planilha2' e 'Planilha3'. varInteger). A variável Valores é muito interessante e ela lhe dará acesso a um grande universo. rfIgnoreCase]). 07. varVariant). if (Pos('file:///'.Elementos[1] := 2. sempre que vocês ver URL em um parâmetro já saberá o que mais ou menos está sendo exigido. O BrOffice sempre passa a idéia para esse tipo de coisa como se fosse um endereço URL. result := 'file:///' + StringReplace(NomeFile. Coloque o nome da planilha que deseja excluir e pronto. NomeFile : String.. é bem simples e seu parâmetro é uma String.Elementos := VarArrayCreate([0. 3.0]. 4].end. Veja a sua declaração em nosso pequeno sistema: view sourceprint? 1. Sigamos agora para os eventos do segundo botão. 4. 4.TranformaDeCaminhoParaURL(nomeArq: String): String. . 05.procedure TForm1. Vamos para o segundo botão do nosso pequeno programa e que executa o comando salvar da planilha. já que sabemos que sempre os nomes serão 'Planilha1'. Aumentando um pouco mais a complexidade!!!! Não é igual ao Excel. NomeFile) = 0) then 7. Destino : String. o tipo de valores registrados no array. Deixo na sua responsabilidade de fazer as verificações da existência do arquivo e da pasta. deverá converter isso para: file:///C:/Meus Documentos/Minha Pasta/Subpasta/MinhaPlanilha. NomeFile := LowerCase(nomeArq). devemos passar o caminho contendo um formato diferente.begin 06. você sempre passará o caminho para salvar o arquivo no seguinte formato: 'file:///' + Pastas + NomeDoDocumento + extensão. algo como Teste[0][0] e Teste[0][1]. as barras devem ser as barras de data e não as barras invertidas que são o padrão Microsoft. Valores). Destino := Destino + '.begin 5. 8. 02. //Extensão da planilha do broffice 10. [rfReplaceAll.storeAsURL(Destino. 2. '/'. 6. a função VarArrayCreate cria um array de variantes. view sourceprint? 01.end.Elementos[2] := 100.4]. Se você usar VarArrayCreate([0. Valores[0] := AtribuirValores('Overwrite'. Valores : Variant. essa variável ela faz referência a dois parâmetros – um chamado Name e outro chamado Value. 09.true)..

e fizemos então: view sourceprint? 1. E então o array chamado Valores e dizendo que se existir um arquivo com o mesmo nome no local que estamos salvando ele será sobreescrito.5. Reflec : Variant. 04. Essa função cria uma instância do Core do BrOffice e atribuir propriedades de valor. atente que estamos definindo a atribuição de propriedades para o elemento ZERO – Valores[0] e estamos dizendo o seguinte Valores[0][Name] := 'Overwrite' e Valores[0][Value] := true. Reflec := BrOffice.CoreReflection'). Baixe-o se achar necessário. Salva o documento na pasta especificada e dentro daquele padrão que modificamos e exigido pelo BrOffice.ODS' que é o padrão de extensão.createInstance('com.forName('com.\ Delphi e BrOffice . Você usará muito essa função. 6. e está registrada da seguinte forma: view sourceprint? 01.Documento. result.begin 05.Elementos[3] := 1000. mas muitas vezes não tem noção da complexidade existente para que a tarefa seja executada. A idéia básica é sempre abordarmos as partes mais externas e assim. acessamos planilhas. 06.rar Até o próximo passo! Continuação . mas está presente naquele documento menciaonado em nossa primeira lição. Valor : Variant): Variant.createObject(result).reflection.star. então adicionei ao endereço a extensão para o arquivo – tipo '.storeAsURL(Destino. Array). Na sequência temos a seguinte declaração: Valores[0] := AtribuirValores('Overwrite'. 07. avançamos para o procedimento storeAsUrl(URL. Isto feito. II – INTRODUÇÃO Como pudemos observar na segunda parte desse artigo. excluímos e inserimos planilhas.var 03. O recomendável é sempre fazer AtribuirValores('Overwrite'.end. 02. 09.Elementos[4] := 10000. Nossos clientes adoram. Valores). . Bem. true).Parte 2.AtribuirValores(Nome. Essa função não foi criada por mim.Name := Nome. ir avançando para as "entranhas". false). Reflec. 08. porque sempre fazemos a parte da formatação quando exportamos os dados para uma planilha ou para um documento de texto.Delphi e OpenOffice(BROffice) . Um pequeno detalhe.Parte 3 ALCANÇANDO AS CÉLULAS NO CALC I – REQUISITOS É necessário ter acompanhado os dois módulo anteriores já que apresentam o conteúdo introdutório do assunto.PropertyValue'). chegamos numa das partes mais importantes de nosso artigo – cito como mais importante.sun. Download O código fonte se encontra anexado a este artigo. Veja que isso é somente uma representação. salvamos com os nomes desejados.star.beans.function TForm1.sun. result. porque podemos atribuir os elementos de formatação de células e até mesmo salvar arquivos usando a estrutura UNO que veremos mais adiante. O que foi feito então em nosso botão: Criamos o array e informamos que ele conterá um único valor. estamos trabalhando com arquivos do tipo BrOffice.Value:= Valor. Isso é o recomendável. Essa função também foi criada e adicionada no parte inicial do nosso pequeno programa. Ao usarmos a função.

Na parte da programação. deixando mais claro. poderemos tanto usar a referência da célula pelo processo normal (A2. BrOffice. funções e métodos não estão sendo avaliadas nesse momento. devido a facilidade de executar as coisas mais facilmente. será adicionarmos conteúdo a nossa planilha. Na parte inicial de nosso sistema. B5. Veja a primeira parte do evento onClick do botão: . O Nosso exercício quando finalizado deverá estar parecido mais ou menos com a tela apresentada abaixo: III – CODIFICANDO O que faremos a partir de agora. 5. nome da Coluna e nome da Linha. Row). 3. para que a partir dai. Planilha. sem ele. pudéssemos aplicar na formatação de nossa planilha. C6. isto é.2 = E3). Isso caberá exclusivamente a você. Form1: TForm1. defini as seguintes variáveis: view sourceprint? 1. borda e angulo de inclinação de nosso texto. Em nossa pequena aplicação temos somente um botão. o acesso se dá facilmente usando o método getCellByPosition(Col. Nada de mais até agora. Será necessário iniciarmos tudo do zero sendo que a parte prinicpal das chamadas OLE podem ser devidamente copiadas dos módulos anteriores. O que estou fazendo de diferente. você pode fazer referência ao nome da célula ou aos índices da Coluna e Linha. 4. Desktop. 4. já a ShellAPI simplesmente foi adicionada com a intenção de capturar os nomes das fontes do sistema. alinhamento. tamanho da célula. Declaramos também as unit ComObj e ShellAPI. Celula : Variant.var 2.O que veremos nesse momento de nosso artigo? Faremos acesso as células e adiconaremos as respectivas formatações: fonte. é somente declarar as variáveis do tipo variant como públicas. ele aplicará a mesma formatação a todos os valores das células e bordas que forem utilizados. Documento : Variant. AJ38) ou ainda por índices (0. As células no BrOffice seguem o mesmo padrão de nomenclatura do Excel. Até porque o escopo de visualização de variáveis.0 = A1. B5 e etc) são facilmente acessadas com o módulo UNO. A justificativa se dá que a unit ComObj nos dá o acesso aos objetos OLE. cor da célula. Porém um detalhe importante deve ser posto: as referências de nome (A2. quebra de texto.

lfFaceName). encontramos a seguinte atribuição – Célula := Planilha. criamos duas pequenas funções. Em nossa aplicação. declaramos dois laços For.begin 06.ServiceManager'). Tudo igual.-1]. TStrings(Data). Informamos então que estaremos trabalhando com a primeira folha chamada Planilha1. fica mais fácil ainda iniciar o processo de inserção de valores em nossas células. VarArrayCreate([0. varVariant)). A propriedade CharHeight recebe um valor inteiro e define o tamanho da fonte.Button1Click(Sender: TObject). ela recebe um valor do tipo String. tamanho. 08. For Y := 0 to Pred(SpinEdit1. quando digitamos uma String em uma célula tanto no Excel como no Scalc. 5. 04. como aparece no código seguinte.getByName('Planilha1'). Result := 1.Strings[X] + IntToStr(Y + 1).star. Celula.CreateInstance('com. FontType: Integer. 0.setValue(Valor). view sourceprint? 1. Para que possamos inserir valores numéricos por exemplo.sun. Um outro ponto importante a ressaltar é que. 02. Valor : String. Preste a atenção para esse método. onde: X representa a coluna e Y a linha.Desktop'). 11.begin 3. Desktop := BrOffice. 09. sublinhado e Estilo. var TextMetric: TTextMetric. pois através dele. A propriedade CharFonteName é onde definimos o nome da fonte que iremos trabalhar para a célula. 8. Y). 02. 05. porém no segundo laço. X. cor e estilo.LoadComponentFromURL('private:factory/scalc'. Y : SHORT. BrOffice := CreateOleObject('com.frame.end else begin 6.Checked then 2.ItemIndex do 2. isso poderia lhe trazer um certo problema. somente muda os valores que está sendo inserido. 05.setString(Valor). Data: Pointer): Integer. 1) isso está errado. Você poderia usar um FontDialog para obter as propriedades de nome. 7. '_blank'. Celula := Planilha.var 03. 12. sempre deverá utilizar getCellByPosition(0. essa referência diz que estamos trabalhando com a célula A1.if rbTipo1.Value) do 4. Desta vez modificamos um pouco a chamada a forma como capituramos o nome da planilha.end.Add(LogFont.function EnumFontsProc(var LogFont: TLogFont. Valor := cbIni.sun.procedure TForm1.begin 04. : Variant. principalmente relacionados a cor.view sourceprint? 01.star. funções e formatação para as células. Valor := IntToStr(RandomRange(-123456789.setString(' Aqui vai uma String').For X := cbIni. 4. Planilha := Documento.getCellByPosition(X. 0).getSheets. As duas funções que adicionam os nomes de fontes dentro do ComboBox2 são: view sourceprint? 01.ItemIndex to CbFim. você não usará o método dessa forma getCellByPosition('A'. begin 5. usaremos quase o mesmo método. 10. usamos um método chamado getByName(Nome da Planilha). . poderemos obter ou atribuir valores. view sourceprint? 1. Y). somente trocando de setString para setValue. o pressuposto é que o desenvolvedor saberá quais planilhas estão presentes em sua pasta. Ótimo.Items. Por padrão. Nesse momento entramos nos demais elementos de formatação de Células. para justamente adicionar no ComboBox2 os nomes da fontes encontrada em nosso sistema. já sabemos como podemos trabalhar com as linhas e colunas. 123456789)). Documento := Desktop.begin 3.getCellByPosition(X. Veja a sequência de código e encontramos a seguinte declaração: Celula. 07. 03. Celula. Um pouco mais abaixo. stdcall. os valores ficam alinhados a esquerda.

BLOCK : o conteúdo é alinhando em relação ao comprimento da célula. sendo a esqueda para as strings e a direita para os números.Items)).Sorted := True.//Alinhamento Vertical 5. DC). 09. CENTER : o conteúdo da célula é alinhado pelo centro. LEFT : o conteúdo é alinhado no lado esquerdo da célula.Celula. view sourceprint? 1. 4 e 5.Celula. 13. Para os sublinhados. 11. BOTTOM : o conteúdo da célula é alinhado pela base. 14. Diferentemente do que fazemos aqui onde emitimos os valores da indexação dos valores.var 10.//Alinhamento Horizontal 2. DC: HDC. Como poderá observar no código fonte dessa aplicação. Single // linha simples. 3. 3. Pointer(ComboBox2. deveremos usar as constantes sendo obedecidos os módulos em que são declarados.begin 12.CharHeight := StrToInt(Edit1. RIGHT : o conteúdo é alinhado no lado direito da célula. Já para as definições de VertJustify estou usando os valores: 0. podem ser definidos através das propriedades HoriJustify e VertJustify.Celula.//Nome da Fonte 2.CapturarNomesDeFontes. 2 e 3. nil. ComboBox3). 15. 17. 1. temos 18 (dezoito) tipos diferentes. Atente que elas apresentam diferenças de constates de uma para outra.CharFontName := ComboBox2. EnumFonts(DC. Essas funções estão presentes no exemplo do arquivo de ajuda do Delphi – nome: RichEdit. ComboBox4). Dotted // linha pontilhada. verá que para HoriJustify estamos usando respectivamente os seguintes valores: 0. CENTER : o conteúdo é alinhado no centro da célula. 2.end.HoriJustify := RetornaValorDoCombobox('-'. e podem ser definidos como: • • • • 0 1 2 3 None // Sem sublinhado. 1. 4.Text). 16. temos: • • • • • • STANDARD : é o alinhamento padrão tanto para números como para textos. ComboBox2. Se a programação se der dentro do ambiente de macros do BrOffice.Text. DC := GetDC(0). tanto o horizontal como o vertical.ItemIndex := 0. Para VertJustify. view sourceprint? 1.procedure TForm1.06. 08. Para HoriJustify. ReleaseDC(0. 07.Celula. . 4.VertJustify := RetornaValorDoCombobox('-'. @EnumFontsProc.//Tamanho da Fonte 5. temos: • • • • STANDARD : é o valor usado como padrão. Double // linha dupla. A parte do alinhamento. ComboBox2. 3.end. REPEAT : o conteúdo é repetido dentro da célula para preenchê-la. TOP : o conteúdo da célula é alinhado pelo topo.

BoldDash // traços em negrito. Até esse momento de nossa codificação. Blue).Negro = 200% do peso da fonte view sourceprint? 1. ponto sequencia.Thin = 50% do peso da fonte.Light = 75% do peso da fonte. Green. ComboBox5). 9 .Bold // linha em negrito. é bem provável que a cor apresentada. 222). porém quando falamos de cores. 16 . poderíamos dar como exemplo. 60 . ComboBox6).. o seguinte: view sourceprint? 1. atribuindo um dos valores apresentados acima.BoldDashDotDot // Traço. 12 .BoldDashDot // Traço. Porque isso acontece? Aqui vai uma explicação simples: porque o valor utilizado para representar uma cor no BrOffice é compreendido como um único número inteiro.SemiBold = 110% do peso da fonte. vGree: Short. algo do tipo – RGB(123.BoldLongDash // Traços longo em negrito.Normal = 100% peso da fonte normal (100%).UltraLight = 60% do peso da fonte.Celula. 17 . 100 .SemiLight = 90% do peso da fonte. podendo em cada parâmetro. Para atribuir um tipo de sublinhado a sua fonte.Dash // linha tracejada. 50 . você poderá usar uma das seguintes cores indexadas e conforme são apresentadas em nossa aplicação num pequeno grid de 10 X 11.CharWeight := RetornaValorDoCombobox('-'. tanto para background das células. receber um valor Short de 0 a 255. 13 . use a propriedade CharUnderline. 90 .Dontknow = Camera / desconhecido. 175 . porém . 14 . conforme a lista abaixo: • • • • • • • • • • 0 . vBlue: Short.SmallWave // Ondas pequenas.Var 2. Podemos definir cores usando uma função no Delphi definida como RGB(Red.. 577 e 320 Então. O Excel também trabalha com uma indexação de cores.BoldWave // onda Negritada. 200 . 110 .Wave // Em onda. se executarmos a seguinte atribuição a uma cor no BrOffice. sequencia em negrito. 150 .DashDotDot // traço. 6 . 10 . como para bordas e o conteúdo. Porém. ponto e sequencia em negrito. Em código pascal.DontKnow // Sublinhado desconhecido.Celula. 75 . usamos a propriedade CharWeight e estão disponíveis as seguintes contantes.DoubleWave // Em ondas duplas. 8 . 11 . vColorBR : Integer. //Valor entre 0 e 255 5. Para atribuirmos itálico. 066.BoldDotted // pontos em negrito.CharUnderline:= RetornaValorDoCombobox('-'. //Valor entre 0 e 255 3. não seja aquela esperada. //Valor entre 0 e 255 4. 5 . //Valores podem variar em 16.//Tipo de Itálico 2. tudo vai de "vento em popa".UltraBold = 175% do peso da fonte. ponto.• • • • • • • • • • • • • • • 4 . a coisa muda um pouco. não há erro. Utilizando os valores aqui listados.LongDash // traços longos. vRed : Short.DashDot // traço e ponto sequenciados.. para facilitar ainda mais sua vida. 7 . 15 . ponto. 18 .Bold = 150% do peso da fonte. ponto.//Tipo de Sublinhado 2. view sourceprint? 1.

4. e para o Background utilize a propriedade CellBackColor .Text) * 100.Checked then 3. .Celula.if Rotacionar. A propriedade aceita valores iguais ou maiores a 0. 5. // 45 * 100.//Cor do Background da Célula 5. Onde multiplicamos o valor por 100.ItemIndex. view sourceprint? 1. Celula.CharColor := RetornaValorDoCombobox('-'. 3. A propriedade mais importante é realmente RotateAngle. utilize as propriedades RotateReference e RotateAngle.//Permite rotacionar o conteúdo da célula 2. Pode ser o valor 0 (ZERO) para a partir da base.begin 4. Entendido os problemas relacionados as cores e obviamente que sanadas as dúvidas. 1 para partir do topo e 2 para partir do centro da célula. A propriedade RotateReference é utilizada como referência para a partida da rotação do conteúdo.01. atribua um dos valores da tabela acima. Eis o motivo de eu fazer a multiplicação por 100. Se estiver interessado em rotacionar o texto dentro de uma célula. ComboBox7). voltemos a parte light da coisa.RotateReference := RadioGroup1.//Cor da Fonte 2. view sourceprint? 1. Para um ângulo de 45. Você pode fazer a atribuição como o exemplo do código nessa sequência.Celula. ComboBox1).CellBackColor:= RetornaValorDoCombobox('-'.se você usar o RGB as cores sairão dentro do que você estava prevendo. Não podemos dizer o mesmo para o BrOffice.RotateAngle := 4500. ficaria a seguinte definição por exemplo: Celula. Celula.RotateAngle := StrToInt(Edit2. Para atribuir uma cor de fonte use a propriedade CharColor. para ambos.

Text)). 07.createObject(result). ComboBox8). 04. Estamos dizendo que a borda superior terá a configuração passada em seus parâmetros. 21. Se você quiser somente que as bordas superiores e inferiores apareçam. Veja que atribuimos a Celula. StrToInt(Edit6.. Como pode ser visto.//Formatação das bordas das Células 02. view sourceprint? 01. StrToInt(Edit5. A atribuição da formatação das bordas usa na verdade. if bSup. 14.CoreReflection').Color := Cor. O processo de formatação da borda tem muito mais recursos quando trabalhamos com as estruturas UNO. Celula. result.sun.LineDistance := DistLinha. 09.Text)). . 19. Para quebrar o conteúdo do texto.Checked then 13. otherRef : Variant.Text)).Checked then 3. 23.var 04. otherRef.LeftBorder := AtribuirBordas(RetornaValorDoCombobox('-'. É o que fazemos então atribuindo a propriedade relativa a cada célula. utiliza uma outra tabela onde definimos as especificações para cor.TopBorder := AtribuirBordas(RetornaValorDoCombobox('-'. como veremos mais adiante. result.OuterLineWidth := EspLinExter.Checked then 08. estamos utilizando o módulo BorderLine. 16. 06. ComboBox8).6. StrToInt(Edit4. portanto.function TForm1. 10. 11.Text).star.end.. StrToInt(Edit6.Checked then 03. Celula. 15.sun. view sourceprint? 01. if bDir. espessura da borda interna e externa e a distância entre elas. if bEsq. 03.table.. assim como a borda da esquerda totalmente diferente da direita. otherRef := BrOffice. StrToInt(Edit5. 08.Checked then 18.Text)). StrToInt(Edit6. 12.Text). result.begin 06. Celula.Text).RightBorder := AtribuirBordas(RetornaValorDoCombobox('-'. 05.Text). será necessário usar a função AtribuirBordas. uma estrutura do módulo table e que por consequência. end. podemos formatar a borda superior com espessura e cor diferente da borda inferior.BottomBorder := AtribuirBordas(RetornaValorDoCombobox('-'.star.Text). Celula.BorderLine').Text). ComboBox8). StrToInt(Edit4. StrToInt(Edit4. 20.if cbQuebrar. defina a propriedade IsTextWarapped para True. 07. É uma propriedade booleana.Text). if bInf.TopBorder := AtribuirBordas(.reflection..Text). Essa função é parecida com aquela que criamos nas segunda parte para podermos salvar nossos arquivos. result. Celula.end. StrToInt(Edit4. EspLinInter. atribuia as propriedades somente a essas duas bordas e esqueça as demais. 22.. StrToInt(Edit5. 17. 09. DistLinha : Variant): Variant. StrToInt(Edit6. StrToInt(Edit5. 12. 05.//Quebrar o conteúdo da Célula 2. Esses parâmetros podem ser diferentes para cada borda desejada. aceitará somete true ou false.createInstance('com. Para que você possa formatar as bordas de suas células. 11. isto é.AtribuirBordas(Cor. 10.IsTextWrapped := True. ComboBox8). 02.forName('com. EspLinExter.InnerLineWidth := EspLinInter . view sourceprint? 1. As bordas da células podem conter formatações diferentes.

Planilha := Documento.sun.begin 3.getByName('Planilha1').Parte 4 CÉLULAS – Formatações Adicionais I – INTRODUÇÃO No artigo anterior tivemos o privilégio de formatar as células dentro de um padrão desejado. Estimados amigos. O código desse botão está definido da seguinte forma: view sourceprint? 1.procedure TForm1.getSheets. 0. BrOffice := CreateOleObject('com. A parte da inicialização já é conhecida. portanto podem haver outras variantes de código que realizam a mesma tarefa de forma mais complexa ou mais simples. 5.LoadComponentFromURL('private:factory/scalc'.star. .CreateInstance('com.Desktop').sun. 6. vamos avançar para algumas questões ainda relacionadas com a formatação das células.Parte 3. Nesse momento. VarArrayCreate([0. 7. 25. O que gostaria de atentar aqui é o seguinte: o usuário deve primeiro criar o documento pressionando o botão 1º passo – Executar o Scalc. Documento := Desktop. 4. Delphi e BrOffice . Novamente volto a frizar que se erros ou inconscistências ocorrerem. end.ServiceManager'). 8. Desktop := BrOffice.24. enviem-me um printscreen da tela e se possível o código fonte para que possa analisar e buscar as respecitvas soluções.-1]. varVariant)). na sequência vamos nos aprofundar ainda mais em nossas planilhas.Delphi e OpenOffice(BROffice) . Código fonte acompanha este exercício.Button1Click(Sender: TObject).star.zip Continuação . 2.frame.end. Gostaria também de acrescentar que isso tudo é fruto de testes e mais testes.end. '_blank'.

Em nosso exemplo.Text). o conteúdo da célula passa a ser representado por cerquihas (#). Também é importante ressaltar que ao executar o Calc estou selecionando sempre a primeira planilha. o comando AutoFit fosse executado. 5. StrToInt(e2. StrToInt(e4. definiremos o comando como getCellRangeByPosition(Col_Ini. Vamos então iniciar a continuação da formatação. podemos então executar essa tarefa na horizontal ou vertical. Não é incomum adicionar uma célula contendo um texto que seja um detalhamento de informações. você poderá fazer a mesclagem diversas vezes. Eu nunca prestei muita atenção no Excel com relação a essa questão do ajuste de largura. Faixa := Planilha.Text).end. Codificaremos a mesclagem de células. no BrOffice é a mesma coisa. não poderia ser diferente nesse momento. só que não tão enfático com o Excel que preenche a célula inteira com cerquilhas. Row_Fim) . Faixa. Quando o usuário do Excel digita um valore muito extenso. Vejamos: view sourceprint? 1. É um método booleano. A mesclagem exige duas células ou mais e pode estar dentro de um intervalo do tipo A2:F2 ou ainda A2:A10.As variáveis estão definidas como públicas para que possamos usá-las em toda a aplicação. sempre que terminava a inserção de dados nas colunas mandava que a cada célula preenchida. O Calc usa um comando chamado OptimalWidth.Button2Click(Sender: TObject). StrToInt(e3. bastando para isso. ou em ambos os casos. algo como: ABCDE – Sistema de Automação Comercial – Relatório SPED para Contabilidade e para finalizar.Text)). Para completar nosso comando.procedure TForm1.merge(true). ao invés de usarmos getCellByPosiotion onde temos somente uma célula.getCellRangeByPosition(StrToInt(e1. vamos trabalhar . 6. Col_fim. um tom de cinza no fundo. mudar os valores e pressionar o botão mesclar células. executamos o método Merge(boolean). onde define-se o intervalo B5:G15. 4. A variável Faixa é do tipo Variant. 2. E a mágica está feita. O comando é simples e exige que se tenha quatro valores.begin 3. Em nosso exemplo. Row_Ini.Text).

06. O método getColumns retorna todas as colunas de uma planilha e getRows retorna todas as linhas.Value).NumberFormat := '$#. if RadioButton1. faz-se uma vez só e o efeito recai sobre todas as colunas.getByIndex(cbIni.end. 20. Usando o Excel como referência mais uma vez. Todas as planilhas possuem uma propriedade columns(Indice) que faz referência a uma coluna. Como consequência usamos um segundo método para informar qual das linhas ou colunas iremos alterar através de getByIndex(Indice) e então as propriedades width e height.x : short.Text). Se o usuário de nossa aplicação escolher ajustar os tamanhos de todas as colunas da planilha.OptimalWidth := True.getCellByPosition(x.##0. x + 1). getColumns e getRows. Faríamos algo do tipo: Selection. Planilha.00'.OptimalWidth := True. usamos o método getColumns que retorna todas as colunas e atribuímos então OptimalWidth e pronto. 09. o mesmo diz respeito a linha. 02. Então acessamos o membro e definimos o índice.procedure TForm1. o valor da variável array Texto será inserida em 5 colunas diferentes através do for.getColumns.Value). a coluna desde a primeira linha até a última ficará com a mesma largura.getColumns.columns(SpinEdit1.1). Ainda tratando do tamanho de uma célula. 07. 21. 04. Para podermos aumentar ou diminuir as dimensões de uma célula usaremos os membros novamente da planilha. view sourceprint? 01. 18. 04. O array Texto é somente para preencher as células com um conteúdo relativamente extenso.setString(Texto[x]). Celula := Planilha. Texto[4] := 'Um bilhão de Cruzeiros'. 19.Checked then 12. else begin 14.height := StrToInt(Edit2. Vejamos então a terceira parte que está relacionada as dimensões em nossa aplicação. Veja a seguir: view sourceprint? .getByName('Planilha1'). No BrOffice não será diferente.com o ajuste de largura para todas as colunas da planilha ou somente para a coluna desejada.getSheets. Planilha. Texto[3] := 'República Federativa dos Estados Unidos do Brasil'.begin 03.Text). acabamos aproveitando para definir a máscara como o valor da célula será apresentado. 09. recebem um valor inteiro em centésimos de milímetros (1/100 mm).getByIndex(SpinEdit2. 07. Texto[0] := 'Escrevendo um texto grande'. O seguinte comando foi registrado no botão Ajuste a Coluna. 17. Texto[2] := 'The Amazing Race'. 05. end. Planilha.end.Button3Click(Sender: TObject).var 03.end.width := StrToInt(Edit1.Button5Click(Sender: TObject).getColumns.getRows.OptimalWidth := True. 06.begin 08. view sourceprint? 01.ItemIndex). nesse caso. Esse comando é interessante porque ao invés de fazermos tudo individualmente. Mas na seqüência de nosso código é quem fará o ajuste de todas as colunas. Ambas. será usado a mesma propriedade. O código Planilha.columns(SpinEdit1.Value . 10. Texto[1] := 'Luis Fernando Veríssimo'. não esqueça que quando fazemos isso.procedure TForm1. 11.begin 05. quando estamos exportando valores para uma planilha. Documento.procedure TForm1. 02. Para que o ajuste fosse feito em todas as colunas da planilha.Button6Click(Sender: TObject). podemos ajustar a largura da coluna ou a altura da linha. Mas no primeiro if encontramos a atribuição: Planilha. A propriedade OptimalWidth é definida para True.OptimalWidth := True 13. end. begin 16. Celula. For x := 0 to 4 do 15. 08.

04. O cabeçalho e rodapé do BrOffice possui o mesmo sistema do Excel: é separado em 3 faixas – a esquerda. Planilha. . 12.setValue(i).CenterText. 12.getByName('Default'). 1 : Cabecalho.RightPageHeaderContent := Cabecalho.//Insere o cabeçalho na planilha 02. else 6. for i := 0 to 1000 do 07.setValue(i).RightText.procedure TForm1. 14. 17.HeaderIsOn := True. Padrao.Button7Click(Sender: TObject). Celula. Atente que o formato da célula passa a ser relativo ao contador do laço for – I. 7. O código abaixo dispensa qualquer explicação já que foi detalhado até o método getByIndex. Existe uma forma alternativa de verificar se existe uma máscara que você precisa trabalhar.var 03. Padrao. Padrao. A visibilidade de uma coluna pode ser aplicada de uma forma bastante simples.ItemIndex). infelizmente não lembro quem agora fez a menção do limite que numberFormat poderia alcançar. 2 : Cabecalho. para isso estaremos trabalhando com o método IsVisible que recebe um valor booleano. a direita e centralizado na página. O que faço nesse processo é colocar o valor da variável i na coluna A e aplicar uma máscara através do método NumberFormat.RightPageHeaderContent. deve ter pelo menos um valor em qualquer célula para que o cabeçalho ou rodapé possam ser visualizados em sua folha de impressão ou até mesmo em sua visualização de impressão. i : Integer.getCellByPosition(1. 05. 15.begin 3. 13. if rbInv. 03.getColumns. Na sequencia. 14. vamos adicionar cabeçalho e rodapé a nossa planilha. Padrao := Estilo. Cel.getColumns. end. view sourceprint? 1.getCellByPosition(0. Cabecalho : Variant.setString(Edit3.Text).StyleFamilies.procedure TForm1.isVisible := True. mas que um valor confortável estaria até mil. 02. Case rgAlign. Para encerrarmos essa paste de nossos estudos com chave de ouro.getByIndex(ComboBox1. 10. 07. e eis o motivo do porque que meu laço for foi definido até esse valor. 09. begin 08. Celula. 0 : Cabecalho. Celula := Planilha. 2.setString(Edit3. 16. Defina o índice da coluna e atribua True ou False. 05.begin 06.end.begin 06. Gostaria de ressaltar que.getByName('PageStyles').Button4Click(Sender: TObject).LeftText.setString(Edit3. Existe uma recomendação. se ela não existir poderá ser adicionada nessa listagem. Na caixa de texto adicionada ao nosso programa.NumberFormat := i. 11.end.procedure TForm1.isVisible := False 5. end. Cabecalho := Padrao. 08. Faço isso.getByIndex(ComboBox1.ItemIndex). Estilo := Documento. i). Estilo.Checked then 4. 09. i). veja os códigos definidos para a inserção desses elementos em nosso documento: view sourceprint? 01. simplesmente para coletar os formatos disponíveis (formatos padrão) e que poderão ser aplicados em qualquer situação.Text).end.01.ItemIndex of 11. você encontrará a forma e o índice para NumberFormat. cel : variant.Text). 13.Button8Click(Sender: TObject).var 04. Planilha. Cel := Planilha. 10. mas não é nosso foco no momento.

a direita e centralizado.procedure TForm1. Espero que até esse momento essas informações tenham lhe sido úteis. se você não acompanhou as explicações anteriores. ordenações. Rodape := Padrao. o Case verifica o tipo de alinhamento definido pelo usuário.Delphi e OpenOffice(BROffice) . 22. Agora. Continuação .Text). 26. A parte do cálculo é muito simples. 20.FooterIsOn := True.HeaderIsOn. vamos partir para a questão de como trabalhar com fórmulas e funções. 24. 29.RightPageFooterContent := Rodape. portanto.ItemIndex of 28.end. As variáveis cabeçalho e rodapé recebem as características.CenterText. as informações já contidas ou atribuídas anteriormente. recomendo que volte um ou dois tutoriais para poder prosseguir nessa 5ª parte. Se desejar baixar o código fonte: Delphi e BrOffice . 1 : Rodape. E obviamente o conteúdo que é uma string.rar Abraços e até o próximo módulo. 0 : Rodape. Vimos também a parte do cabeçalho e rodapé da nossa planilha. Padrao. 30. 25.FooterIsOn. Vejamos no código abaixo: . Na quarta linha de cada um dos códigos vemos a seguinte atribuição: Cabecalho := Padrao. verifique os nomes dos estilos existentes. mesclagem. 33. inserimos efetivamente as informações através da atribuição da linha de comando Padrao. 32.RightPageHeaderContent := Cabecalho. formato. tais como: visibilidade. Padrao := Estilo.getByName('Default').StyleFamilies. Essa parte do sistema poderia ficar relativamente mais curta.var 21. Na seqüência. criação de macros. e Rodape := Padrao. Nos próximos passos avançaremos para fórmulas.RightPageFooterContent := Rodape. O que é que muda do Cabeçalho para o Rodapé? Olhe a terceira linha de cada um dos eventos. Tanto para o cabeçalho como para o rodapé foram utilizadas as mesmas variáveis (Estilo e Padrao). Estilo.RightText.setString(Edit4. 2 : Rodape. end. Podem ser criados estilo diferentes de acordo com cada usuário. e Padrao. que poderá ser: a esquerda.RightPageFooterContent.Button9Click(Sender: TObject). passada por setText(String contendo o texto).Parte 5 CÉLULAS – Usando Funções ou definindo fórmulas I – INTRODUÇÃO Em nosso último artigo. 31.RightPageFooterContent. As chamadas para o aplicativo já são de seu conhecimento e entendo que não há mais necessidade de enfocar.RightPageHeaderContent. É um jogo de enviar e receber propriedades.Parte 4.setString(Edit4. essa é uma propriedade booleana e informa que será aplicado o cabeçalho. para o rodapé usaremos Padrao. 27.LeftText.//Insere o rodapé na planilha 19.Text).Text). Estilo := Documento. CenterText e RightText. Na variável Padrão é aplicado o estilo chamado Default. Rodape : Variant. já que a variável Estilo receberá o estilo sendo usado atualmente em seu documento. Padrao. sendo LeftText. Formatar é somente um recurso visual que ajuda na visualização dos dados prontos para nossos usuários.begin 23. impressão. margens e etc. largura e altura.getByName('PageStyles'). vimos como configurar uma célula em suas diversas propriedades. Se for usar um outro estilo.setString(Edit4. para o cabeçalho temos Padrao. Padrao.18. E finalizando. II – ATRIBUINDO FUNÇÕES OU FÓRMULAS Até nosso último tutorial não tratamos de como fazer o processo mais importante: executar operações de cálculo no CALC. Case rgAlign1.

Você pode definir outras poucas propriedades do .getCellByPosition(0. Não confunda com uma função. //média 10.1).Formula := '=PRODUCT(A1:A3)'. A diferença básica apresentadas nos tutoriais anteriores é que agora estamos dizendo que trabalhamos com valores através da atribuição Planilha.Text).end.buExecFuncaoClick(Sender: TObject). Planilha.Text). 14.Value := StrToFloat(A3. algo como: SOMA(X:Y). Esses nomes devem ser passados em Inglês. vamos verificar como usar as funções. 1 : Planilha. Planilha. Planilha. 4.getCellByPosition(0. III – PROPRIEDADES DO DOCUMENTO Aproveitando o “gancho” para não ficar muito em cima de uma coisa só. 2. vamos aproveitar para adicionar propriedades do autor ao documento.Text.procedure TForm1.begin 03. Um detalhe importante eu devo deixar claro.Text). //A3 7. //A2 06.Value.0).getCellByPosition(0.getCellByPosition(0. 2 : Planilha.0).Value := StrToFloat(A1.Formula := '=AVERAGE(A1:A3)'. Para que um cálculo seja executado é definido ao invés de value o atributo Formula.getCellByPosition(0.openoffice.Formula := '=MIN(A1:A3)'.getCellByPosition(0.view sourceprint? 1. //multiplica 13. Planilha.Value := StrToFloat(A6. 02. Para atribuí-las ao seu documento. provavelmente obterá um erro pelo nome da função.getCellByPosition(0.getCellByPosition(0.1).Value := StrToFloat(A4. devemos usar a variável Documento e não a Planilha. AtribuirVariaveis.3).3). O BROffice possui uma lista das funções mais utilizadas.Text).btExecutarClick(Sender: TObject).getCellByPosition(0. //mínimo 12. //máximo 11. acesse o site: http://wiki.org/wiki/Documentation/How_Tos/Calc:_Functions_listed_by_category view sourceprint? 01.end.procedure TForm1.0). Planilha. Case cbFuncao. //A1 05.Text).3). Planilha. end. Planilha. se você tentar aplicar as funções usando o nome em português.3). não as confunda com as fórmulas que você cria. Para ter acesso a todas as funções. As propriedades podem ser acessadas no menu Arquivo do BrOffice e no submenu > Propriedades. //A3 07.Formula := '=SUM(A1:A3)'.getCellByPosition(0.Text). 04. //A1 5. 4 : Planilha.getCellByPosition(0.2). 0 : Planilha.services.3).getCellByPosition(0. //soma 09.Formula := F1. Nesse segundo momento. //A2 6.Value := StrToFloat(A5.3).begin 3.Value := StrToFloat(A2. 3 : Planilha. AtribuirVariaveis. 8.Formula := '=MAX(A1:A3)'.getCellByPosition(0.2). MULT(X:Y) e assim por diante.ItemIndex of 08.

Documento. //Título do documento 07.end.procedure TForm1. E aqui na sequência.DocumentInfo.documento. Documento.Subject := edAss. Documento.Text.begin 03. a forma como fica quando executamos o nosso aplicativo contendo as descrições preenchidas.DocumentInfo.Keywords := edKeyW.Text.Author := edAut.DocumentInfo.DocumentInfo. Em nosso tutorial. porém as que estou passando abaixo. end. //Assunto do documento 08. //Descrição do conteúdo 10. Documento. begin 05. //Palavras-Chave do documento 09. veja: .Title := edTit. if chProp. são as mais comuns.Text.Checked then 04. //Autor do documento 06.Description := mmDesc. acrescentei mais uma procedure chamada Propriedades e que está definida na seguinte forma: view sourceprint? 01. 02.DocumentInfo.Text.Propriedades.Text. Documento. 11.

Espero agora que mesmo sendo pouca conteúdo apresentado.zip Abraços e até o próximo módulo. Se desejar baixar o código fonte: Delphi e BrOffice .Essa é mais uma parte de nosso tutorial. eles tenham sido de grande valia para implementar em suas aplicações.Parte 5. .