Ir para o conteúdo do rodapé
USANDO O IRONXL

Como ler arquivos do Excel em C# em vez de usar StreamReader

Muitos desenvolvedores C# enfrentam um desafio frustrante ao trabalhar com arquivos Excel: a classe Leitor de fluxo, que lida de forma confiável com arquivos de texto, falha completamente quando apontada para um documento Excel. Se você tentou ler um arquivo Excel usando Leitor de fluxo em C# apenas para ver caracteres embaralhados, ruído binário ou exceções inesperadas, você está em boa companhia. Este guia explica exatamente por que Leitor de fluxo não consegue lidar com arquivos Excel e mostra como resolver o problema corretamente usando IronXL - uma biblioteca Excel dedicada for .NET que não requer instalação do Excel.

A confusão muitas vezes surge porque arquivos CSV - que o Excel pode abrir e salvar - funcionam bem com Leitor de fluxo. Arquivos Excel reais (XLSX, XLS, XLSM) requerem uma abordagem fundamentalmente diferente. Compreender esta distinção poupará horas de depuração e o direcionará para a ferramenta certa para o trabalho.

Alternativa para Ler Arquivo Excel Usando Leitor de fluxo em C# - IronXL: Imagem 1 - IronXL

Por Que o Leitor de fluxo Não Pode Ler Arquivos Excel?

Leitor de fluxo é um leitor baseado em texto. Ele lê dados de caracteres linha por linha usando uma codificação especificada (UTF-8, ASCII, etc.) e não tem consciência de estruturas binárias ou arquivos compactados. A documentação oficial do Leitor de fluxo do .NET confirma que esta classe é projetada exclusivamente para texto codificado por caracteres. Arquivos Excel, apesar de parecerem planilhas simples, são na verdade estruturas complexas binárias ou XML comprimidas em ZIP que Leitor de fluxo não pode interpretar.

Quando você abre um arquivo XLSX com Leitor de fluxo, você está essencialmente tentando ler um arquivo ZIP como texto simples. O resultado é um fluxo de ruído binário em vez de dados de sua planilha.

// This code will NOT work -- demonstrates the problem
using Leitor de fluxo reader = new Leitor de fluxo("ProductData.xlsx");
string content = reader.ReadLine();
Console.WriteLine(content); // Outputs garbled binary data like "PK♥♦"
// This code will NOT work -- demonstrates the problem
using Leitor de fluxo reader = new Leitor de fluxo("ProductData.xlsx");
string content = reader.ReadLine();
Console.WriteLine(content); // Outputs garbled binary data like "PK♥♦"
$vbLabelText   $csharpLabel

Quando você executa este trecho de código, em vez de ver as linhas da sua planilha, você encontra caracteres binários como PK♥♦ ou ruído semelhante. Isso acontece porque:

  • Arquivos XLSX são arquivos ZIP contendo múltiplos arquivos XML: planilhas, estilos, cadeias compartilhadas, relacionamentos. A documentação do Open XML SDK fornece uma descrição detalhada dessa estrutura.
  • Arquivos XLS usam um formato proprietário binário (BIFF -- Binary Interchange Formato de Arquivo)
  • Leitor de fluxo aplica uma codificação de caracteres a qualquer byte que lê, produzindo uma saída sem sentido para ambos os formatos

Exemplo de Entrada

Alternativa para Ler Arquivo Excel Usando Leitor de fluxo em C# - IronXL: Imagem 2 - Entrada do Excel

Saída Garminhada Quando Usando Leitor de fluxo

Alternativa para Ler Arquivo Excel Usando Leitor de fluxo em C# - IronXL: Imagem 3 - Saída do Console

Por Que CSV Funciona Mas XLSX Não

CSV (Valores Separados por Vírgula) é um formato de texto simples. Cada linha é uma linha de texto, e cada coluna é separada por uma vírgula. Leitor de fluxo lê arquivos CSV sem problemas porque eles não contêm dados binários ou arquivos comprimidos. XLSX é fundamentalmente diferente: ele embala múltiplos documentos XML dentro de um contêiner ZIP com metadados, temas e definições de estilo. Não há uma leitura simples linha por linha possível.

Esta distinção importa ao escolher seu ferramental. Para arquivos CSV, Leitor de fluxo ou File.ReadAllLines são perfeitamente adequados. Para verdadeiros livros de trabalho Excel, é necessário uma biblioteca que entenda o formato a um nível estrutural.

Como instalar o IronXL em um projeto .NET?

IronXL é uma biblioteca .NET que lê, escreve e cria arquivos Excel sem exigir que o Microsoft Excel esteja instalado. Ele suporta formatos XLSX, XLS, XLSM, CSV e TSV, e é executado no Windows, Linux, macOS e containers Docker.

Para instalar o IronXL, use o Console do Gerenciador de Pacotes NuGet ou a CLI do .NET. O pacote é publicado no NuGet.org como IronXL:

Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
SHELL

Após a instalação, adicione a diretiva using IronXL; ao seu arquivo e você estará pronto para trabalhar com documentos Excel.

Alternativa para Ler Arquivo Excel Usando Leitor de fluxo em C# - IronXL: Imagem 5 - Instalação

Para etapas detalhadas de instalação e opções de configuração do NuGet, veja o guia de instalação do IronXL NuGet. Uma licença de teste gratuita está disponível para que você possa avaliar o IronXL em seu projeto antes de comprar.

Alternativa para Ler Arquivo Excel Usando Leitor de fluxo em C# - IronXL: Imagem 4 - Plataforma Cruzada

Como Ler Arquivos Excel com o IronXL?

IronXL fornece uma API intuitiva para ler arquivos Excel em C#. Ao contrário de Leitor de fluxo, o IronXL entende a estrutura interna do Excel e oferece acesso limpo a linhas, colunas e valores de células. A documentação do IronXL fornece referências completas da API para todas as operações suportadas.

Aqui está como ler um arquivo Excel usando IronXL com instruções de nível superior:

using IronXL;

// Load the Excel file from disk
WorkBook workbook = WorkBook.Load("ProductData.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Read a specific cell by address
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");

// Iterate over a range of cells
foreach (var cell in worksheet["A1:C10"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Read a numeric value
decimal price = worksheet["B2"].DecimalValue;
Console.WriteLine($"Price: {price:C}");
using IronXL;

// Load the Excel file from disk
WorkBook workbook = WorkBook.Load("ProductData.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Read a specific cell by address
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");

// Iterate over a range of cells
foreach (var cell in worksheet["A1:C10"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}

// Read a numeric value
decimal price = worksheet["B2"].DecimalValue;
Console.WriteLine($"Price: {price:C}");
$vbLabelText   $csharpLabel

O método WorkBook.Load detecta automaticamente o formato do arquivo (XLSX, XLS, XLSM, CSV) e lida com todo o parsing complexo. Você acessa células usando a notação padrão do Excel, como "A1", ou intervalos como "A1:C10", o que torna o código imediatamente legível para qualquer pessoa familiarizada com planilhas.

Acessando Múltiplas Planilhas

Muitos livros de trabalho contêm mais de uma planilha. O IronXL permite que você abra e navegue pelos livros de trabalho com enumeração completa de planilhas:

using IronXL;

WorkBook workbook = WorkBook.Load("MultiSheet.xlsx");

// List all worksheets
foreach (WorkSheet sheet in workbook.WorkSheets)
{
    Console.WriteLine($"Sheet: {sheet.Name}, Rows: {sheet.RowCount}");
}

// Access a sheet by name
WorkSheet summary = workbook.GetWorkSheet("Summary");
string totalRevenue = summary["B20"].StringValue;
Console.WriteLine($"Total Revenue: {totalRevenue}");

// Access a sheet by index
WorkSheet firstSheet = workbook.WorkSheets[0];
int lastRow = firstSheet.RowCount;
Console.WriteLine($"Last row in first sheet: {lastRow}");
using IronXL;

WorkBook workbook = WorkBook.Load("MultiSheet.xlsx");

// List all worksheets
foreach (WorkSheet sheet in workbook.WorkSheets)
{
    Console.WriteLine($"Sheet: {sheet.Name}, Rows: {sheet.RowCount}");
}

// Access a sheet by name
WorkSheet summary = workbook.GetWorkSheet("Summary");
string totalRevenue = summary["B20"].StringValue;
Console.WriteLine($"Total Revenue: {totalRevenue}");

// Access a sheet by index
WorkSheet firstSheet = workbook.WorkSheets[0];
int lastRow = firstSheet.RowCount;
Console.WriteLine($"Last row in first sheet: {lastRow}");
$vbLabelText   $csharpLabel

Esta abordagem é muito mais limpa do que qualquer tentativa de parsear Excel com Leitor de fluxo ou manipulação de strings.

Como Ler Dados do Excel a partir de um Fluxo de Memória?

Aplicações do mundo real frequentemente precisam processar arquivos Excel de fluxos ao invés de arquivos de disco. Os cenários comuns incluem lidar com carregamento de arquivos de formulários web, recuperar livros de trabalho de uma coluna BLOB de banco de dados ou processar arquivos baixados do armazenamento em nuvem (Azure Blob Storage, AWS S3). O IronXL lida com esses cenários através de WorkBook.FromStream:

using IronXL;
using System.IO;

// Simulate reading file bytes (e.g., from a database or web upload)
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");

using MemoryStream stream = new MemoryStream(fileBytes);
WorkBook workbook = WorkBook.FromStream(stream);
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Get row and column counts
Console.WriteLine($"Rows: {worksheet.RowCount}, Columns: {worksheet.ColumnCount}");

// Convert to DataTable for database or grid binding
var dataTable = worksheet.ToDataTable(useHeaderRow: true);
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");

foreach (System.Data.DataRow row in dataTable.Rows)
{
    string productName = row["ProductName"]?.ToString() ?? string.Empty;
    string sku = row["SKU"]?.ToString() ?? string.Empty;
    Console.WriteLine($"Product: {productName}, SKU: {sku}");
}
using IronXL;
using System.IO;

// Simulate reading file bytes (e.g., from a database or web upload)
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");

using MemoryStream stream = new MemoryStream(fileBytes);
WorkBook workbook = WorkBook.FromStream(stream);
WorkSheet worksheet = workbook.DefaultWorkSheet;

// Get row and column counts
Console.WriteLine($"Rows: {worksheet.RowCount}, Columns: {worksheet.ColumnCount}");

// Convert to DataTable for database or grid binding
var dataTable = worksheet.ToDataTable(useHeaderRow: true);
Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");

foreach (System.Data.DataRow row in dataTable.Rows)
{
    string productName = row["ProductName"]?.ToString() ?? string.Empty;
    string sku = row["SKU"]?.ToString() ?? string.Empty;
    Console.WriteLine($"Product: {productName}, SKU: {sku}");
}
$vbLabelText   $csharpLabel

WorkBook.FromStream aceita qualquer Stream - MemoryStream, FileStream ou um fluxo de rede. Essa flexibilidade significa que você nunca precisa escrever arquivos temporários no disco apenas para ler dados do Excel. A conversão para DataTable também se integra diretamente com SqlBulkCopy, controles de vinculação de dados e frameworks de relatórios.

Saída do Processamento de Fluxo

Alternativa para Ler Arquivo Excel Usando Leitor de fluxo em C# - IronXL: Imagem 6 - Ler Excel de Saída do MemoryStream

Quando Usar Leitura de Excel Orientada a Eventos?

Em arquiteturas orientadas a eventos - por exemplo, um botão de upload de arquivo no Windows Forms ou uma ação do controlador ASP.NET - a assinatura do método geralmente inclui os parâmetros object sender e EventArgs e . A lógica de processamento de Excel ainda usa a mesma API do IronXL, mas é chamada dentro do manipulador de eventos em vez de uma instrução de nível superior. O IronXL se integra sem problemas a qualquer fluxo de trabalho orientado a eventos ou assíncrono porque não tem dependência de um thread de UI.

Alternativa para Ler Arquivo Excel Usando Leitor de fluxo em C# - IronXL: Imagem 7 - Recursos

Como Converter entre Formatos Excel e CSV?

Embora Leitor de fluxo possa lidar com arquivos CSV, aplicativos de produção muitas vezes precisam mover dados entre Excel e CSV. IronXL torna a conversão de formato direta. Você pode exportar dados do Excel para CSV ou importar dados CSV para um livro de trabalho em apenas algumas linhas:

using IronXL;

// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
workbook.SaveAsCsv("output.csv");

// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("legacy-report.csv");
csvWorkbook.SaveAs("converted.xlsx");

// Export a specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("sheet1-export.csv");
using IronXL;

// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("SalesData.xlsx");
workbook.SaveAsCsv("output.csv");

// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("legacy-report.csv");
csvWorkbook.SaveAs("converted.xlsx");

// Export a specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("sheet1-export.csv");
$vbLabelText   $csharpLabel

Essas conversões preservam seus dados enquanto mudam o formato do contêiner. Ao converter Excel para CSV, o IronXL exporta a primeira planilha por padrão; você pode especificar qualquer planilha que escolher. Converter CSV para Excel cria um livro de trabalho devidamente estruturado que você pode então formatar, adicionar fórmulas e escrever dados adicionais.

Quais São as Diferenças de Suporte de Formato?

Comparação entre Leitor de fluxo e IronXL para leitura de diferentes formatos de arquivo
Formato de Arquivo Leitor de fluxo IronXL Nãotas
CSV (.csv) Sim Sim Texto simples; Leitor de fluxo funciona bem
XLSX (.xlsx) Não Sim XML compactado em ZIP; requer biblioteca
XLS (.xls) Não Sim Formato BIFF binário; requer biblioteca
XLSM (.xlsm) Não Sim Livro de macro habilitado
TSV (.tsv) Sim Sim Texto simples separado por tabulações

Como Criar e Formatar Arquivos Excel com IronXL?

Ler dados do Excel é apenas parte do fluxo de trabalho. Muitos aplicativos também precisam criar novos arquivos Excel e aplicar formatação. O IronXL suporta formatação de células incluindo fontes, cores, bordas, formatos numéricos e mesclagem de células:

using IronXL;

// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Report");

// Write headers with formatting
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Units Sold";
sheet["C1"].Value = "Revenue";

// Apply bold formatting to header row
sheet["A1:C1"].Style.Font.Bold = true;
sheet["A1:C1"].Style.SetBackgroundColor("#4472C4");
sheet["A1:C1"].Style.Font.Color = "#FFFFFF";

// Write data rows
string[] products = { "Widget A", "Widget B", "Widget C" };
int[] units = { 120, 85, 210 };
decimal[] revenues = { 2400.00m, 1700.00m, 4200.00m };

for (int i = 0; i < products.Length; i++)
{
    sheet[$"A{i + 2}"].Value = products[i];
    sheet[$"B{i + 2}"].Value = units[i];
    sheet[$"C{i + 2}"].Value = revenues[i];
    sheet[$"C{i + 2}"].FormatString = "$#,##0.00";
}

// Save the workbook
workbook.SaveAs("FormattedReport.xlsx");
Console.WriteLine("Report created successfully.");
using IronXL;

// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
WorkSheet sheet = workbook.CreateWorkSheet("Report");

// Write headers with formatting
sheet["A1"].Value = "Product";
sheet["B1"].Value = "Units Sold";
sheet["C1"].Value = "Revenue";

// Apply bold formatting to header row
sheet["A1:C1"].Style.Font.Bold = true;
sheet["A1:C1"].Style.SetBackgroundColor("#4472C4");
sheet["A1:C1"].Style.Font.Color = "#FFFFFF";

// Write data rows
string[] products = { "Widget A", "Widget B", "Widget C" };
int[] units = { 120, 85, 210 };
decimal[] revenues = { 2400.00m, 1700.00m, 4200.00m };

for (int i = 0; i < products.Length; i++)
{
    sheet[$"A{i + 2}"].Value = products[i];
    sheet[$"B{i + 2}"].Value = units[i];
    sheet[$"C{i + 2}"].Value = revenues[i];
    sheet[$"C{i + 2}"].FormatString = "$#,##0.00";
}

// Save the workbook
workbook.SaveAs("FormattedReport.xlsx");
Console.WriteLine("Report created successfully.");
$vbLabelText   $csharpLabel

Essa capacidade de ler livros de trabalho existentes e criar novos arquivos formatados torna o IronXL uma solução completa para Excel em aplicativos .NET. Revise a página de funcionalidades do IronXL para uma análise detalhada das operações suportadas.

Exportando Dados para Outros Formatos

O IronXL também suporta a exportação de dados de livros de trabalho para objetos DataSet, o que é particularmente útil ao carregar várias planilhas na memória para cálculos entre planilhas ou operações de inserção em massa no banco de dados. O método ToDataSet retorna um DataSet onde cada planilha se torna um DataTable.

Alternativa para Ler Arquivo Excel Usando Leitor de fluxo em C# - IronXL: Imagem 8 - Licenciamento

Como Licenciar e Implementar o IronXL em Produção?

IronXL é gratuito para desenvolvimento e teste. Para aplicações de produção, uma licença é necessária. Você pode explorar opções de licenciamento do IronXL na página do produto, que cobre níveis de Desenvolvedor, Equipe e Organização, dependendo das suas necessidades de implantação.

Após a compra, aplique sua chave de licença no código antes de qualquer chamada ao IronXL:

IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
IronXl.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";
$vbLabelText   $csharpLabel

Alternativamente, defina a variável de ambiente IRONXL_LICENSE_KEY em seu ambiente de implantação e o IronXL irá capturá-la automaticamente. Esta é a abordagem preferida para implantações conteinerizadas (Docker, Kubernetes) e ambientes em nuvem onde codificar chaves não é aceitável.

Para fins de avaliação, uma licença de teste gratuita fornece funcionalidade completa para que você possa validar o IronXL em seus casos de uso específicos antes de adquirir. O teste está disponível sem cartão de crédito e é ativado imediatamente.

Comparado a alternativas como Microsoft.Office.Interop.Excel, o IronXL tem várias vantagens de implantação:

  • Não exige que o Microsoft Excel esteja instalado no servidor
  • Compatível com Linux e Docker -- essencial para aplicativos em nuvem
  • Nenhum gerenciamento do ciclo de vida de objetos COM ou problemas de threading de apartamento
  • Início mais rápido e menor uso de memória em contextos de servidor
  • Comportamento consistente em todas as plataformas suportadas

Essas qualidades tornam o IronXL uma escolha prática para qualquer aplicativo .NET que precisa processar arquivos Excel em produção, seja localmente ou na nuvem.

Perguntas frequentes

Por que o StreamReader não consegue lidar diretamente com arquivos do Excel?

O StreamReader foi projetado para ler arquivos de texto e não possui a capacidade de analisar os formatos de dados binários ou estruturados complexos usados em arquivos do Excel. Essa limitação resulta em caracteres ilegíveis ou exceções ao tentar ler arquivos do Excel diretamente com o StreamReader.

Qual é a solução recomendada para ler arquivos Excel em C#?

A solução recomendada é usar o IronXL, uma biblioteca poderosa que permite ler, editar e criar arquivos do Excel em C# sem a necessidade de interoperabilidade com o Excel. O IronXL consegue lidar com a estrutura complexa dos arquivos do Excel de forma eficiente.

Quais as vantagens que o IronXL oferece em relação ao Excel Interop?

O IronXL oferece diversas vantagens em relação ao Excel Interop, incluindo melhor desempenho, não depender da instalação do Excel no servidor ou na máquina cliente, implantação mais fácil e a capacidade de trabalhar com arquivos do Excel em ambientes web e em nuvem.

O IronXL é capaz de lidar com arquivos nos formatos .xls e .xlsx?

Sim, o IronXL é capaz de lidar com os formatos de arquivo Excel .xls e .xlsx, proporcionando flexibilidade para desenvolvedores que trabalham com diferentes tipos de documentos Excel.

O IronXL pode ser usado em aplicações web?

Sim, o IronXL foi projetado para ser usado em diversos tipos de aplicativos, incluindo aplicativos da web, graças à sua natureza leve e compatibilidade com .NET Core e .NET Framework.

O IronXL requer a instalação do Microsoft Excel?

Não, o IronXL não exige que o Microsoft Excel esteja instalado no servidor ou na máquina cliente, o que o torna ideal para aplicações do lado do servidor e ambientes em nuvem.

Quais são alguns casos de uso típicos para o IronXL?

Os casos de uso típicos do IronXL incluem extração e análise de dados de arquivos Excel, geração de relatórios, automatização da criação e modificação de arquivos Excel e integração de dados do Excel em outros aplicativos.

Jordi Bardia
Engenheiro de Software
Jordi é extremamente proficiente em Python, C# e C++, e quando não está utilizando suas habilidades na Iron Software, dedica-se à programação de jogos. Compartilhando as responsabilidades por testes, desenvolvimento e pesquisa de produtos, Jordi agrega imenso valor à melhoria contínua dos produtos. Essa experiência diversificada o mantém ...
Leia mais

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me