Manipulando arquivos Excel sem uso da interoperabilidade ou conexão OLEDB
Como é de costume, sempre compartilho a minhas experiências e necessidades do dia a dia com você.
Recentemente tive a necessidade de ler um arquivo Excel em um WebService, porem o servidor na qual está hospedado não possui o Office instalado e nem poderia porque no final das contas seria necessário instala-lo em 3 servidores.
Com isso comecei a procurar por soluções e até que cheguei a solução criada pelo chinês Liu Junfeng que tambem possui uma materia no site do Code Project e seu fonte disponível no Google Code.
Os exemplos que se seguem poderão ser utilizado tanto em Windows Form quanto em Web Form. Então vamos ao que interessa.
Efetuando a leitura de um arquivo excel.
Crie um novo ASP.NET Web Site.
Iremos fazer referência ao Excel Library em nosso projeto. Clique com o botão direito
Adicione nele 1 FileUpload, 1 Button e 1 GridView. Nesse exemplo iremos fazer upload de um arquivo do Excel e exibi-lo em nosso GridView.
Agora vamos atribuir nosso código ao Button. Com isso, dé um duplo clique no Button e no evento dele criado iremos atribuir o código abaixo.
protected void btnProcessarExcel_Click(object sender, EventArgs e)
{
if (fupArquivo.HasFile)
{
// Recebe o arquivo em array de bytes
byte[] buffer = fupArquivo.FileBytes;
// Criar o arquivo em memoria
System.IO.MemoryStream stream = new System.IO.MemoryStream(buffer);
// Carrega o WorkBook do Excel
ExcelLibrary.SpreadSheet.Workbook workbook = ExcelLibrary.SpreadSheet.Workbook.Load(stream);
// Recupera o primeiro WorkSheet
ExcelLibrary.SpreadSheet.Worksheet worksheet = workbook.Worksheets[0];
// Cria uma tabela para armazenar o Excel
System.Data.DataTable dtExcel = new System.Data.DataTable();
dtExcel.Columns.Add("Coluna0", typeof(string));
dtExcel.Columns.Add("Coluna1", typeof(string));
// Percorre as linhas do Excel
for (int rowIndex = worksheet.Cells.FirstRowIndex; rowIndex <= worksheet.Cells.LastRowIndex; rowIndex++)
{
// Recupera a linha do Excel
ExcelLibrary.SpreadSheet.Row row = worksheet.Cells.GetRow(rowIndex);
// Adiciona os dados na tabela
System.Data.DataRow newRow = dtExcel.NewRow();
newRow["Coluna0"] = row.GetCell(0).StringValue;
newRow["Coluna1"] = row.GetCell(1).StringValue;
dtExcel.Rows.Add(newRow);
}
// Adicona a tabela com os dados do Excel no Grid
gridExcelProcessado.DataSource = dtExcel;
gridExcelProcessado.DataBind();
}
}
O código acima será executado quando o Button for clicado. O código irá verificar se o arquivo na qual foi feito o upload é válido e irá processa-lo. Os dados serão atribuidos em uma tabela para que possamos apresenta-lo em nosso Grid.
Criando um arquivo Excel
Para criarmos um arquivo do Excel é bem mais simples. O código abaixo deixa isso bem claro. Instanciamos nosso WorkBook e WorkSheet e adicionamos os valores nas celular e para concluir adicionamos nosso WorkSheet no WorkBook e em seguida é só salvar.
string file = "C:\\excel_exemplo.xls";
ExcelLibrary.SpreadSheet.Workbook workbook = new ExcelLibrary.SpreadSheet.Workbook();
ExcelLibrary.SpreadSheet.Worksheet worksheet = new ExcelLibrary.SpreadSheet.Worksheet("Planilha1");
worksheet.Cells[0, 0] = new ExcelLibrary.SpreadSheet.Cell("Cliente1");
worksheet.Cells[0, 1] = new ExcelLibrary.SpreadSheet.Cell("2344,89");
worksheet.Cells[1, 0] = new ExcelLibrary.SpreadSheet.Cell("Cliente2");
worksheet.Cells[1, 1] = new ExcelLibrary.SpreadSheet.Cell("1342,00");
worksheet.Cells[2, 0] = new ExcelLibrary.SpreadSheet.Cell("Cliente3");
worksheet.Cells[2, 1] = new ExcelLibrary.SpreadSheet.Cell("7634,78");
worksheet.Cells[3, 0] = new ExcelLibrary.SpreadSheet.Cell("Cliente4");
worksheet.Cells[3, 1] = new ExcelLibrary.SpreadSheet.Cell("4322,44");
workbook.Worksheets.Add(worksheet);
workbook.Save(file);
Vale lembrar que o Excel Library é uma excelente alternativa, que no meu caso foi de grande ajuda.
Agora é só explorar os recursos e mão a obra.
Irei deixar para você o projeto criado no artigo para download aqui.
Abraço e até a próxima.






Quando é winform, eu não tenho a opção HasFile, o que fazer nesse caso?
Olá Coimbra,
No caso do WinForm que você precisa de pegar o arquivo em array de byte (byte[]) você irá utilizar o System.IO.FileStream. Segue abaixo o exemplo.
string path_do_arquivo = @"C:\meu_arquivo_excel.xls";
if (System.IO.File.Exists(path_do_arquivo))
{
System.IO.FileStream stream = new System.IO.FileStream(arquivo, System.IO.FileMode.Open);
...
}
Depois basta utilizar a variável stream para fazer o load.
Abraço
Muito bom este artigo.Altamente didatico e util.Parabéns.Continue postando e ajudando todos os programadores e usuarios apavorados…
Cara, esta biblioteca é bacana e o exemplo que você deu foi ótimo, porém as funcionalidades de alterar a cor de fundo da planilha não consegui fazer funcionar, você sabe se as funcionalidades de formatação da celula funcionam?