terça-feira, 26 de julho de 2011

Excel e C#: Adicionar célula ou linha + Modificar fonte, cores e bordas

A ideia é que o post de hoje seja rápido e o mais curto possível.
Vou agrupar todas as explicações em um único código.

Como foi no post anterior, vou partir do princípio de que o componente para trabalhar com Excel já foi adicionado às referências do projeto.

Se não estiver entendendo absolutamente nada do que está lendo sugiro ver o post Criar planilha do Excel em C#. Lá tem um tutorial para adicionar o componente Microsoft Excel 12.0 Object Library às referências, não que não sirva pra outras versões, mas a que está lá é a 12.0.

No meu primeiro post sobre Excel e C#, o qual eu citei acima, eu coloquei um método para remover linhas do Excel. Recentemente me dei conta de que precisava de um método para adicionar linhas também. Essa vai ser a primeira parte do post. É bem simples: usando um Excel.Range eu defino qualquer célula que pertença à linha onde eu quero inserir uma nova linha e então eu uso o método Insert para inserir uma linha. É possível inserir uma única célula também, mas os detalhes ficam no código.

A segunda parte do código é para mostrar um pouco de formatação de células: como mudar a fonte, o tamanho da fonte, a cor, opções de negrito, sublinhado e itálico, alinhamento do texto, tamanho da célula, cor de fundo da célula e opções de borda.

Basicamente é isso.
Então vamos começar.
Vou fazer do mesmo jeito que fiz no post anterior, vou só abrir um documento que tenho num Form vazio e fazer as alterações no construtor, apenas pra exemplificar, mostrando os métodos responsáveis por cada uma das coisas que citei acima.




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;

namespace TesteExcel
{
    public partial class Form1 : Form
    {
        private Excel.Application excelApp = null;
        private Excel.Workbook arquivoDeTrabalho = null;
        private Excel.Worksheet planilha = null;

        public Form1()
        {
            InitializeComponent();

            excelApp = new Excel.Application();
            excelApp.DisplayAlerts = false;
            arquivoDeTrabalho = (Excel.Workbook)excelApp.Workbooks.Open(
                "C:\\Teste.xlsx", 0, true, 5, "", "",
                true, Excel.XlPlatform.xlWindows, "\t", false,
                false, 0, true, null, null);
            planilha = (Excel.Worksheet)arquivoDeTrabalho.Sheets[1];

            excelApp.Visible = true;

            try
            {
                /*Adiciona uma única célula.*/
                celulas = planilha.get_Range(planilha.Cells[1, 1],
                    planilha.Cells[1, 1]);
                celulas.Insert(Excel.XlInsertShiftDirection.xlShiftDown,
                    Excel.XlInsertFormatOrigin.xlFormatFromRightOrBelow);
                /*Adiciona uma linha*/
                celulas = planilha.get_Range(planilha.Cells[1, 1],
                    planilha.Cells[1, 1]).EntireRow;
                celulas.Insert(Excel.XlInsertShiftDirection.xlShiftDown,
                    Excel.XlInsertFormatOrigin.xlFormatFromRightOrBelow);
                /*Define textos para as células usadas.*/
                planilha.Cells[1, 1] = "Fonte Verdana";
                planilha.Cells[1, 2] = "Fonte tamanho 7,5";
                planilha.Cells[1, 3] = "Fonte cor Vermelha";
                planilha.Cells[2, 1] =
                    "Fonte em itálico. Texto centralizado";
                planilha.Cells[2, 2] =
                    "Fonte sublinhada. Texto à esquerda.";
                planilha.Cells[2, 3] =
                    "Fonte em negrito. Texto à direita.";
                planilha.Cells[3, 1] =
                    "Fundo Amarelo. Texto justificado.";
                planilha.Cells[3, 2] =
                    "Célula com tamanho alterado. 20,0x50,0";
                planilha.Cells[3, 3] = "Sem quebra de texto automática.";

                /*Define um tamanho padrão para as células.*/
                celulas = planilha.get_Range(planilha.Cells[1, 1],
                    planilha.Cells[3, 3]);
                celulas.ColumnWidth = 15.0F;
                celulas.RowHeight = 45.0F;
                celulas.WrapText = true; //Quebra de texto automática.

                /*Define a fonte da célula como Verdana*/
                celulas = planilha.get_Range(planilha.Cells[1, 1],
                    planilha.Cells[1, 1]);
                celulas.Font.Name = "Verdana";

                /*Define o tamanho da fonte como 7,5*/
                celulas = planilha.get_Range(planilha.Cells[1, 2],
                    planilha.Cells[1, 2]);
                celulas.Font.Size = 7.5F;

                /*Define a cor da fonte como vermelha*/
                celulas = planilha.get_Range(planilha.Cells[1, 3],
                    planilha.Cells[1, 3]);
                celulas.Font.Color = Excel.XlRgbColor.rgbRed;

                /*Define o texto em itálico e centralizado.*/
                celulas = planilha.get_Range(planilha.Cells[2, 1],
                    planilha.Cells[2, 1]);
                celulas.Font.Italic = true;
                celulas.HorizontalAlignment =
                    Excel.XlHAlign.xlHAlignCenter;

                /*Define o texto sublinhado e à esquerda.*/
                celulas = planilha.get_Range(planilha.Cells[2, 2],
                    planilha.Cells[2, 2]);
                celulas.Font.Underline = true;
                celulas.HorizontalAlignment =
                    Excel.XlHAlign.xlHAlignLeft;

                /*Define o texto em negrito e à direita.*/
                celulas = planilha.get_Range(planilha.Cells[2, 3],
                    planilha.Cells[2, 3]);
                celulas.Font.Bold = true;
                celulas.HorizontalAlignment =
                    Excel.XlHAlign.xlHAlignRight;

                /*Define o fundo amarelo e o texto justificado.*/
                celulas = planilha.get_Range(planilha.Cells[3, 1],
                    planilha.Cells[3, 1]);
                celulas.Interior.Color = Excel.XlRgbColor.rgbYellow;
                celulas.HorizontalAlignment =
                    Excel.XlHAlign.xlHAlignJustify;

                /*Muda o tamanho da célula e, por consequência, de
                 toda a linha e de toda a coluna.*/
                celulas = planilha.get_Range(planilha.Cells[3, 2],
                    planilha.Cells[3, 2]);
                celulas.ColumnWidth = 20.0F;
                celulas.RowHeight = 50.0F;

                /*Define célula sem quebra de texto.*/
                celulas = planilha.get_Range(planilha.Cells[3, 3],
                    planilha.Cells[3, 3]);
                celulas.WrapText = false;

                /*Define células com bordas.*/
                celulas = planilha.get_Range(planilha.Cells[1, 1],
                    planilha.Cells[1, 3]);
                celulas.Borders.LineStyle =
                    Excel.XlLineStyle.xlContinuous;

                /*Também é possível remover ou coloca apenas algumas
                bordas, a propriedade Borders é indexável.*/
                celulas = planilha.get_Range(planilha.Cells[2, 2],
                    planilha.Cells[3, 3]);
                celulas.Borders.LineStyle =
                    Excel.XlLineStyle.xlContinuous;
                celulas.Borders[
                    Excel.XlBordersIndex.xlInsideHorizontal].LineStyle =
                    Excel.XlLineStyle.xlLineStyleNone;
                celulas.Borders[
                    Excel.XlBordersIndex.xlInsideVertical].LineStyle =
                    Excel.XlLineStyle.xlLineStyleNone;
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }

            MessageBox.Show("Pausa para ver o documento.");

            arquivoDeTrabalho.Close(false, "", false);
            excelApp.Quit();
        }
    }
}


Como podem ver eu coloquei uma MessageBox para fazer uma pausa no construtor.
Repetindo, é só uma exemplificação dos métodos existentes. Normalmente eu crio uma classe para o post, mas dessa vez resolvi deixar apenas essa amostra dos métodos. Além disso assim fica um exemplo um que pode ser compilado e testado diretamente.

A maioria das coisas que está no código eu descobri sozinho, enquanto "desvendava" a classe do Excel, mas a parte da indexação das bordas foi uma coisa que me deu trabalho. É bem óbvio, mas não me passou pela cabeça e então vou dar os créditos merecidos ao local onde achei a solução:
http://www.debugging.com/bug/20758

Outros posts sobre Excel e C#:
Criar planilha do Excel em C#
Excel e C#: Abrir uma planilha e ler células


Por hoje era só.
Qualquer dúvida, é só comentar.

3 comentários:

Anônimo disse...

Parabéns pelo trabalho! visito sempre seu site... Aproveitando, gostaria de indicar o site www.iAulas.com.br lá você vai encontrar mais de 10 mil apostilas para download gratuito dos mais variados assuntos, inclusive são dezenas de apostilas sobre Excel... espero ter ajudado...

_ivan disse...

Muito obrigado!

Acessei o site e achei bastante coisa interessante. Assim que tiver tempo darei uma olhada nas apostilas.


Obrigado mais uma vez.

marllon disse...

ótimo trabalho!