Delphi e OpenOffice

22
5/10/2018 DelphieOpenOffice-slidepdf.com http://slidepdf.com/reader/full/delphi-e-openoffice 1/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 ponta- pé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,

Transcript of Delphi e OpenOffice

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 1/22

Delphi e OpenOffice(BROffice) - Parte 1 

I - INTRODUÇÃO 

Vamos inicar um novo passeio; um passeio diferente, um passeio pelo mundo do software decódigo aberto. Abro esse artigo, não querendo dar a idéia de que será algo original. Mas deapresentar 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 MicrosoftOffice, 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 dacomunicação seria tão complexa, mais complexa do que pegar e rodar uma macro no Office erapidamente obter as propriedades que poderiam ser acessadas e as incorporar em nossoaplicativo.

A minha idéia não é nem um pouco original, mas como falei, ela é interessante porque nos remetea um novo aprendizado, e muitas vezes deixamos de implementar algo, já que a quantidade deinformação é rara ou, o trabalho cobrará suas dívidas em relação ao tempo perdido, tornando-omuito 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 raramentevejo uma referência dando crédito aos que nos ensinaram e que nos possibilitaram dar os ponta-pés iniciais no assunto; nesse caso, gostaria de ressaltar o documento escrito por Sérgio Hernandesque 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 é olivro chamado: OpenOffice.org Macros Explained do escritor Andrew Pitonyak de 2004 (velho, mastodo que é velho é importante para nossas vidas).

III - OBSERVAÇÕES IMPORTANTES 

Não será apresentado detalhes pertinentes ao uso dos aplicativos, isto é, como salvar, abrir eeditar 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 ascríticas construtivas serão bem-vindas. Não darei atenção para qualquer crítica ríspida, pois tratotodos 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 oBuilder 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 sercopiado ou re-linkado sem prévia autorização do seu autor ou do responsável pelo site, nesse casoSr. Felipe Monteiro. Toda a cópia e re-linkagem sem autorização prévia e por escrito dosresponsá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 exemplosapresentados.

Para que possamos executar as diversas aplicações do pacote BrOffice, faremos uso basicamentede um procedimento chamado LoadComponentFromURL que recebe 4 parâmetro e segue esteformato: LoadComponentFromURL(sURL, sFrame, FlagDeBusca, Array); As tabelas abaixo,

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 2/22

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. Useo 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 diversarpropriedades 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 dosprogramas BROffice que o usuário desejar executar. Execute o Delphi, crie uma nova aplicação eno form adicione um componente radiogroup contendo os nomes das aplicações (factory´s) napropriedade itens, uma variável pública chamada aplicação e um botão. Conforme a figura abaixo.

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 3/22

Vamos escrever algum código agora. No evento onClick do radiogroup edite o seguinte código:

view sourceprint?01.Case RadioGroup1.ItemIndex of 02. 0 : Aplicacao := '';03. 1 : Aplicacao := 'private:factory/scalc';

04. 2 : Aplicacao := 'private:factory/swriter';05. 3 : Aplicacao := 'private:factory/swriter/web';06. 4 : Aplicacao := 'private:factory/swriter/GlobalDocument';07. 5 : Aplicacao := 'private:factory/sdraw';08. 6 : Aplicacao := 'private:factory/smath';09. 7 : Aplicacao := 'private:factory/simpress';10. 8 : Aplicacao := 'private:factory/schart';11. 9 : Aplicacao := '.component:Bibliography/View1';12.end;

Para o evento onClick do botão, edite o seguinte código:

view sourceprint?01.procedure TForm1.Button1Click(Sender: TObject);02.var03. BrOffice, Desktop, Executar : Variant;04.begin05. if RadioGroup1.ItemIndex <> 0 then06. begin07. BrOffice := CreateOleObject('com.sun.star.ServiceManager'); //1ª Linha08. Desktop := BrOffice.CreateInstance('com.sun.star.frame.Desktop'); //2ª Linha09. Executar := Desktop.LoadComponentFromURL(Aplicacao, '_blank', 0, //3ª Linha10. VarArrayCreate([0,-1], varVariant));11. end;12.

13. BrOffice := Unassigned;14. Desktop := Unassigned;15. Executar := Unassigned;16. {Atente para as letras maísculas e minúsculas. Se a palavra frame por exemplo17. for colocada em maiúscula, uma exceção lhe será apresentada.}18.end;

Vou fazer agora um pequeno detalhemento do que foi feito no evento onclick do botão. Veja queforam declaradas três variáveis do tipo Variant – São elas: BrOffice, Desktop e Executar. A variantBROffice é a inicialização, muito parecido com a chamada do Office, ao invés de chamar porexemplo 'Excel.Application' estará chamando um elemento chamado Service Manager do módulo'com.sun.star'. Já a variável Desktop criar uma instância contendo os elementos comuns daplataforma; a variável Executar será encarregada de ser uma referência a aplicação, isto quer dizer

que, quando clicar no botão para executar o programa desejado, por exemplo o Calc, Executar terátodo o conjunto de módulos pertinentes ao Calc, a partir dele, poderemos acessar as propriedadesde Pastas, Planilhas e Células.

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 4/22

Por fim, vemos declaradas as três variáveis mencionadas anteriormente, porém recebendo aatribuição de Unassigned. Estamos somente limpando as variáveis, mais nada.

Download desta aula 

Delphi e BrOffice - Parte 1.rar 

Até a próxima aula !!!

Continuação - Delphi e OpenOffice(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. Delphi eOpenOffice(BROffice) - Parte 2 

II – OBJETIVOS 

Entender a dinâmica de trabalho com planilhas e arquivos do Calc. Os principais cuidados para tersucesso no processo de transferência de dados OLE entre Delphi 7 e BrOffice.

III – IMPORTANTE 

Atente para os comandos, já que a linguagem é case-sensitive.

IV – INICIANDO 

Vamos criar uma nova aplicação, e nela adiconaremos os seguintes componentes do Delphi: UmEdit, um SpinEdit, um StringGrid, um CheckBox, um ListBox e como não pode faltar, um botão.

Deixo a formatação da tela para você. Muitas vezes os tutoriais induzem a ter que fazer tudodentro de uma certa configuração, eu não pretendo fazer isso agora. O que faremos nessa parte denosso tutorial? Simples!! Através do spinedit, definiremos o número de planilhas que serão criadas

em nossa aplicação, não edite o campo índice do stringgrid, pois é ele quem coloca as planilhas emordem dentro da pasta (o mesmo que no Excel), a medida que o spinedit tem seu valor modificadoo número de linhas é incrementado ou decrementado e automaticamente gera os índices. Nocampo do Edit você poderá escolher qualquer nome para o arquivo e o destino do arquivo. Quandoiniciamos o processamento, podemos marcar a opção que verifica se já existe uma planilha comum dos nomes que estamos registrando (não podem haver duas planilhas com o mesmo nome namesma pasta); e para finalizar, vamos capturar o nome das planilhas que registramos e seusrespectivos índices dentro da pasta.

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 5/22

Vamos inserir o código em nosso sistema e iniciar as explicações necessárias. Os eventos doscomponentes estão com seus nomes sublinhados.

view sourceprint?01.procedure TForm1.FormShow(Sender: TObject);02.begin03. StringGrid1.Cells[0,0] := 'Indice';04. StringGrid1.Cells[1,0] := 'Nome da Planilha';05. SpinEdit1.OnChange(sender);06.end;07.

08.procedure TForm1.SpinEdit1Change(Sender: TObject);09.var10. x : Integer;11.begin12. If (SpinEdit1.Value = 1) then13. begin14. ShowMessage('Uma planilha deve estar presente obrigatoriamente na pasta');15. SpinEdit1.Value := 1;16. StringGrid1.RowCount := 2;17. end else begin18. StringGrid1.RowCount := SpinEdit1.Value + 1;19. For x := 1 to StringGrid1.RowCount do20. StringGrid1.Cells[0,x] := Format('%d',[x - 1]);

21. end;22.end;

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. Nada de “phenomenal”.O evento onChange do spinEdit1 tem um pequeno if limitando o número de planilhas existentespara um documento. Para que a pasta possa existir, ela necessita de pelo menos uma planilha.

Vamos para a parte nervosa!!!

view sourceprint?01.procedure TForm1.Button1Click(Sender: TObject);02. var03. N, x : SHORT;04. Remover : array[0..2] of String;05. begin06.

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 6/22

07. BrOffice := CreateOleObject('com.sun.star.ServiceManager');08. Desktop := BrOffice.CreateInstance('com.sun.star.frame.Desktop');09. Documento := Desktop.LoadComponentFromURL('private:factory/scalc', '_blank', 0,10. VarArrayCreate([0,-1], varVariant));11.12. //Vai guardar o nome para excluir as planilhas originais na sequência13. For x := 0 to 2 do14. Remover[x] := Documento.Sheets.getByIndex(x).Name;15.16. { Insere as planilhas nomeadas pelo usuarios, baseados no índice de nosso

17. sistema }18. For x := 1 to StringGrid1.RowCount - 1 do19. begin20. if CheckBox1.Checked then21. begin22. if not Documento.Sheets.hasByName(StringGrid1.Cells[1, x]) then23. Documento.getSheets.insertNewByName(StringGrid1.Cells[1, x] , x - 1)24. else25. ShowMessageFmt('A planilha que você inseriu com o nome de %s não será criada' +#13 +26. 'porque ela já existe na pasta!',[StringGrid1.Cells[1, x]]);27. end else28. Documento.getSheets.insertNewByName(StringGrid1.Cells[1, x] , x - 1);29. end;30. { remove as planilhas criadas automaticamente pelo sistema31. veremos mais tarde como fazer a exclusão ou renomear através de um módulo32. chamado de UNO }33. For x := 0 to 2 do34. Documento.getSheets.removeByName(Remover[x]);35.36. { Recupera novamente a quantidade de planilhas registrada ou inseridas e37. apresenta o nome no ListBox }38. N := Documento.getSheets.GetCount;39. For x := 0 to Pred(N) do40. lbNomes.Items.Insert(x, Format('Index da Plan: %d - Nome: %s',

41. [x, Documento.Sheets.getByIndex(x).Name]));42. end;

Vamos agora enteder o que foi programado. O primeiro bloco como podemos assim dizer, somentefoi feita a declaração das variáveis para criar os elementos do Broffice. No primeiro for lhe foiapresentado a seguinte situação: Documento.Sheets.getByIndex(x).Name; A variáveldocumento armazena as propriedades, funções e procedimentos relativos ao documento;avançamos para a propriedade da planilha (Sheets) e através da função getByIndex capituramoso índice da planilha dentro da pasta. Obviamente que a propriendade Name nos retornará o nomeda planilha. O que fiz não foi pegar o número de planilhas na pasta, isso seria o mais correto,porém, como sabemos que a pasta sempre conterá três planilhas (a não ser que o miserável dousuário altere alguma configuração) então não coletei esse valor. Mas esse procedimento seria omais correto, capturar o número de planilhas de uma pasta e na sequência obter seus nomes.

No segundo for, é iniciado o processo de inserir as planilhas que registramos no StringGrid. O quefaz o CheckBox1? Ele questiona se o usuário deseja verificar se já existe o nome da planilha napasta em que estamos trabalhando. Através da função hasByName('NomeDaPlanilha') podemosverificar se ela já existe. É uma função simples e seu único parâmetro é o nome da planilha. É umafunção Boleana, se o nome existe, o retorno da função é True, caso contrário, False – obviamente!

Como foi dito, através da função hasByName verificamos se existe alguma planilha contendo onome que passamos em nosso grid; se não existir, vamos usar uma função nova chamadainsertNewByName('NomeDaPlanilha', Índice). O primeiro parâmetro da função é uma String eo segundo um valor Inteiro. Veja também que, um documento sempre será um container paraarmazenar diversas folhas ou planilhas como sabemos. Assim getSheets() retornará todos osobjetos de planilhas dentro da pasta. O Índice da função insertNewByName sempre inicia doZERO (0). O que estou querendo dizer é, se quiser inserir uma nova planilha com o nome de'Contabilidade', em uma pasta e que ela esteja na segunda folha, diminua o valor real menos 1 – Aprimeira planilha tem o índice Zero, a segunda Um, a terceira Dois e assim por diante.

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 7/22

Para remover uma planilha você usará a função removeByName('NomeDaPlanilha'), é bemsimples e seu parâmetro é uma String. Coloque o nome da planilha que deseja excluir e pronto. Emnosso exemplo, isso foi feito colocando os nomes em um array quando pressionamos o botãoExecutar Calc. Não haveria necessidade de fazer isso, já que sabemos que sempre os nomesserão 'Planilha1', 'Planilha2' e 'Planilha3'. Logo o exemplo do primeiro for foi meramente ilustrativoconforme explicado inicialmente.

Aumentando um pouco mais a complexidade!!!! Não é igual ao Excel....

O BrOffice é uma ferramenta desenvolvida por diversos profissionais e seu objetivo e atender os

diversos sistemas operacionais que estão presentes no mercado. Vamos para o segundo botão donosso pequeno programa e que executa o comando salvar da planilha. Um detalhe importante epor isso fiz essa pequena introdução, quando salvamos um documento no BrOffice, devemospassar o caminho contendo um formato diferente, parecido com as plataformas Linux, você semprepassará o caminho para salvar o arquivo no seguinte formato: 'file:///' + Pastas +NomeDoDocumento + extensão. Outro pequeno detalhe, as barras devem ser as barras de datae não as barras invertidas que são o padrão Microsoft. Se você pensar em salvar um arquivo emalgo parecido com: C:\Meus Documentos\Minha Pasta\Subpasta\MinhaPlanilha.odt, deveráconverter isso para: file:///C:/Meus Documentos/Minha Pasta/Subpasta/MinhaPlanilha.odt epor esse motive inserimos a função TranformaDeCaminhoParaURL. Veja a sua declaração em nossopequeno sistema:

view sourceprint?1.function TForm1.TranformaDeCaminhoParaURL(nomeArq: String): String;2.var3. NomeFile : String;4.begin5. NomeFile := LowerCase(nomeArq);6. if (Pos('file:///', NomeFile) = 0) then7. result := 'file:///' + StringReplace(NomeFile, '\', '/', [rfReplaceAll, rfIgnoreCase]);8.end;

Deixo na sua responsabilidade de fazer as verificações da existência do arquivo e da pasta. Não ireitratar de detalhes reais de um programa. Como falei, para que você salve um arquivo do Calc énecessário alterar a formato de definição do caminho. O BrOffice sempre passa a idéia para esse

tipo de coisa como se fosse um endereço URL, logo, sempre que vocês ver URL em um parâmetro já saberá o que mais ou menos está sendo exigido.

Sigamos agora para os eventos do segundo botão.

view sourceprint?01.procedure TForm1.Button2Click(Sender: TObject);02.var03. Valores : Variant;04. Destino : String;05.begin06. Destino := TranformaDeCaminhoParaURL(Edit1.Text);07. Valores := VarArrayCreate([0,0], varVariant);

08. Valores[0] := AtribuirValores('Overwrite',true);09. Destino := Destino + '.ods'; //Extensão da planilha do broffice10. Documento.storeAsURL(Destino, Valores);11.end;

A variável Valores é muito interessante e ela lhe dará acesso a um grande universo; essa variávelela faz referência a dois parâmetros – um chamado Name e outro chamado Value. Passa a idéiade um array multidimensional, algo como Teste[0][0] e Teste[0][1], a função VarArrayCreate criaum array de variantes, sendo então o primeiro parâmetro o tamanho do array e o segundo, o tipode valores registrados no array. Se você usar VarArrayCreate([0, 4], varInteger) estará fazendouma referência a algo assim:

view sourceprint?1.Elementos := VarArrayCreate([0,4], varInteger);2.Elementos[0] := 1;3.Elementos[1] := 2;4.Elementos[2] := 100;

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 8/22

5.Elementos[3] := 1000;6.Elementos[4] := 10000;

O que foi feito então em nosso botão: Criamos o array e informamos que ele conterá um únicovalor. Na sequência temos a seguinte declaração: Valores[0] := AtribuirValores('Overwrite',true); Essa função também foi criada e adicionada no parte inicial do nosso pequeno programa, eestá registrada da seguinte forma:

view sourceprint?01.function TForm1.AtribuirValores(Nome, Valor : Variant): Variant;

02.var03. Reflec : Variant;04.begin05. Reflec := BrOffice.createInstance('com.sun.star.reflection.CoreReflection');06. Reflec.forName('com.sun.star.beans.PropertyValue').createObject(result);07. result.Name := Nome;08. result.Value:= Valor;09.end;

Essa função não foi criada por mim, mas está presente naquele documento menciaonado em nossaprimeira lição. Essa função cria uma instância do Core do BrOffice e atribuir propriedades de valor.Você usará muito essa função, porque podemos atribuir os elementos de formatação de células eaté mesmo salvar arquivos usando a estrutura UNO que veremos mais adiante. Ao usarmos afunção, 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; Veja que isso é somente uma representação. Isto feito, avançamos para o procedimentostoreAsUrl(URL, Array); e fizemos então:

view sourceprint?1.Documento.storeAsURL(Destino, Valores);

Salva o documento na pasta especificada e dentro daquele padrão que modificamos e exigido peloBrOffice. E então o array chamado Valores e dizendo que se existir um arquivo com o mesmo nomeno local que estamos salvando ele será sobreescrito. O recomendável é sempre fazerAtribuirValores('Overwrite', false). Isso é o recomendável.

Um pequeno detalhe, estamos trabalhando com arquivos do tipo BrOffice, então adicionei aoendereço a extensão para o arquivo – tipo '.ODS' que é o padrão de extensão.

Download 

O código fonte se encontra anexado a este artigo. Baixe-o se achar necessário.\

Delphi e BrOffice - Parte 2.rar 

Até o próximo passo!

Continuação - Delphi e OpenOffice(BROffice) - 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údointrodutório do assunto.

II – INTRODUÇÃO 

Como pudemos observar na segunda parte desse artigo, acessamos planilhas, salvamos com osnomes desejados, excluímos e inserimos planilhas. A idéia básica é sempre abordarmos as partesmais externas e assim, ir avançando para as "entranhas". Bem, chegamos numa das partes maisimportantes de nosso artigo – cito como mais importante, porque sempre fazemos a parte daformatação quando exportamos os dados para uma planilha ou para um documento de texto.Nossos clientes adoram, mas muitas vezes não tem noção da complexidade existente para que atarefa seja executada.

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 9/22

O que veremos nesse momento de nosso artigo? Faremos acesso as células e adiconaremos asrespectivas formatações: fonte, cor da célula, tamanho da célula, alinhamento, quebra de texto,borda e angulo de inclinação de nosso texto. Será necessário iniciarmos tudo do zero sendo que aparte prinicpal das chamadas OLE podem ser devidamente copiadas dos módulos anteriores.

As células no BrOffice seguem o mesmo padrão de nomenclatura do Excel, isto é, nome da Colunae nome da Linha. Na parte da programação, você pode fazer referência ao nome da célula ou aosíndices da Coluna e Linha; deixando mais claro, poderemos tanto usar a referência da célula peloprocesso normal (A2, B5, C6, AJ38) ou ainda por índices (0,0 = A1, 4,2 = E3). Porém um detalhe

importante deve ser posto: as referências de nome (A2, B5 e etc) são facilmente acessadas com omódulo UNO, sem ele, o acesso se dá facilmente usando o método getCellByPosition(Col, Row).

O Nosso exercício quando finalizado deverá estar parecido mais ou menos com a tela apresentadaabaixo:

III – CODIFICANDO 

O que faremos a partir de agora, será adicionarmos conteúdo a nossa planilha. O que estoufazendo de diferente, é somente declarar as variáveis do tipo variant como públicas, devido afacilidade de executar as coisas mais facilmente. Até porque o escopo de visualização de variáveis,funções e métodos não estão sendo avaliadas nesse momento. Isso caberá exclusivamente a você.

Na parte inicial de nosso sistema, defini as seguintes variáveis:

view sourceprint?1.var2. Form1: TForm1;3.4. BrOffice, Desktop, Documento : Variant;5. Planilha, Celula : Variant;

Declaramos também as unit ComObj e ShellAPI. A justificativa se dá que a unit ComObj nos dá oacesso aos objetos OLE, já a ShellAPI simplesmente foi adicionada com a intenção de capturar osnomes das fontes do sistema, para que a partir dai, pudéssemos aplicar na formatação de nossaplanilha. Nada de mais até agora.

Em nossa pequena aplicação temos somente um botão, ele aplicará a mesma formatação a todosos valores das células e bordas que forem utilizados. Veja a primeira parte do evento onClick dobotão:

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 10/22

view sourceprint?01.procedure TForm1.Button1Click(Sender: TObject);02.var03. X, Y : SHORT;04. Valor : String;05.begin06. BrOffice := CreateOleObject('com.sun.star.ServiceManager');07. Desktop := BrOffice.CreateInstance('com.sun.star.frame.Desktop');08. Documento := Desktop.LoadComponentFromURL('private:factory/scalc',09. '_blank', 0, VarArrayCreate([0,-1], varVariant));

10.11. Planilha := Documento.getSheets.getByName('Planilha1');12. : Variant;

Desta vez modificamos um pouco a chamada a forma como capituramos o nome da planilha,usamos um método chamado getByName(Nome da Planilha), o pressuposto é que odesenvolvedor saberá quais planilhas estão presentes em sua pasta. Informamos então queestaremos trabalhando com a primeira folha chamada Planilha1. Um pouco mais abaixo, comoaparece no código seguinte, declaramos dois laços For, porém no segundo laço, encontramos aseguinte atribuição – Célula := Planilha.getCellByPosition(X, Y), onde: X representa a coluna e Y alinha. Preste a atenção para esse método, pois através dele, poderemos obter ou atribuir valores,funções e formatação para as células. Um outro ponto importante a ressaltar é que, você não usaráo método dessa forma getCellByPosition('A', 1) isso está errado, sempre deverá utilizargetCellByPosition(0, 0); essa referência diz que estamos trabalhando com a célula A1.

view sourceprint?1.For X := cbIni.ItemIndex to CbFim.ItemIndex do2.begin3. For Y := 0 to Pred(SpinEdit1.Value) do4. begin5. Celula := Planilha.getCellByPosition(X, Y);

Ótimo, já sabemos como podemos trabalhar com as linhas e colunas, fica mais fácil ainda iniciar oprocesso de inserção de valores em nossas células. Veja a sequência de código e encontramos aseguinte declaração: Celula.setString(' Aqui vai uma String'). Por padrão, quando digitamos

uma String em uma célula tanto no Excel como no Scalc, os valores ficam alinhados a esquerda.Para que possamos inserir valores numéricos por exemplo, usaremos quase o mesmo método,somente trocando de setString para setValue. Tudo igual, somente muda os valores que está sendoinserido.

view sourceprint?1.if rbTipo1.Checked then2.begin3. Valor := cbIni.Items.Strings[X] + IntToStr(Y + 1);4. Celula.setString(Valor);5.end else begin6. Valor := IntToStr(RandomRange(-123456789, 123456789));7. Celula.setValue(Valor);

8.end;

Nesse momento entramos nos demais elementos de formatação de Células. A propriedadeCharFonteName é onde definimos o nome da fonte que iremos trabalhar para a célula, ela recebeum valor do tipo String. Em nossa aplicação, criamos duas pequenas funções, para justamenteadicionar no ComboBox2 os nomes da fontes encontrada em nosso sistema. Você poderia usar umFontDialog para obter as propriedades de nome, tamanho, cor e estilo; isso poderia lhe trazer umcerto problema, principalmente relacionados a cor, sublinhado e Estilo. A propriedade CharHeightrecebe um valor inteiro e define o tamanho da fonte. As duas funções que adicionam os nomes defontes dentro do ComboBox2 são:

view sourceprint?01.function EnumFontsProc(var LogFont: TLogFont; var TextMetric: TTextMetric;02. FontType: Integer; Data: Pointer): Integer; stdcall;03.begin04. TStrings(Data).Add(LogFont.lfFaceName);05. Result := 1;

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 11/22

06.end;07.08.procedure TForm1.CapturarNomesDeFontes;09.var10. DC: HDC;11.begin12. DC := GetDC(0);13. EnumFonts(DC, nil, @EnumFontsProc, Pointer(ComboBox2.Items));14. ReleaseDC(0, DC);15. ComboBox2.Sorted := True;

16. ComboBox2.ItemIndex := 0;17.end;

Essas funções estão presentes no exemplo do arquivo de ajuda do Delphi – nome: RichEdit.

view sourceprint?1.//Nome da Fonte2.Celula.CharFontName := ComboBox2.Text;3.4.//Tamanho da Fonte5.Celula.CharHeight := StrToInt(Edit1.Text);

A parte do alinhamento, tanto o horizontal como o vertical, podem ser definidos através daspropriedades HoriJustify e VertJustify. Atente que elas apresentam diferenças de constates deuma para outra. Para HoriJustify, temos:

• STANDARD : é o alinhamento padrão tanto para números como para textos, sendo aesqueda para as strings e a direita para os números;

• LEFT : o conteúdo é alinhado no lado esquerdo da célula;• CENTER : o conteúdo é alinhado no centro da célula;• RIGHT : o conteúdo é alinhado no lado direito da célula;• BLOCK : o conteúdo é alinhando em relação ao comprimento da célula;• REPEAT : o conteúdo é repetido dentro da célula para preenchê-la.

Para VertJustify, temos:

• STANDARD : é o valor usado como padrão;• TOP : o conteúdo da célula é alinhado pelo topo;• CENTER : o conteúdo da célula é alinhado pelo centro;• BOTTOM : o conteúdo da célula é alinhado pela base.

Como poderá observar no código fonte dessa aplicação, verá que para HoriJustify estamos usandorespectivamente os seguintes valores: 0, 1, 2, 3, 4 e 5. Já para as definições de VertJustify estouusando os valores: 0, 1, 2 e 3. Se a programação se der dentro do ambiente de macros do

BrOffice, deveremos usar as constantes sendo obedecidos os módulos em que são declarados.Diferentemente do que fazemos aqui onde emitimos os valores da indexação dos valores.

view sourceprint?1.//Alinhamento Horizontal2.Celula.HoriJustify := RetornaValorDoCombobox('-', ComboBox3);3.4.//Alinhamento Vertical5.Celula.VertJustify := RetornaValorDoCombobox('-', ComboBox4);

Para os sublinhados, temos 18 (dezoito) tipos diferentes, e podem ser definidos como:

• 0 - None // Sem sublinhado.• 1 - Single // linha simples.• 2 - Double // linha dupla.• 3 - Dotted // linha pontilhada.

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 12/22

• 4 - DontKnow // Sublinhado desconhecido.• 5 - Dash // linha tracejada.• 6 - LongDash // traços longos.• 7 - DashDot // traço e ponto sequenciados.• 8 - DashDotDot // traço, ponto, ponto sequencia.• 9 - SmallWave // Ondas pequenas.• 10 - Wave // Em onda.• 11 - DoubleWave // Em ondas duplas.• 12 - Bold // linha em negrito.• 13 - BoldDotted // pontos em negrito.• 14 - BoldDash // traços em negrito.• 15 - BoldLongDash // Traços longo em negrito.• 16 - BoldDashDot // Traço, ponto e sequencia em negrito.• 17 - BoldDashDotDot // Traço, ponto, ponto, sequencia em negrito.• 18 - BoldWave // onda Negritada....

Para atribuir um tipo de sublinhado a sua fonte, use a propriedade CharUnderline, atribuindo umdos valores apresentados acima.

view sourceprint?

1.//Tipo de Sublinhado2.Celula.CharUnderline:= RetornaValorDoCombobox('-', ComboBox5);

Para atribuirmos itálico, usamos a propriedade CharWeight e estão disponíveis as seguintescontantes, conforme a lista abaixo:

• 0 - Dontknow = Camera / desconhecido.• 50 - Thin = 50% do peso da fonte.• 60 - UltraLight = 60% do peso da fonte.• 75 - Light = 75% do peso da fonte.• 90 - SemiLight = 90% do peso da fonte.• 100 - Normal = 100% peso da fonte normal (100%).• 110 - SemiBold = 110% do peso da fonte.• 150 - Bold = 150% do peso da fonte.• 175 - UltraBold = 175% do peso da fonte.• 200 - Negro = 200% do peso da fonte

view sourceprint?1.//Tipo de Itálico2.Celula.CharWeight := RetornaValorDoCombobox('-', ComboBox6);

Até esse momento de nossa codificação, tudo vai de "vento em popa", porém quando falamos decores, tanto para background das células, como para bordas e o conteúdo, a coisa muda um pouco.

Podemos definir cores usando uma função no Delphi definida como RGB(Red, Green, Blue),podendo em cada parâmetro, receber um valor Short de 0 a 255. Porém, se executarmos aseguinte atribuição a uma cor no BrOffice, algo do tipo – RGB(123, 066, 222), é bem provável que acor apresentada, não seja aquela esperada. Porque isso acontece? Aqui vai uma explicaçãosimples: porque o valor utilizado para representar uma cor no BrOffice é compreendido como umúnico número inteiro. Em código pascal, poderíamos dar como exemplo, o seguinte:

view sourceprint?1.Var2. vRed : Short; //Valor entre 0 e 2553. vGree: Short; //Valor entre 0 e 2554. vBlue: Short; //Valor entre 0 e 2555. vColorBR : Integer; //Valores podem variar em 16, 577 e 320

Então, para facilitar ainda mais sua vida, você poderá usar uma das seguintes cores indexadas econforme são apresentadas em nossa aplicação num pequeno grid de 10 X 11. Utilizando osvalores aqui listados, não há erro. O Excel também trabalha com uma indexação de cores, porém

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 13/22

se você usar o RGB as cores sairão dentro do que você estava prevendo. Não podemos dizer omesmo para o BrOffice.

Para atribuir uma cor de fonte use a propriedade CharColor, e para o Background utilize apropriedade CellBackColor , para ambos, atribua um dos valores da tabela acima.

view sourceprint?1.//Cor da Fonte2.Celula.CharColor := RetornaValorDoCombobox('-', ComboBox7);3.4.//Cor do Background da Célula5.Celula.CellBackColor:= RetornaValorDoCombobox('-', ComboBox1);

Entendido os problemas relacionados as cores e obviamente que sanadas as dúvidas, voltemos aparte light da coisa. Se estiver interessado em rotacionar o texto dentro de uma célula, utilize aspropriedades RotateReference e RotateAngle. A propriedade mais importante é realmenteRotateAngle. Você pode fazer a atribuição como o exemplo do código nessa sequência. Ondemultiplicamos o valor por 100. A propriedade aceita valores iguais ou maiores a 0,01. Eis o motivode eu fazer a multiplicação por 100. Para um ângulo de 45, ficaria a seguinte definição porexemplo: Celula.RotateAngle := 4500;  // 45 * 100. A propriedade RotateReference é utilizadacomo referência para a partida da rotação do conteúdo. Pode ser o valor 0 (ZERO) para a partir dabase, 1 para partir do topo e 2 para partir do centro da célula.

view sourceprint?

1.//Permite rotacionar o conteúdo da célula2.if Rotacionar.Checked then3.begin4. Celula.RotateReference := RadioGroup1.ItemIndex;5. Celula.RotateAngle := StrToInt(Edit2.Text) * 100;

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 14/22

6.end;

Para quebrar o conteúdo do texto, defina a propriedade IsTextWarapped para True. É umapropriedade booleana, portanto, aceitará somete true ou false.

view sourceprint?1.//Quebrar o conteúdo da Célula2.if cbQuebrar.Checked then3. Celula.IsTextWrapped := True;

As bordas da células podem conter formatações diferentes, isto é, podemos formatar a bordasuperior com espessura e cor diferente da borda inferior, assim como a borda da esquerdatotalmente diferente da direita. O processo de formatação da borda tem muito mais recursosquando trabalhamos com as estruturas UNO, como veremos mais adiante. A atribuição daformatação das bordas usa na verdade, uma estrutura do módulo table e que por consequência,utiliza uma outra tabela onde definimos as especificações para cor, espessura da borda interna eexterna e a distância entre elas. Para que você possa formatar as bordas de suas células, seránecessário usar a função AtribuirBordas, Essa função é parecida com aquela que criamos nassegunda parte para podermos salvar nossos arquivos.

view sourceprint?01.function TForm1.AtribuirBordas(Cor, EspLinInter, EspLinExter,02. DistLinha : Variant): Variant;03.var04. otherRef : Variant;05.begin06. otherRef := BrOffice.createInstance('com.sun.star.reflection.CoreReflection');07. otherRef.forName('com.sun.star.table.BorderLine').createObject(result);08. result.Color := Cor;09. result.InnerLineWidth := EspLinInter ;10. result.OuterLineWidth := EspLinExter;11. result.LineDistance := DistLinha;12.end;

Como pode ser visto, estamos utilizando o módulo BorderLine. É o que fazemos então atribuindo a

propriedade relativa a cada célula. Veja que atribuimos a Celula.TopBorder :=AtribuirBordas(...... Estamos dizendo que a borda superior terá a configuração passada em seusparâmetros. Esses parâmetros podem ser diferentes para cada borda desejada. Se você quisersomente que as bordas superiores e inferiores apareçam, atribuia as propriedades somente a essasduas bordas e esqueça as demais.

view sourceprint?01.//Formatação das bordas das Células02. if bSup.Checked then03. Celula.TopBorder := AtribuirBordas(RetornaValorDoCombobox('-', ComboBox8),04. StrToInt(Edit4.Text),05. StrToInt(Edit5.Text),06. StrToInt(Edit6.Text));

07. if bEsq.Checked then08. Celula.LeftBorder := AtribuirBordas(RetornaValorDoCombobox('-', ComboBox8),09. StrToInt(Edit4.Text),10. StrToInt(Edit5.Text),11. StrToInt(Edit6.Text));12. if bDir.Checked then13. Celula.RightBorder := AtribuirBordas(RetornaValorDoCombobox('-', ComboBox8),14. StrToInt(Edit4.Text),15. StrToInt(Edit5.Text),16. StrToInt(Edit6.Text));17. if bInf.Checked then18. Celula.BottomBorder := AtribuirBordas(RetornaValorDoCombobox('-', ComboBox8),19. StrToInt(Edit4.Text),20. StrToInt(Edit5.Text),21. StrToInt(Edit6.Text));22.23. end;

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 15/22

24. end;25.end;

Estimados amigos, na sequência vamos nos aprofundar ainda mais em nossas planilhas.Novamente volto a frizar que se erros ou inconscistências ocorrerem, enviem-me umprintscreen da tela e se possível o código fonte para que possa analisar e buscar asrespecitvas soluções. Gostaria também de acrescentar que isso tudo é fruto de testes e maistestes, portanto podem haver outras variantes de código que realizam a mesma tarefa de formamais complexa ou mais simples.

Código fonte acompanha este exercício.

Delphi e BrOffice - Parte 3.zip

Continuação - Delphi e OpenOffice(BROffice) - 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. Nessemomento, vamos avançar para algumas questões ainda relacionadas com a formatação dascélulas. A parte da inicialização já é conhecida. O que gostaria de atentar aqui é o seguinte: ousuário deve primeiro criar o documento pressionando o botão 1º passo – Executar o Scalc. Ocódigo desse botão está definido da seguinte forma:

view sourceprint?1.procedure TForm1.Button1Click(Sender: TObject);2.begin3. BrOffice := CreateOleObject('com.sun.star.ServiceManager');4. Desktop := BrOffice.CreateInstance('com.sun.star.frame.Desktop');5. Documento := Desktop.LoadComponentFromURL('private:factory/scalc',6. '_blank', 0, VarArrayCreate([0,-1], varVariant));7. Planilha := Documento.getSheets.getByName('Planilha1');8.end;

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 16/22

As variáveis estão definidas como públicas para que possamos usá-las em toda a aplicação. Vamosentão iniciar a continuação da formatação. Codificaremos a mesclagem de células. Não é incomum

adicionar uma célula contendo um texto que seja um detalhamento de informações, algo como:ABCDE – Sistema de Automação Comercial – Relatório SPED para Contabilidade e para finalizar, umtom de cinza no fundo. A mesclagem exige duas células ou mais e pode estar dentro de umintervalo do tipo A2:F2 ou ainda A2:A10; podemos então executar essa tarefa na horizontal ouvertical, ou em ambos os casos, onde define-se o intervalo B5:G15. Vejamos:

view sourceprint?1.procedure TForm1.Button2Click(Sender: TObject);2.begin3. Faixa := Planilha.getCellRangeByPosition(StrToInt(e1.Text), StrToInt(e2.Text),4. StrToInt(e3.Text), StrToInt(e4.Text));5. Faixa.merge(true);6.end;

A variável Faixa é do tipo Variant, não poderia ser diferente nesse momento. O comando é simplese exige que se tenha quatro valores, ao invés de usarmos getCellByPosiotion onde temossomente uma célula, definiremos o comando como getCellRangeByPosition(Col_Ini, Row_Ini.Col_fim, Row_Fim) . Também é importante ressaltar que ao executar o Calc estou selecionandosempre a primeira planilha. Para completar nosso comando, executamos o métodoMerge(boolean). E a mágica está feita. Em nosso exemplo, você poderá fazer a mesclagemdiversas vezes, bastando para isso, mudar os valores e pressionar o botão mesclar células.

Quando o usuário do Excel digita um valore muito extenso, o conteúdo da célula passa a serrepresentado por cerquihas (#), no BrOffice é a mesma coisa, só que não tão enfático com o Excelque preenche a célula inteira com cerquilhas. Eu nunca prestei muita atenção no Excel com relação

a essa questão do ajuste de largura, sempre que terminava a inserção de dados nas colunasmandava que a cada célula preenchida, o comando AutoFit fosse executado. O Calc usa umcomando chamado OptimalWidth. É um método booleano. Em nosso exemplo, vamos trabalhar

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 17/22

com o ajuste de largura para todas as colunas da planilha ou somente para a coluna desejada. Oseguinte comando foi registrado no botão Ajuste a Coluna.

view sourceprint?01.procedure TForm1.Button3Click(Sender: TObject);02.var03.x : short;04.begin05. Texto[0] := 'Escrevendo um texto grande';06. Texto[1] := 'Luis Fernando Veríssimo';

07. Texto[2] := 'The Amazing Race';08. Texto[3] := 'República Federativa dos Estados Unidos do Brasil';09. Texto[4] := 'Um bilhão de Cruzeiros';10.11. if RadioButton1.Checked then12. Planilha.columns(SpinEdit1.Value).OptimalWidth := True13. else begin14. For x := 0 to 4 do15. begin16. Celula := Planilha.getCellByPosition(x, x + 1);17. Celula.setString(Texto[x]);18. end;19. Documento.getSheets.getByName('Planilha1').getColumns.OptimalWidth := True;20. end;21.end;

O array Texto é somente para preencher as células com um conteúdo relativamente extenso. Masno primeiro if encontramos a atribuição: Planilha.columns(SpinEdit1.Value).OptimalWidth :=True. Todas as planilhas possuem uma propriedade columns(Indice) que faz referência a umacoluna. Então acessamos o membro e definimos o índice. A propriedade OptimalWidth é definidapara True. Se o usuário de nossa aplicação escolher ajustar os tamanhos de todas as colunas daplanilha, o valor da variável array Texto será inserida em 5 colunas diferentes através do for. Masna seqüência de nosso código é quem fará o ajuste de todas as colunas. O códigoPlanilha.getColumns.OptimalWidth := True; Para que o ajuste fosse feito em todas as colunasda planilha, usamos o método getColumns que retorna todas as colunas e atribuímos então

OptimalWidth e pronto. Esse comando é interessante porque ao invés de fazermos tudoindividualmente, faz-se uma vez só e o efeito recai sobre todas as colunas.

Ainda tratando do tamanho de uma célula, podemos ajustar a largura da coluna ou a altura dalinha, não esqueça que quando fazemos isso, a coluna desde a primeira linha até a última ficarácom a mesma largura, o mesmo diz respeito a linha. Vejamos então a terceira parte que estárelacionada as dimensões em nossa aplicação. Para podermos aumentar ou diminuir as dimensõesde uma célula usaremos os membros novamente da planilha, nesse caso, getColumns egetRows. O método getColumns retorna todas as colunas de uma planilha e getRows retornatodas as linhas. Como consequência usamos um segundo método para informar qual das linhas oucolunas iremos alterar através de getByIndex(Indice) e então as propriedades width e height.Ambas, recebem um valor inteiro em centésimos de milímetros (1/100 mm).

view sourceprint?01.procedure TForm1.Button5Click(Sender: TObject);02.begin03. Planilha.getColumns.getByIndex(cbIni.ItemIndex).width := StrToInt(Edit1.Text);04.end;05.06.procedure TForm1.Button6Click(Sender: TObject);07.begin08. Planilha.getRows.getByIndex(SpinEdit2.Value - 1).height := StrToInt(Edit2.Text);09.end;

Usando o Excel como referência mais uma vez, quando estamos exportando valores para umaplanilha, acabamos aproveitando para definir a máscara como o valor da célula será apresentado.Faríamos algo do tipo: Selection.NumberFormat := '$#,##0.00'. No BrOffice não será diferente,será usado a mesma propriedade. Veja a seguir:

view sourceprint?

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 18/22

01.procedure TForm1.Button4Click(Sender: TObject);02.var03. i : Integer;04. cel : variant;05.begin06. for i := 0 to 1000 do07. begin08. Cel := Planilha.getCellByPosition(1, i);09. Cel.setValue(i);10. Celula := Planilha.getCellByPosition(0, i);

11. Celula.setValue(i);12. Celula.NumberFormat := i;13. end;14.end;

Existe uma recomendação, infelizmente não lembro quem agora fez a menção do limite quenumberFormat poderia alcançar, mas que um valor confortável estaria até mil, e eis o motivo doporque que meu laço for foi definido até esse valor. O que faço nesse processo é colocar o valor davariável i na coluna A e aplicar uma máscara através do método NumberFormat. Atente que oformato da célula passa a ser relativo ao contador do laço for – I. Faço isso, simplesmente paracoletar os formatos disponíveis (formatos padrão) e que poderão ser aplicados em qualquersituação. Na caixa de texto adicionada ao nosso programa, você encontrará a forma e o índice paraNumberFormat. Existe uma forma alternativa de verificar se existe uma máscara que vocêprecisa trabalhar, se ela não existir poderá ser adicionada nessa listagem, mas não é nosso foco nomomento.

A visibilidade de uma coluna pode ser aplicada de uma forma bastante simples, para issoestaremos trabalhando com o método IsVisible que recebe um valor booleano. O código abaixodispensa qualquer explicação já que foi detalhado até o método getByIndex. Defina o índice dacoluna e atribua True ou False.

view sourceprint?1.procedure TForm1.Button7Click(Sender: TObject);2.begin3. if rbInv.Checked then

4. Planilha.getColumns.getByIndex(ComboBox1.ItemIndex).isVisible := False5. else6. Planilha.getColumns.getByIndex(ComboBox1.ItemIndex).isVisible := True;7.end;

Para encerrarmos essa paste de nossos estudos com chave de ouro, vamos adicionar cabeçalho erodapé a nossa planilha. Gostaria de ressaltar que, deve ter pelo menos um valor em qualquercé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. O cabeçalho e rodapé do BrOffice possui o mesmosistema do Excel: é separado em 3 faixas – a esquerda, a direita e centralizado na página. Nasequencia, veja os códigos definidos para a inserção desses elementos em nosso documento:

view sourceprint?

01.//Insere o cabeçalho na planilha02.procedure TForm1.Button8Click(Sender: TObject);03.var04. Estilo, Padrao, Cabecalho : Variant;05.begin06. Estilo := Documento.StyleFamilies.getByName('PageStyles');07. Padrao := Estilo.getByName('Default');08. Padrao.HeaderIsOn := True;09. Cabecalho := Padrao.RightPageHeaderContent;10. Case rgAlign.ItemIndex of 11. 0 : Cabecalho.LeftText.setString(Edit3.Text);12. 1 : Cabecalho.CenterText.setString(Edit3.Text);13. 2 : Cabecalho.RightText.setString(Edit3.Text);14. end;15. Padrao.RightPageHeaderContent := Cabecalho;16.end;17.

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 19/22

18.//Insere o rodapé na planilha19.procedure TForm1.Button9Click(Sender: TObject);20.var21. Estilo, Padrao, Rodape : Variant;22.begin23. Estilo := Documento.StyleFamilies.getByName('PageStyles');24. Padrao := Estilo.getByName('Default');25. Padrao.FooterIsOn := True;26. Rodape := Padrao.RightPageFooterContent;27. Case rgAlign1.ItemIndex of 

28. 0 : Rodape.LeftText.setString(Edit4.Text);29. 1 : Rodape.CenterText.setString(Edit4.Text);30. 2 : Rodape.RightText.setString(Edit4.Text);31. end;32. Padrao.RightPageFooterContent := Rodape;33.end;

 Tanto para o cabeçalho como para o rodapé foram utilizadas as mesmas variáveis (Estilo e Padrao).Essa parte do sistema poderia ficar relativamente mais curta, já que a variável Estilo receberá oestilo sendo usado atualmente em seu documento. Na variável Padrão é aplicado o estilo chamadoDefault. Podem ser criados estilo diferentes de acordo com cada usuário. Se for usar um outroestilo, verifique os nomes dos estilos existentes. O que é que muda do Cabeçalho para o Rodapé?Olhe a terceira linha de cada um dos eventos, para o cabeçalho temos Padrao.HeaderIsOn, essaé uma propriedade booleana e informa que será aplicado o cabeçalho; para o rodapé usaremosPadrao.FooterIsOn. Na quarta linha de cada um dos códigos vemos a seguinte atribuição:Cabecalho := Padrao.RightPageHeaderContent; e Rodape :=Padrao.RightPageFooterContent; As variáveis cabeçalho e rodapé recebem as características, asinformações já contidas ou atribuídas anteriormente. Na seqüência, o Case verifica o tipo dealinhamento definido pelo usuário, que poderá ser: a esquerda, a direita e centralizado, sendoLeftText, CenterText e RightText. E obviamente o conteúdo que é uma string, passada porsetText(String contendo o texto). E finalizando, inserimos efetivamente as informações atravésda atribuição da linha de comando Padrao.RightPageHeaderContent := Cabecalho; ePadrao.RightPageFooterContent := Rodape; É um jogo de enviar e receber propriedades.

Espero que até esse momento essas informações tenham lhe sido úteis. Nos próximos passos

avançaremos para fórmulas, ordenações, criação de macros, impressão, margens e etc.Se desejar baixar o código fonte: Delphi e BrOffice - Parte 4.rar 

Abraços e até o próximo módulo.

Continuação - Delphi e OpenOffice(BROffice) - Parte 5 

CÉLULAS – Usando Funções ou definindo fórmulas 

I – INTRODUÇÃO 

Em nosso último artigo, vimos como configurar uma célula em suas diversas propriedades, tais

como: visibilidade, formato, mesclagem, largura e altura. Vimos também a parte do cabeçalho erodapé da nossa planilha. Agora, vamos partir para a questão de como trabalhar com fórmulas efunções. As chamadas para o aplicativo já são de seu conhecimento e entendo que não há maisnecessidade de enfocar, portanto, se você não acompanhou as explicações anteriores, recomendoque volte um ou dois tutoriais para poder prosseguir nessa 5ª parte.

II – ATRIBUINDO FUNÇÕES OU FÓRMULAS 

Até nosso último tutorial não tratamos de como fazer o processo mais importante: executaroperações de cálculo no CALC. Formatar é somente um recurso visual que ajuda na visualizaçãodos dados prontos para nossos usuários. A parte do cálculo é muito simples. Vejamos no códigoabaixo:

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 20/22

view sourceprint?1.procedure TForm1.btExecutarClick(Sender: TObject);2.begin3. AtribuirVariaveis;4. Planilha.getCellByPosition(0,0).Value := StrToFloat(A1.Text); //A15. Planilha.getCellByPosition(0,1).Value := StrToFloat(A2.Text); //A26. Planilha.getCellByPosition(0,2).Value := StrToFloat(A3.Text); //A37. Planilha.getCellByPosition(0,3).Formula := F1.Text;8.end;

A diferença básica apresentadas nos tutoriais anteriores é que agora estamos dizendo quetrabalhamos com valores através da atribuição Planilha.getCellByPosition(0,0).Value. Para que umcálculo seja executado é definido ao invés de value o atributo Formula. Não confunda com umafunção. O BROffice possui uma lista das funções mais utilizadas, não as confunda com as fórmulasque você cria. Nesse segundo momento, vamos verificar como usar as funções. Um detalheimportante eu devo deixar claro, se você tentar aplicar as funções usando o nome em português,algo como: SOMA(X:Y), MULT(X:Y) e assim por diante, provavelmente obterá um erro pelo nome dafunção. Esses nomes devem ser passados em Inglês. Para ter acesso a todas as funções, acesse osite:

http://wiki.services.openoffice.org/wiki/Documentation/How_Tos/Calc:_Functions_listed_by_category 

view sourceprint?01.procedure TForm1.buExecFuncaoClick(Sender: TObject);02.begin03. AtribuirVariaveis;04. Planilha.getCellByPosition(0,0).Value := StrToFloat(A4.Text); //A1

05. Planilha.getCellByPosition(0,1).Value := StrToFloat(A5.Text); //A206. Planilha.getCellByPosition(0,2).Value := StrToFloat(A6.Text); //A307. Case cbFuncao.ItemIndex of 08. 0 : Planilha.getCellByPosition(0,3).Formula := '=SUM(A1:A3)'; //soma09. 1 : Planilha.getCellByPosition(0,3).Formula := '=AVERAGE(A1:A3)'; //média10. 2 : Planilha.getCellByPosition(0,3).Formula := '=MAX(A1:A3)'; //máximo11. 3 : Planilha.getCellByPosition(0,3).Formula := '=MIN(A1:A3)'; //mínimo12. 4 : Planilha.getCellByPosition(0,3).Formula := '=PRODUCT(A1:A3)'; //multiplica13. end;14.end;

III – PROPRIEDADES DO DOCUMENTO 

Aproveitando o “gancho” para não ficar muito em cima de uma coisa só, vamos aproveitar paraadicionar propriedades do autor ao documento. As propriedades podem ser acessadas no menuArquivo do BrOffice e no submenu > Propriedades. Para atribuí-las ao seu documento, devemosusar a variável Documento e não a Planilha. Você pode definir outras poucas propriedades do

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 21/22

documento, porém as que estou passando abaixo, são as mais comuns. Em nosso tutorial,acrescentei mais uma procedure chamada Propriedades e que está definida na seguinte forma:

view sourceprint?01.procedure TForm1.Propriedades;

02.begin03. if chProp.Checked then04. begin05. Documento.DocumentInfo.Author := edAut.Text; //Autor do documento06. Documento.DocumentInfo.Title := edTit.Text; //Título do documento07. Documento.DocumentInfo.Subject := edAss.Text; //Assunto do documento08. Documento.DocumentInfo.Keywords := edKeyW.Text; //Palavras-Chave do documento09. Documento.DocumentInfo.Description := mmDesc.Text; //Descrição do conteúdo10. end;11.end;

E aqui na sequência, a forma como fica quando executamos o nosso aplicativo contendo asdescrições preenchidas, veja:

5/10/2018 Delphi e OpenOffice - slidepdf.com

http://slidepdf.com/reader/full/delphi-e-openoffice 22/22

Essa é mais uma parte de nosso tutorial. Espero agora que mesmo sendo pouca conteúdoapresentado, eles tenham sido de grande valia para implementar em suas aplicações.

Se desejar baixar o código fonte: Delphi e BrOffice - Parte 5.zip 

Abraços e até o próximo módulo.