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

Como importar, ler e manipular dados do Excel em C#

StreamReader não pode ler arquivos Excel porque os formatos XLSX/XLS são estruturas binárias complexas ou XML comprimidas, não texto simples. Use a biblioteca IronXL em vez disso, que fornece WorkBook.Load() para leitura de arquivos e FromStream() para processamento de stream de memória sem dependências de Excel Interop.

Muitos desenvolvedores C# enfrentam um desafio comum ao tentar ler arquivos de planilhas Excel: seu confiável StreamReader, que funciona perfeitamente para arquivos de texto, falha misteriosamente com documentos Excel. Se você tentou ler arquivos Excel usando StreamReader em C# apenas para ver caracteres distorcidos ou exceções, você não está sozinho. Este tutorial explica por que StreamReader não pode lidar diretamente com arquivos Excel e demonstra a solução adequada usando IronXL sem Excel Interop.

A confusão muitas vezes surge porque arquivos CSV, que o Excel pode abrir, funcionam bem com StreamReader. No entanto, arquivos Excel verdadeiros (XLSX, XLS) requerem uma abordagem fundamentalmente diferente. Compreender essa distinção te fará economizar horas de depuração e te levará à ferramenta certa para o trabalho. Para engenheiros de DevOps que implantam aplicações em contêineres Docker ou ambientes Kubernetes, isso se torna especialmente crítico, pois dependências nativas podem complicar a conteinerização.

Página inicial do IronXL for .NET mostrando exemplo de código C# para leitura de arquivos Excel sem interoperação do Microsoft Office, apresentando recursos da biblioteca e estatísticas de download

Por que StreamReader não pode ler arquivos Excel?

StreamReader é projetado para arquivos de texto simples, lendo dados de caracteres linha por linha usando uma codificação especificada. Os arquivos Excel, apesar de sua aparência de planilha, são na verdade estruturas binárias complexas ou XML comprimidas em ZIP que StreamReader não pode interpretar. Arquivos XLSX modernos seguem o padrão Open XML do Office, enquanto arquivos XLS antigos usam um formato binário proprietário.

static void Main(string[] args)
{
 // This code will NOT work - demonstrates the problem
 using (StreamReader reader = new StreamReader("ProductData.xlsx"))
 {
    string content = reader.ReadLine(); // Attempts to read Excel as text
    Console.WriteLine(content); // Outputs garbled binary data
 }
}
static void Main(string[] args)
{
 // This code will NOT work - demonstrates the problem
 using (StreamReader reader = new StreamReader("ProductData.xlsx"))
 {
    string content = reader.ReadLine(); // Attempts to read Excel as text
    Console.WriteLine(content); // Outputs garbled binary data
 }
}
$vbLabelText   $csharpLabel

Quando você executa este trecho de código, em vez de ver os dados da sua planilha, você encontrará dados binários, como "PK♥♦" ou caracteres semelhantes. Isso acontece porque arquivos XLSX são arquivos ZIP contendo múltiplos arquivos XML, enquanto arquivos XLS usam um formato binário proprietário. StreamReader espera texto simples e tenta interpretar essas estruturas complexas como caracteres, resultando em uma saída sem sentido. Para aplicações containerizadas, tentar usar bibliotecas nativas do Excel ou COM Interop requereria a instalação do Microsoft Office no seu contêiner, aumentando drasticamente o tamanho e a complexidade da imagem.

O que acontece quando StreamReader tenta processar arquivos Excel?

O exemplo a seguir mostra um arquivo Excel típico contendo dados de produtos que queremos processar. Observe como os dados estruturados da planilha aparecem limpos e organizados quando visualizados no Excel:

Planilha Excel mostrando uma tabela de dados de produtos com colunas para nomes de produtos (Laptop, Mouse, Keyboard, Monitor, Headphones), preços e valores VERDADEIRO/FALSO nas colunas A até D

Por que a saída mostra caracteres corrompidos?

Quando StreamReader tenta processar este arquivo Excel, a saída do console revela o problema subjacente. Em vez de dados legíveis, você vê conteúdo binário porque a estrutura do arquivo não pode ser interpretada como texto:

Console de Debug do Visual Studio mostrando execução bem-sucedida do programa com código de saída 0 e um prompt para pressionar qualquer tecla para fechar a janela

Arquivos Excel modernos (XLSX) contêm múltiplos componentes: planilhas, estilos, strings compartilhadas e relacionamentos, todos empacotados juntos. Essa complexidade requer bibliotecas especializadas que compreendam a estrutura do arquivo Excel, o que nos leva ao IronXL. A biblioteca lida com todas essas complexidades internamente enquanto fornece uma API simples, tornando-a ideal para pipelines de implantação automatizados onde a intervenção manual não é possível.

Como Ler Arquivos Excel com IronXL?

IronXL fornece uma solução direta para ler arquivos Excel em C#. Ao contrário de StreamReader, o IronXL entende a estrutura interna do Excel e fornece métodos intuitivos para acessar seus dados. A biblioteca suporta Windows, Linux, macOS e contêineres Docker, tornando-a perfeita para aplicações modernas e multiplataforma. Para equipes de DevOps, a arquitetura sem dependências do IronXL significa que não há bibliotecas nativas ou componentes COM para gerenciar durante a implantação.

Diagrama de suporte multiplataforma mostrando a compatibilidade do .NET em várias versões, sistemas operacionais, ambientes de desenvolvimento e plataformas de nuvem, incluindo Windows, Linux, macOS, Docker, Azure e AWS

Primeiro, instale IronXL via o Gerenciador de Pacotes NuGet:

Install-Package IronXl.Excel

Saída do terminal mostrando a instalação bem-sucedida do pacote IronXl.Excel e suas dependências via Console do Gerenciador de Pacotes no Visual Studio

Aqui está como ler um arquivo Excel corretamente:

using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
using IronXL;
// Load the Excel file
WorkBook workbook = WorkBook.Load("sample.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Read specific cell values
string cellValue = worksheet["A1"].StringValue;
Console.WriteLine($"Cell A1 contains: {cellValue}");
// Read a range of cells
foreach (var cell in worksheet["A1:C5"])
{
    Console.WriteLine($"{cell.AddressString}: {cell.Text}");
}
$vbLabelText   $csharpLabel

Este código carrega seu arquivo Excel com sucesso e fornece acesso limpo aos valores das células. O método WorkBook.Load detecta automaticamente o formato do arquivo (XLSX, XLS, XLSM, CSV) e lida com toda a análise complexa internamente. Você pode acessar células usando a notação familiar do Excel como "A1" ou intervalos como "A1:C5", tornando o código intuitivo para qualquer pessoa familiarizada com o Excel.

Para implantações containerizadas, você pode facilmente incluir endpoints de verificação de integridade que verificam as capacidades de processamento do Excel:

// Health check endpoint for containerized apps
public async Task<IActionResult> HealthCheck()
{
    try
    {
        // Test Excel functionality
        using var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var sheet = workbook.CreateWorkSheet("HealthCheck");
        sheet["A1"].Value = DateTime.UtcNow;

        // Convert to byte array for validation
        var bytes = workbook.ToByteArray();
        return Ok(new { 
            status = "healthy", 
            excelSupport = true,
            timestamp = DateTime.UtcNow 
        });
    }
    catch (Exception ex)
    {
        return StatusCode(503, new { 
            status = "unhealthy", 
            error = ex.Message 
        });
    }
}
// Health check endpoint for containerized apps
public async Task<IActionResult> HealthCheck()
{
    try
    {
        // Test Excel functionality
        using var workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        var sheet = workbook.CreateWorkSheet("HealthCheck");
        sheet["A1"].Value = DateTime.UtcNow;

        // Convert to byte array for validation
        var bytes = workbook.ToByteArray();
        return Ok(new { 
            status = "healthy", 
            excelSupport = true,
            timestamp = DateTime.UtcNow 
        });
    }
    catch (Exception ex)
    {
        return StatusCode(503, new { 
            status = "unhealthy", 
            error = ex.Message 
        });
    }
}
$vbLabelText   $csharpLabel

Como Ler Excel a Partir de Fluxos de Memória?

Aplicações do mundo real frequentemente precisam processar arquivos Excel de fluxos ao invés de arquivos de disco. Cenários comuns incluem lidar com uploads na web, recuperar arquivos de bancos de dados ou processar dados de armazenamento em nuvem como AWS S3 ou Azure Blob Storage. IronXL lida com essas situações de forma tranquila:

using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
    WorkBook workbook = WorkBook.FromStream(stream);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    // Process the data
    int rowCount = worksheet.RowCount;
    Console.WriteLine($"The worksheet has {rowCount} rows");
    // Read all data into a DataTable
    var dataTable = worksheet.ToDataTable(false);
    // Display DataTable row count 
    Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
using IronXL;
using System.IO;
// Read Excel from a memory stream
byte[] fileBytes = File.ReadAllBytes("ProductData.xlsx");
using (MemoryStream stream = new MemoryStream(fileBytes))
{
    WorkBook workbook = WorkBook.FromStream(stream);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    // Process the data
    int rowCount = worksheet.RowCount;
    Console.WriteLine($"The worksheet has {rowCount} rows");
    // Read all data into a DataTable
    var dataTable = worksheet.ToDataTable(false);
    // Display DataTable row count 
    Console.WriteLine($"Loaded {dataTable.Rows.Count} data rows");
}
$vbLabelText   $csharpLabel

O método FromStream aceita qualquer tipo de stream, seja um MemoryStream, FileStream ou stream de rede. Essa flexibilidade permite processar arquivos Excel de várias fontes sem salvá-los no disco primeiro. O exemplo também demonstra converter dados de planilha em um DataTable, que se integra perfeitamente com bancos de dados e cenários de vinculação de dados. Para arquiteturas de microsserviços, essa abordagem baseada em fluxo minimiza o I/O de disco e melhora o desempenho.

Que resultados o processamento de fluxos de memória produz?

Console de debug do Visual Studio mostrando saída de leitura de dados Excel, exibindo 'A planilha tem 5 linhas' e 'Carregado 5 linhas de dados'

Quando devo usar o remetente de objeto em cenários de leitura de Excel?

Nos casos em que esse código é usado em programação orientada a eventos (por exemplo, manipulando um botão de upload de arquivo no Windows Forms ou ASP.NET), a assinatura do método geralmente inclui parâmetros como objeto sender e EventArgs e. Este contexto garante que a lógica de processamento do Excel se integre corretamente em eventos de interface de usuário ou serviço. Para APIs conteinerizadas, você pode processar uploads diretamente de pedidos HTTP:

[HttpPost("upload")]
public async Task<IActionResult> ProcessExcelUpload(IFormFile file)
{
    if (file == null || file.Length == 0)
        return BadRequest("No file uploaded");

    using var stream = new MemoryStream();
    await file.CopyToAsync(stream);
    stream.Position = 0;

    var workbook = WorkBook.FromStream(stream);
    var worksheet = workbook.DefaultWorkSheet;

    // Process and return results
    var data = worksheet.ToDataSet();
    return Ok(new { 
        sheets = workbook.WorkSheets.Count,
        rows = worksheet.RowCount,
        processed = DateTime.UtcNow
    });
}
[HttpPost("upload")]
public async Task<IActionResult> ProcessExcelUpload(IFormFile file)
{
    if (file == null || file.Length == 0)
        return BadRequest("No file uploaded");

    using var stream = new MemoryStream();
    await file.CopyToAsync(stream);
    stream.Position = 0;

    var workbook = WorkBook.FromStream(stream);
    var worksheet = workbook.DefaultWorkSheet;

    // Process and return results
    var data = worksheet.ToDataSet();
    return Ok(new { 
        sheets = workbook.WorkSheets.Count,
        rows = worksheet.RowCount,
        processed = DateTime.UtcNow
    });
}
$vbLabelText   $csharpLabel

Visão geral dos recursos de uma biblioteca de manipulação Excel para C# mostrando seis categorias principais: Criar, Salvar e Exportar, Editar Planilhas, Trabalhando com Dados, Proteger Suas Planilhas e listagens de funcionalidades detalhadas em cada categoria

Como Converter Entre Excel e CSV?

Embora StreamReader possa lidar com arquivos CSV, muitas vezes você precisa converter entre formatos Excel e CSV. O IronXL torna essa conversão direta, o que é particularmente útil para pipelines ETL e cenários de integração de dados comuns em fluxos de trabalho de DevOps:

using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
using IronXL;
// Load an Excel file and save as CSV
WorkBook workbook = WorkBook.Load("data.xlsx");
workbook.SaveAsCsv("output.csv");
// Load a CSV file and save as Excel
WorkBook csvWorkbook = WorkBook.LoadCSV("input.csv");
csvWorkbook.SaveAs("output.xlsx");
// Export specific worksheet to CSV
WorkSheet worksheet = workbook.WorkSheets[0];
worksheet.SaveAsCsv("worksheet1.csv");
$vbLabelText   $csharpLabel

Essas conversões preservam seus dados enquanto mudam o formato do arquivo. Ao converter Excel para CSV, IronXL achata a primeira planilha por padrão, mas você pode especificar qual planilha exportar. Converter de CSV para Excel cria uma planilha formatada adequadamente que preserva tipos de dados e permite futuras formatações e adições de fórmulas.

Para pipelines de dados automatizados, você também pode exportar para formatos JSON ou XML:

// Export Excel to multiple formats for data pipelines
var workbook = WorkBook.Load("report.xlsx");

// Export to JSON for API responses
string jsonData = workbook.ToJson();

// Export to HTML for web display
workbook.SaveAsHtml("report.html");

// Export to XML for integration systems
workbook.SaveAsXml("report.xml");

// Export specific range to DataTable for database insertion
var dataTable = workbook.DefaultWorkSheet["A1:D10"].ToDataTable();
// Export Excel to multiple formats for data pipelines
var workbook = WorkBook.Load("report.xlsx");

// Export to JSON for API responses
string jsonData = workbook.ToJson();

// Export to HTML for web display
workbook.SaveAsHtml("report.html");

// Export to XML for integration systems
workbook.SaveAsXml("report.xml");

// Export specific range to DataTable for database insertion
var dataTable = workbook.DefaultWorkSheet["A1:D10"].ToDataTable();
$vbLabelText   $csharpLabel

Práticas Recomendadas para Implementação em Contêiner

Para engenheiros de DevOps que implantam aplicações de processamento de Excel, o IronXL oferece várias vantagens. Aqui está um Dockerfile pronto para produção otimizado para processamento de Excel:

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

# Install any required system fonts for Excel rendering
RUN apt-get update && apt-get install -y \
    fontconfig \
    libfreetype6 \
    && rm -rf /var/lib/apt/lists/*

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["YourApp.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet build -c Release -o /app/build

FROM build AS publish
RUN dotnet publish -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .

# Set environment variables for IronXL
ENV IRONXL_LICENSE_KEY=${IRONXL_LICENSE_KEY}
ENV DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=false

ENTRYPOINT ["dotnet", "YourApp.dll"]

Este Dockerfile garante que seu aplicativo de processamento de Excel funcione perfeitamente em contêineres com poucas dependências. O licenciamento é tratado através de variáveis de ambiente, tornando fácil gerenciar em diferentes ambientes de implantação.

Quais são os próximos passos para o processamento de Excel em C#?

A incapacidade de StreamReader de processar arquivos Excel decorre da diferença fundamental entre texto simples e a complexa estrutura de arquivos do Excel. Embora StreamReader funcione perfeitamente para CSV e outros formatos de texto, arquivos Excel verdadeiros exigem uma biblioteca especializada como o IronXL, que entende as estruturas binárias e XML internas.

IronXL oferece uma solução abrangente com sua API intuitiva, suporte extenso a formatos e capacidades de processamento de fluxo impecáveis. Seja você desenvolvendo aplicativos web, software de desktop, ou serviços em nuvem, IronXL lida com arquivos Excel de forma confiável em todas as plataformas. O suporte da biblioteca a formatação condicional, gráficos, fórmulas, e recursos avançados do Excel a torna uma solução completa para aplicativos empresariais.

Para equipes de DevOps, a arquitetura amigável a contêineres do IronXL, as dependências mínimas do sistema e as sólidas características de desempenho o tornam uma escolha ideal para aplicações modernas nativas de nuvem. A biblioteca suporta escalabilidade horizontal, funciona perfeitamente em pods Kubernetes, e se integra bem com pipelines CI/CD.

IronXL licensing page showing four pricing tiers (Lite, Plus, Professional, and Unlimited) with a toggle between IronXL and Iron Suite options, displaying perpetual license prices ranging from $749 to $3,999

Pronto para começar a trabalhar adequadamente com arquivos Excel? Baixe o teste gratuito do IronXL que melhor se adequa às necessidades do seu projeto. A biblioteca oferece opções de licenciamento flexíveis, incluindo desenvolvimento, produção, e implantação de staging, com opções para ambientes conteinerizados e aplicativos nativos em nuvem.

Perguntas frequentes

Por que o StreamReader não consegue lidar diretamente com arquivos Excel em C#?

O StreamReader foi projetado para arquivos de texto e não oferece suporte ao formato binário de arquivos do Excel. Por isso, você pode encontrar caracteres ilegíveis ou exceções ao usá-lo para ler documentos do Excel. Em vez disso, recomenda-se o uso de uma biblioteca como o IronXL para o processamento adequado de arquivos do Excel.

Qual é a maneira recomendada de importar dados do Excel em C#?

A maneira recomendada de importar dados do Excel em C# é usando o IronXL. Ele permite que os desenvolvedores leiam e manipulem arquivos do Excel sem a necessidade de interoperabilidade com o Excel, oferecendo uma solução mais simples e eficiente.

Posso manipular arquivos do Excel em C# sem usar o Excel Interop?

Sim, você pode manipular arquivos do Excel em C# sem o Excel Interop usando o IronXL. Ele oferece uma maneira simples de trabalhar com documentos do Excel diretamente em sua aplicação C#.

Quais são os benefícios de usar o IronXL para manipular arquivos do Excel?

O IronXL oferece diversas vantagens, incluindo a capacidade de ler e gravar arquivos do Excel sem a necessidade do Microsoft Excel, suporte para vários formatos do Excel e uma API poderosa que simplifica as tarefas de manipulação de dados.

O IronXL suporta a leitura de arquivos Excel com tipos de dados complexos?

Sim, o IronXL suporta a leitura de arquivos Excel com tipos de dados complexos, permitindo que você manipule diversas estruturas de dados de forma eficiente em seus aplicativos C#.

Como o IronXL melhora o processo de trabalho com arquivos Excel em C#?

O IronXL simplifica o processo de trabalho com arquivos do Excel, fornecendo uma interface fácil de usar que elimina a necessidade de interoperabilidade com o Excel, reduz a complexidade do código e melhora o desempenho.

É possível ler e gravar arquivos Excel em diferentes formatos usando o IronXL?

Sim, o IronXL suporta vários formatos de arquivo do Excel, como XLSX, XLS, CSV e outros, permitindo que você leia e grave arquivos em diversos formatos sem esforço.

O IronXL consegue lidar com arquivos grandes do Excel de forma eficiente?

O IronXL foi projetado para lidar com arquivos Excel grandes de forma eficiente, oferecendo desempenho robusto e minimizando o uso de memória durante as operações com arquivos.

O que torna o IronXL uma escolha adequada para desenvolvedores C# que trabalham com arquivos Excel?

IronXL é uma escolha adequada para desenvolvedores C# porque oferece um conjunto abrangente de recursos para ler, escrever e manipular arquivos do Excel com facilidade, sem exigir o Microsoft Excel ou dependências complexas de interoperabilidade.

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