Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Alisson Freitas

Salva planilha BrOffice pelo Delphi

Recommended Posts

Boa Tarde

 

Gostaria de saber se alguém sabe como faço para criar uma planilha do br-office no delphi.

Precisso gerar uma planilha que apresente os dados de uma tabela do banco de dados.

Tambem que salve esta planilha com o nome da tabela do banco de dados e a data da criação sem que o usuário confirme salvar a tabela.

Obrigado, fique aguardando

Compartilhar este post


Link para o post
Compartilhar em outros sites

Putz.... existem diversas formas velhinho...

 

Ja usei e vi Word com Delphi, Excel com Delphi... mas BrOffice nunca mexi...

 

Talvez com DDE de para fazer... mas ai precisa ver...

 

Qual bd você ta usando?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, a geração para o OpenOffice e BROffice é a mesma, pode-se dizer que é mais complicado do que gerar para excel, mas é mais simples na questão dos comandos que se pode utilizar, um pequeno exemplo do que você pode gerar:

 

Declare na uses: ComObj

 

procedure TForm1.BitBtn1Click(Sender: TObject);
var
	parametro, OpenOffice, OpenDesktopOpenOffice, CalcOpenOffice, SheetsOpenOffice, SheetOpenOffice: Variant;
	x, y: integer;
	arquivo: string;

	function CriaParametroOpenOffice(nome: string; tipoData: variant): variant;
	var
		reflection: variant;
	begin
	reflection:=OpenOffice.CreateInstance('com.sun.star.reflection.CoreReflection');
	reflection.forName('com.sun.star.beans.PropertyValue').createObject(result);
	result.Name:=nome;
	result.Value:=tipoData;
	end;

	function FileName2URL(FileName: string): string;
	begin
	result:='';
	if (LowerCase(copy(FileName,1,8)) <> 'file:///') then
		result:='file:///';
	result:=result + StringReplace(FileName, '\', '/', [rfReplaceAll, rfIgnoreCase]);
	end;
begin
arquivo:=FileName2URL('c:\teste.ods');

OpenOffice:=CreateOleObject('com.sun.star.ServiceManager');
OpenDesktopOpenOffice:=OpenOffice.CreateInstance('com.sun.star.frame.Desktop');
parametro:=VarArrayCreate([0, 0], varVariant);
parametro[0]:=CriaParametroOpenOffice('Hidden',True);
CalcOpenOffice:=OpenDesktopOpenOffice.LoadComponentFromURL('private:factory/scalc', '_blank', 0, parametro);
SheetsOpenOffice:=CalcOpenOffice.Sheets;
SheetOpenOffice:=SheetsOpenOffice.getByIndex(0);

for x:=0 to 9 do
	for y:=0 to 9 do
		SheetOpenOffice.GetCellByPosition(x,y).SetString(IntToStr(x + 1) + ' X ' + IntToStr(y + 1));

parametro:=VarArrayCreate([0, 0], varVariant);
parametro[0]:=CriaParametroOpenOffice('Hidden',False);
CalcOpenOffice.StoreToURL(arquivo, parametro);
OpenDesktopOpenOffice.LoadComponentFromURL(arquivo, '_blank', 0, parametro);
OpenOffice:=Unassigned;
end;

Isso vai gerar uma planilha bem simples, a partir disto você pode gerar o que mais desejar. No site oficial do open office, tem uma documentação da API para desenvolvedores, lá consta os demais comandos que se pode utilizar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado Marcio.

 

Era justamento oque eu estava tentando fazer.

Sera que pode me ajudar em mais uma duvida, estou tentando fazer com que as colunas fiquem no tamanho dos campos do banco de dados. Tipo o campo nome tem 40 caracteres, deixar a coluna do nome no tamanho dos 40 caracteres para o usuario nao ter que almentar ou diminuir a largura da coluna.

 

Figo no aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para mudar o tamanho de uma coluna pode usar este comando:

 

//Tamanho da célula

SheetOpenOffice.getCellRangeByName('A1').GetColumns.Width:=2500; //milimetros

 

 

Alguns outros:

 

//Para mudar tamanho da fonte:

SheetOpenOffice.getCellRangeByName('A1').setPropertyValue('CharHeight',8);

//Negrito

SheetOpenOffice.getCellRangeByName('A1').setPropertyValue('CharWeight',200);

//Cor da célula:

SheetOpenOffice.getCellRangeByName('A1').setPropertyValue('CellBackColor',clLime);

//Alinhamento horizontal:

SheetOpenOffice.getCellRangeByName('A1').setPropertyValue('HoriJustify',2);

//Formatar

SheetOpenOffice.getCellRangeByName('A1').setPropertyValue('ConditionalFormat','0,00%');

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado novamente Marcio.

 

Sem querer abusar da sua boa vontade.

Convertendo uma tabela do banco de dados me deparei com um problema.

Uma planilha do broffice tem 65.536 linhas, tenho algumas tabelas com 100 mil ou mais registros, estive pensando se tem como eu abrir uma nova guia para que eu possa inserir esses geristros na proxima aba de planilha. (planilha1, planilha2, planilha3)

Fico no aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que tem como sim, teria somente que adicionar um controle, para que quando chegar no final mudar de planilha, tem um comando que você diz qual planilha vai usar, que é o seguinte:

 

SheetOpenOffice:=SheetsOpenOffice.getByIndex(0);

No caso então teria de uma o getByIndex para 1 para pegar o próximo ficando:

 

SheetOpenOffice:=SheetsOpenOffice.getByIndex(1);

Acho que deve de funcionar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia

 

 

Marcio vou abusar da sua boa vontade novamente.

As dicas que você me deu foram de grande ajuda.

Esta semana me deparei com outro problema, na função

 

//mudar de planilha
SheetOpenOffice:=SheetsOpenOffice.getByIndex(1);

 

O código altera a aba da planilha a ser usada (normalmente ja vem criado 3 abas), mas se eu precisar criar uma nova aba não consegue da erro.

Sera que você teria alguma idéia de como fazer para criar estas novas abas???

Obrigado fico no aguardo.

 

 

Ass.: Alisson Freitas

Compartilhar este post


Link para o post
Compartilhar em outros sites

De uma forma simples de se fazer pode ser:

 

CalcOpenOffice.Sheets.InsertNewByName('Nome da Planilha',0);

Onde que passa por parâmetro o nome da planilha e depois a posição que a mesma deve de ficar...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde a todos

 

Meus amigos novamente estou com problemas no sistema.

Quanto tento converter uma tabela muito grande, ela acaba nao convertendo.

Tenta carregar todo o conteudo desta tabela em memoria ou cach ou deixa o processo muito lento.

Eu estava pensando na possibilidade de ir salvando este arquivo aos poucos, para nao sobrecarregar tanto o micro.

Tem alguma ideia para esse problema? Se possivel uma dica de como fazer uma solução pra este problema.

Obrigado novamente

Fico no aguardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia a todos http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

Marcio estou tentando converter uma tabela com quase 70.000 registros.

O sistema roda por horas para conseguir converter.

Usando 100% de processamento, 100% de memoria e fazendo swap.

Eu tinha pensado em 2 opções.

1º em salvar o arquivo a cada 10.000 linhas +- e editar o arquivo em seguida. Mas não sei se seria viavel esta opção.

2º enquanto toda a planilha não é carregada em memoria ele nao mostra o broffice, tinha pensado em conforme ir carregando ja mostrar o broffice, para não exigir tanto da memoria. Ir acrescentando as linhas com o broffice aberto antes de salvar o projeto.

O problema de usar o Excel como você sugeriu é a licença para o mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho isto, no caso já monitorou se o tempo de demora é para puxar as informações do BD ou quando esta gravando ?

Pois no caso o que poderia tentar é carregar tudo em um TStringGrid e depois lançar para o OO

Compartilhar este post


Link para o post
Compartilhar em outros sites

ow.. vou tentar ajudar... bom... procure estudar mais sobre o banco que você esta usando... se form mysql, existe um comando que retorna uma faixa de registros após um determinado registro.. com isso você podeiria receber a tabela aos poucos e ir preechendo a planilha...

se eu não me engano o comando é assim(acho que funciona para todos os bancos).

 

select * from <tabela> where 0<> 1 interval "alguma coisa"...descupa naw poder dar o comando agora, é que estou trabalhando e não posso fica muito na internet...

 

mas consulte o google sobre select interval...

 

ok...espero ter ajudado....

 

 

ah...e não se esqueça de liberar a memória a cada query, isso ajuda muito na parte de ram e de swap.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estranho isto, no caso já monitorou se o tempo de demora é para puxar as informações do BD ou quando esta gravando ?

Pois no caso o que poderia tentar é carregar tudo em um TStringGrid e depois lançar para o OO

Bom dia Marcio

Pelo o que eu percebi esta demorando para puxar as informações do BD, o comando lê a informação do banco e depois insere na planilha. E esta leitura do banco, vai sobrecarregando a memoria.

Teste o sistema com uma tabela com +- 9.000 linhas, levou 11 minutos pra gerar a planilha, fiz outro teste com uma tabela bem maior 75.000 linhas, o sistema rodou um dia e uma noite e não carregou a planilha. Depois de algum tempo a taxa de entrada de dados cai muito.

Estou tentando varias possíveis soluções mas até o momento nada resolve.

Fico no aguardo.

Obrigado

Ass.: Alisson Freitas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente a demora é grande demais, dependendo do BD ele armazena tudo na memória não fazendo swap gerando assim o erro...

Pelo visto então o problema é em relação a puxar os dados do BD para a gravação, acredito que a simples gravação no arquivo não deve de demorar, o que poderia fazer é um for de uns 100.000 e ver o quanto tempo demora esta gravação...

Particularmente achei muito mais rápido o OO em relação ao excel na questão de gravação...

Compartilhar este post


Link para o post
Compartilhar em outros sites

ow...vim me corrigir.....eu falei ai a cima sobre "select interval" mas o correto é "select limit"..... isso retorna apenas uma faixa de registros, ou seja, você pode fazer a sua consulta em pedaços...primeira consulta de 1 a 1000, a segunda de 1001 a 2000 e assim por diante.

 

espero ter ajudado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara...eu ja t disse mas acho que tu nem leu...esquece essa historia de querer fazer a query de um vez so...cara....pra isso você tem que ter baita de um servidor...com processador violento e memória para #@?$%~....

 

cara...faz a consulta em partes.....procurre sobre select limit...... e você vai pegar os registros tipo de 1 a 10000 e processa eles...depois tu pega os de 10001 ate 20000 e processa e assim vai indo...fassa um rotina em Delphi para controlar isso....

 

com isso você ainda ganha tempo pra criar novas planilhas...

 

ok

 

o...qualquer coisa: rafinha_tonello@yahoo.com.br

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara...eu ja t disse mas acho que tu nem leu...esquece essa historia de querer fazer a query de um vez so...cara....pra isso você tem que ter baita de um servidor...com processador violento e memória para #@?$%~....

 

cara...faz a consulta em partes.....procurre sobre select limit...... e você vai pegar os registros tipo de 1 a 10000 e processa eles...depois tu pega os de 10001 ate 20000 e processa e assim vai indo...fassa um rotina em Delphi para controlar isso....

 

com isso você ainda ganha tempo pra criar novas planilhas...

 

ok

 

o...qualquer coisa: rafinha_tonello@yahoo.com.br

Ola Raficcha

 

Eu li sim o seu comentario, estou implementando, e testando para ver quando que começa a nao responder mais, e ficar lento.

Assim que tiver pronto eu posto aqui no topico.

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.