Criando planilhas do Excel com o Delphi

Postado por Yoshio Iwamoto em 28/11/2007

É sempre importante saber exportar dados para vários formatos, seja para XML, CSV ou até HTML. E quando o cliente quer algum tipo de documento “palpável” para ele analisar, como os relatórios?
No Delphi tem gente que gosta de usar o Quickreport, outras preferem (ou são obrigadas) a utilizar o Rave Report ou Crystal Reports. Mas hoje eu vou mostrar como criar um relatório ou exportar dados utilizando planilhas do Excel.

Talvez você não precise criar relatórios em planilhas do Excel, mas vou contar um caso que ocorreu com um amigo meu...

Esse meu amigo estava fazendo um sisteminha em Delphi para rodar na versão japonesa do Windows XP. Mas a versão do Delphi dele não tinha Quickreport, só tinha o Rave Report, e o Rave Report não exibia caracteres japoneses. Como eu... digo, esse meu amigo, precisava de uma solução rapidamente, ele resolveu exportar os dados para o Excel. Assim resolveria o problema de exibição dos caracteres japoneses e o cliente teria um arquivo que é familiar a ele, tanto para somente visualizar quanto para imprimir os dados/relatório.

É mais complicado e lento gerar planilhas no Excel do que gerar relatórios no Rave Report, mas em compensação os dados exportados ficam melhor formatados e maleáveis.

Passos:
- Adicione a unit ExcelXP
- Adicionar as variaveis globais
- Instâncie os componentes no OnCreate
- Adicione um botao no Form
- Gerar a planilha no OnClick do botão
- Liberar a memoria no OnClose

  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, ExcelXP;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Button1: TButton;
  12. procedure FormCreate(Sender: TObject);
  13. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  14. procedure Button1Click(Sender: TObject);
  15. private
  16. { Private declarations }
  17. public
  18. { Public declarations }
  19. end;
  20.  
  21. var
  22. Form1: TForm1;
  23. LCID: Integer;
  24. ExcelApplication1: TExcelApplication;
  25. ExcelWorkbook1: TExcelWorkbook;
  26. ExcelWorksheet1: TExcelWorksheet;
  27. implementation
  28.  
  29. {$R *.dfm}
  30.  
  31. procedure TForm1.FormCreate(Sender: TObject);
  32. begin
  33. ExcelApplication1 := TExcelApplication.Create(nil);
  34. ExcelWorkbook1 := TExcelWorkbook.Create(nil);
  35. ExcelWorksheet1 := TExcelWorksheet.Create(nil);
  36. end;
  37.  
  38. procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
  39. begin
  40. ExcelWorksheet1.Free;
  41. ExcelWorkbook1.Free;
  42. ExcelApplication1.Free;
  43. end;
  44.  
  45. procedure TForm1.Button1Click(Sender: TObject);
  46. begin
  47. LCID := GetUserDefaultLCID;
  48.  
  49. ExcelApplication1.DisplayAlerts[LCID] := False;
  50.  
  51. ExcelApplication1.Workbooks.Add(EmptyParam, LCID);
  52. ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1] as _Workbook);
  53. ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _Worksheet);
  54.  
  55. ExcelWorksheet1.Activate(LCID);
  56. ExcelApplication1.ScreenUpdating[LCID] := true;
  57.  
  58. // nome da planilha (que aparece na aba)
  59. ExcelWorksheet1.Name := 'Relatório ou Exportação';
  60.  
  61. { inserindo dados na planilha }
  62.  
  63. // colocando titulo na primeira celula da planilha
  64. ExcelWorksheet1.Range['A1', 'A1'].Value2 := 'Título';
  65.  
  66. // unindo as células de A1 ate C1 para o titulo ocupar 3 colunas
  67. ExcelWorksheet1.Range['A1', 'C1'].Merge(True);
  68.  
  69. // formatando o titulo
  70. ExcelWorksheet1.Range['A1', 'C1'].Font.Bold := True;
  71. ExcelWorksheet1.Range['A1', 'C1'].Font.Size := 16;
  72. ExcelWorksheet1.Range['A1', 'C1'].Font.Color := RGB(255,0,0);
  73. ExcelWorksheet1.Range['A1', 'C1'].HorizontalAlignment := xlCenter;
  74. ExcelWorksheet1.Range['A1', 'C1'].VerticalAlignment := xlCenter;
  75.  
  76. // colocando os nomes dos campos na segunda linha
  77. ExcelWorksheet1.Range['A2', 'A2'].Value2 := 'Campo1';
  78. ExcelWorksheet1.Range['B2', 'B2'].Value2 := 'Campo2';
  79. ExcelWorksheet1.Range['C2', 'C2'].Value2 := 'Campo3';
  80. ExcelWorksheet1.Range['A2', 'C2'].Font.Bold := True;
  81. ExcelWorksheet1.Range['A2', 'C2'].Font.Color := RGB(0,0,255);
  82. ExcelWorksheet1.Range['A2', 'C2'].HorizontalAlignment := xlCenter;
  83. ExcelWorksheet1.Range['A2', 'C2'].VerticalAlignment := xlCenter;
  84.  
  85. // colocando os valores
  86. ExcelWorksheet1.Range['A3', 'A3'].Value2 := 'Valor1';
  87. ExcelWorksheet1.Range['B3', 'B3'].Value2 := 'Valor2';
  88. ExcelWorksheet1.Range['C3', 'C3'].Value2 := 'Valor3';
  89. ExcelWorksheet1.Range['A4', 'A4'].Value2 := 'Valor4';
  90. ExcelWorksheet1.Range['B4', 'B4'].Value2 := 'Valor5';
  91. ExcelWorksheet1.Range['C4', 'C4'].Value2 := 'Valor6';
  92.  
  93. // colocando borda nas celulas dos valores
  94. ExcelWorksheet1.Range['A3', 'C4'].Borders.Weight := xlThin;
  95.  
  96. ExcelWorksheet1.Range['A3', 'C4'].HorizontalAlignment := xlCenter;
  97. ExcelWorksheet1.Range['A3', 'C4'].VerticalAlignment := xlCenter;
  98.  
  99. { formatando a pagina de impressão }
  100.  
  101. // ajusta o tamanho das colunas
  102. ExcelWorksheet1.Cells.EntireColumn.AutoFit;
  103.  
  104. // define borda de impressao com cerca de 1cm
  105. ExcelWorksheet1.PageSetup.BottomMargin := 30;
  106. ExcelWorksheet1.PageSetup.LeftMargin := 30;
  107. ExcelWorksheet1.PageSetup.RightMargin := 30;
  108. ExcelWorksheet1.PageSetup.TopMargin := 30;
  109.  
  110. // deixa a planilha no centro da pagina horizontalmente
  111. ExcelWorksheet1.PageSetup.CenterHorizontally := True;
  112.  
  113. // imprime o numero da pagina no rodapé
  114. // '&P' e o codigo para numero de pagina
  115. ExcelWorksheet1.PageSetup.CenterFooter := '&P';
  116.  
  117. // Exibe o programa do Excel com a planilha criada
  118. ExcelApplication1.Visible[LCID] := True;
  119. end;
  120.  
  121. end.

E este é o resultado final:
Células do Excel

Enquanto os objetos não forem destruídos o Excel estará aberto na memória, por isso tem uns "Frees" no OnClose do Form. Aqui tem outro comandos que podem ser usados:

  1. // abre o PrintPreview (use depois do "ExcelApplication1.Visible[LCID] := True;")
  2. ExcelWorksheet1.PrintPreview;
  3.  
  4. // folha na horizontal
  5. ExcelWorksheet1.PageSetup.Orientation := xlLandscape;
  6.  
  7. // impressao em preto e branco
  8. ExcelWorksheet1.PageSetup.BlackAndWhite := True;
  9.  
  10. // Salva a planilha
  11. ExcelWorksheet1.SaveAs('c:\caminho\onde\voce\quer\salvar\planilha.xls');

Não dei muitos detalhes sobre os componentes utilizados, mas acho que já deve ajudar bastante pra procurar o resto :)

13 Comentário para “Criando planilhas do Excel com o Delphi”

  1. Leandro disse em 28/11/2007 as 14:03

    Gostei, do artigo.

    Mas gostaria de aprofundar mais, onde voce consegui estes dados, e onde posso procurar mais informações, sobre excel e delphi.

    Obrigado

  2. Marcos disse em 28/11/2007 as 13:24

    Não tenho o excel instalado no computador. Isso pode gerar um erro de CLASSE NÃO REGISTRADA.

  3. marco disse em 28/11/2007 as 18:40

    Gostei bastante das informações nas instruções acima, mas você sabe com inserir uma imagem no excel (bmp ou jpeg)?

  4. helio disse em 28/11/2007 as 14:41

    Meu muito boa essas dicas suas me deu uma duvida como faço para eu definir o tipo de celula por ex. queria definir minha celula como numero opu especial e como definir as bordas de maneira diferente que foi colocado no seu blog se souber algo me manda um e-mail..

  5. João Mello disse em 28/11/2007 as 22:27

    Achei muito bom seu artigo :D
    Poderia me tiara uma dúvida?

    Por que seu eu colocar isso dentro de uma Thread não funciona?

    Abraço!

  6. João Mello disse em 28/11/2007 as 21:41

    E para abrir um já existente? Como fica?

    Abraço!

  7. ThiagoSJK disse em 28/11/2007 as 00:10

    Gostaria de saber se é necessário ter o excel instalado no pc para usar as ferramentas apresentadas nesse artigo.

  8. Mauricio disse em 28/11/2007 as 16:28

    Muito bom…parabéns…me ajudou e muito…era isso que eu precisava..agora é so se aprofundar mais..

    Obrigado..pela ajuda.

  9. Vergara disse em 28/11/2007 as 14:16

    Tem como, ao final da criação do arquivo de excel, o programa em delphi matar o processo do excel? Porque continua na memória e, às vezes, dá erro.

  10. site disse em 28/11/2007 as 16:01

    muito legal esse procedimento….não sabia que dava!

  11. alexandre disse em 28/11/2007 as 12:55

    Por favor como adicionar uma 4 aba no excel usando o delphi?

  12. Jéssica disse em 28/11/2007 as 15:12

    Olá!!
    Muito bom o Post!!

    Gostaria de saber se há como atribuir uma imagem à determinada Célula.

    Obrigada desde já

    att,
    Jéssica Almeida

  13. Jéssica disse em 28/11/2007 as 14:13

    oi, eu di novo!!

    Como alterar largura das colunas e como alterar o formato de uma célula para ‘moeda’, com 2 casas decimais e sem símbolo de moeda ?

    Brigadaaaaa

    att
    Jéssica Almeida

Trackback URI | RSS dos comentários

Deixe um comentário

Av. Conselheiro Nébias, 368A, Cj. 413
Vila Mathias - Santos - SP
Telefone: (13) 3345-4580

© 2008 - 2009 Stiod. Todos os direitos reservados.