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

Como ler arquivos do OpenOffice Excel em C# sem o Excel instalado

Ler e processar arquivos OpenDocument Spreadsheet (ODS) e Excel em C# é simples quando você usa a biblioteca correta. Com IronXL, você carrega qualquer arquivo XLS, XLSX, ODS ou CSV em um objeto WorkBook usando uma única chamada de método -- sem necessidade de instalação do Microsoft Excel, registro COM ou dores de cabeça com Interop. Este guia o orienta em cada etapa: instalar o pacote, carregar arquivos, extrair valores de células tipadas, trabalhar com planilhas nomeadas, lidar com células mescladas e implantar em ambientes Linux ou containerizados.

Como instalar o IronXL em um projeto .NET?

Instalação do Gerenciador de Pacotes NuGet

Adicione o IronXL ao seu projeto através do Gerenciador de Pacotes NuGet. Abra o Console do Gerenciador de Pacotes no Visual Studio e execute:

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

IronXL tem como alvo .NET 8, .NET 9, .NET 10, .NET Framework 4.6.2+ e .NET Standard 2.0, então se adapta tanto a bases de código modernas quanto legadas. Assim que o pacote é instalado, adicione a diretiva using IronXL; no topo de qualquer arquivo que trabalhe com planilhas, e você está pronto para carregar seu primeiro workbook.

Para Azure Functions, contêineres Docker ou APIs hospedadas em Linux, nenhuma configuração adicional de runtime é necessária. A biblioteca reúne internamente tudo o que precisa e não chama componentes de automação do Excel.

Como Carregar um Arquivo OpenOffice ou Excel em C#?

IronXL trata arquivos ODS, XLS, XLSX e CSV de forma idêntica através do método WorkBook.Load. Você passa um caminho absoluto ou relativo do arquivo, e a biblioteca detecta o formato a partir do cabeçalho do arquivo – não apenas a extensão. Isso significa que um arquivo renomeado de .ods para .xlsx ainda é lido corretamente.

using IronXL;

// Load an OpenDocument Spreadsheet (.ods) produced by LibreOffice Calc or OpenOffice
WorkBook workbook = WorkBook.Load("quarterly_report.ods");

// Access the first worksheet by index
WorkSheet sheet = workbook.WorkSheets[0];

// Read a cell value
string companyName = sheet["A1"].StringValue;
int recordCount   = sheet["B1"].IntValue;

Console.WriteLine($"Company : {companyName}");
Console.WriteLine($"Records : {recordCount}");
using IronXL;

// Load an OpenDocument Spreadsheet (.ods) produced by LibreOffice Calc or OpenOffice
WorkBook workbook = WorkBook.Load("quarterly_report.ods");

// Access the first worksheet by index
WorkSheet sheet = workbook.WorkSheets[0];

// Read a cell value
string companyName = sheet["A1"].StringValue;
int recordCount   = sheet["B1"].IntValue;

Console.WriteLine($"Company : {companyName}");
Console.WriteLine($"Records : {recordCount}");
$vbLabelText   $csharpLabel

A mesma chamada funciona para arquivos XLSX e XLS – basta mudar o caminho. WorkBook.Load retorna o mesmo objeto fortemente tipado, independentemente do formato de origem, para que o restante do seu código permaneça idêntico, seja o arquivo originário do Microsoft Excel, LibreOffice ou qualquer outro aplicativo compatível com ODF.

Como Ler Toda Linha e Célula em uma Planilha?

Iterando a Coleção de Linhas

Iterar sobre todas as linhas e células é a tarefa de processamento de Excel mais comum -- seja para validar dados de importação, transformar registros ou alimentar um pipeline de relatórios. IronXL expõe uma coleção Rows em cada WorkSheet:

using IronXL;

WorkBook workbook  = WorkBook.Load("customers.xlsx");
WorkSheet worksheet = workbook.WorkSheets[0];

Console.WriteLine($"Total rows    : {worksheet.RowCount}");
Console.WriteLine($"Total columns : {worksheet.ColumnCount}");
Console.WriteLine();

foreach (var row in worksheet.Rows)
{
    foreach (var cell in row)
    {
        if (!cell.IsEmpty)
            Console.Write($"{cell.StringValue,-20}");
    }
    Console.WriteLine();
}
using IronXL;

WorkBook workbook  = WorkBook.Load("customers.xlsx");
WorkSheet worksheet = workbook.WorkSheets[0];

Console.WriteLine($"Total rows    : {worksheet.RowCount}");
Console.WriteLine($"Total columns : {worksheet.ColumnCount}");
Console.WriteLine();

foreach (var row in worksheet.Rows)
{
    foreach (var cell in row)
    {
        if (!cell.IsEmpty)
            Console.Write($"{cell.StringValue,-20}");
    }
    Console.WriteLine();
}
$vbLabelText   $csharpLabel

As propriedades RowCount e ColumnCount retornam apenas o intervalo populado -- linhas e colunas finais vazias não são incluídas. Verificar cell.IsEmpty antes de ler evita processamento desnecessário em planilhas esparsas.

Para arquivos grandes, considere usar acesso baseado em intervalo (worksheet["A1:D500"]) em vez de iteração da planilha completa. Isso limita as células carregadas na memória e acelera o processamento quando você precisa apenas de um subconjunto dos dados.

Como Extrair Valores Tipados das Células?

Acessores de Propriedades Tipadas

Células em uma planilha do mundo real contêm strings, inteiros, decimais, booleanos e datas. IronXL expõe propriedades tipadas dedicadas para que você nunca tenha que fazer parsing de strings brutas manualmente:

using IronXL;

WorkBook workbook = WorkBook.Load("inventory.xlsx");
WorkSheet sheet   = workbook.GetWorkSheet("Products");

// Typed accessors handle conversion automatically
string  productName = sheet["A2"].StringValue;
int     quantity    = sheet["B2"].IntValue;
decimal unitPrice   = sheet["C2"].DecimalValue;
bool    inStock     = sheet["D2"].BoolValue;
DateTime? lastAudit = sheet["E2"].DateTimeValue;

Console.WriteLine($"Product  : {productName}");
Console.WriteLine($"Qty      : {quantity}");
Console.WriteLine($"Price    : {unitPrice:C}");
Console.WriteLine($"In Stock : {inStock}");
Console.WriteLine($"Audited  : {lastAudit?.ToString("d") ?? "Never"}");
using IronXL;

WorkBook workbook = WorkBook.Load("inventory.xlsx");
WorkSheet sheet   = workbook.GetWorkSheet("Products");

// Typed accessors handle conversion automatically
string  productName = sheet["A2"].StringValue;
int     quantity    = sheet["B2"].IntValue;
decimal unitPrice   = sheet["C2"].DecimalValue;
bool    inStock     = sheet["D2"].BoolValue;
DateTime? lastAudit = sheet["E2"].DateTimeValue;

Console.WriteLine($"Product  : {productName}");
Console.WriteLine($"Qty      : {quantity}");
Console.WriteLine($"Price    : {unitPrice:C}");
Console.WriteLine($"In Stock : {inStock}");
Console.WriteLine($"Audited  : {lastAudit?.ToString("d") ?? "Never"}");
$vbLabelText   $csharpLabel

Quando uma célula contém uma fórmula, o IronXL a avalia e retorna o resultado calculado pelas mesmas propriedades tipadas. Você não precisa chamar um método de avaliação separado. Para células que podem estar vazias ou conter um tipo incompatível, a biblioteca retorna o valor padrão para aquele tipo em vez de lançar uma exceção, o que simplifica a lógica de validação de entrada.

Propriedades de Valor de Célula IronXL e Seus Tipos Equivalentes .NET
Propriedade Tipo .NET Retorna Quando Vazio Notas
`StringValue` `string` String vazia Sempre seguro; converte qualquer célula para texto
`IntValue` `int` `0` Trunca decimais
`DecimalValue` `decimal` `0m` Preserva precisão para dados financeiros
`DoubleValue` `double` `0.0` Use para valores científicos ou estatísticos
`BoolValue` `bool` `false` Lê células Excel VERDADEIRO/FALSO
`DateTimeValue` `DateTime?` `null` Nullable -- verificar antes de usar

Como Trabalhar com Múltiplas Planilhas Nomeadas?

Acessar por Nome, Índice ou Iteração

Planilhas empresariais frequentemente contêm várias planilhas nomeadas -- uma por mês, uma por região, ou uma por linha de produto. IronXL oferece várias maneiras de acessá-las:

using IronXL;

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

// Option 1: access by name (throws if the sheet does not exist)
WorkSheet januarySheet = workbook.GetWorkSheet("January");

// Option 2: iterate all sheets in the workbook
foreach (WorkSheet ws in workbook.WorkSheets)
{
    Console.WriteLine($"Sheet: {ws.Name}  |  Rows: {ws.RowCount}");

    // Read the header row from each sheet
    string header = ws["A1"].StringValue;
    Console.WriteLine($"  Header: {header}");
}

// Option 3: access by zero-based index
WorkSheet lastSheet = workbook.WorkSheets[workbook.WorkSheets.Count - 1];
Console.WriteLine($"Last sheet: {lastSheet.Name}");
using IronXL;

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

// Option 1: access by name (throws if the sheet does not exist)
WorkSheet januarySheet = workbook.GetWorkSheet("January");

// Option 2: iterate all sheets in the workbook
foreach (WorkSheet ws in workbook.WorkSheets)
{
    Console.WriteLine($"Sheet: {ws.Name}  |  Rows: {ws.RowCount}");

    // Read the header row from each sheet
    string header = ws["A1"].StringValue;
    Console.WriteLine($"  Header: {header}");
}

// Option 3: access by zero-based index
WorkSheet lastSheet = workbook.WorkSheets[workbook.WorkSheets.Count - 1];
Console.WriteLine($"Last sheet: {lastSheet.Name}");
$vbLabelText   $csharpLabel

Quando o nome da planilha é conhecido em tempo de design, GetWorkSheet é a opção mais clara. Para processamento dinâmico -- onde os nomes das planilhas vêm de entrada do usuário ou configuração -- iterar sobre a coleção WorkSheets evita suposições codificadas e manipula workbooks com números variáveis de planilhas.

Como Lidar com Células Mescladas e Regiões Formataradas?

Relatórios e painéis frequentemente usam células mescladas para cabeçalhos, rótulos agrupados e linhas de resumo. IronXL lê o valor da célula no canto superior esquerdo de uma região mesclada, exatamente como o Excel exibe:

using IronXL;

WorkBook workbook = WorkBook.Load("report_with_merges.xlsx");
WorkSheet sheet   = workbook.DefaultWorkSheet;

// The merged region A1:D1 stores its value in cell A1
string reportTitle = sheet["A1"].StringValue;
Console.WriteLine($"Report title : {reportTitle}");

// Read cell formatting metadata
var titleCell = sheet["A1"];
Console.WriteLine($"Bold         : {titleCell.Style.Font.Bold}");
Console.WriteLine($"Font size    : {titleCell.Style.Font.Height}");

// Scan an entire column for non-empty section headers
foreach (var cell in sheet["A1:A100"])
{
    if (!cell.IsEmpty && cell.Style.Font.Bold)
        Console.WriteLine($"Section header at {cell.AddressString}: {cell.StringValue}");
}
using IronXL;

WorkBook workbook = WorkBook.Load("report_with_merges.xlsx");
WorkSheet sheet   = workbook.DefaultWorkSheet;

// The merged region A1:D1 stores its value in cell A1
string reportTitle = sheet["A1"].StringValue;
Console.WriteLine($"Report title : {reportTitle}");

// Read cell formatting metadata
var titleCell = sheet["A1"];
Console.WriteLine($"Bold         : {titleCell.Style.Font.Bold}");
Console.WriteLine($"Font size    : {titleCell.Style.Font.Height}");

// Scan an entire column for non-empty section headers
foreach (var cell in sheet["A1:A100"])
{
    if (!cell.IsEmpty && cell.Style.Font.Bold)
        Console.WriteLine($"Section header at {cell.AddressString}: {cell.StringValue}");
}
$vbLabelText   $csharpLabel

A árvore de propriedades Style espelha a estrutura da especificação OOXML SpreadsheetML, então os nomes das propriedades parecerão familiares se você já trabalhou com o SDK Open XML. No entanto, IronXL envolve toda essa complexidade em uma API limpa que não requer nenhuma manipulação de XML da sua parte.

Como Importar Arquivos CSV com a Mesma API?

Arquivos CSV produzidos por exportações de bancos de dados, sistemas CRM e aplicativos legados podem ser lidos através da mesma chamada WorkBook.Load. IronXL infere o delimitador a partir do conteúdo do arquivo:

using IronXL;

// Load a comma-separated values file -- same method, same API
WorkBook csvWorkbook  = WorkBook.Load("export.csv");
WorkSheet csvSheet    = csvWorkbook.DefaultWorkSheet;

Console.WriteLine($"CSV rows loaded: {csvSheet.RowCount}");

// Process rows exactly like any other worksheet
foreach (var row in csvSheet.Rows)
{
    string id   = row[0].StringValue;
    string name = row[1].StringValue;
    Console.WriteLine($"{id,-10} {name}");
}
using IronXL;

// Load a comma-separated values file -- same method, same API
WorkBook csvWorkbook  = WorkBook.Load("export.csv");
WorkSheet csvSheet    = csvWorkbook.DefaultWorkSheet;

Console.WriteLine($"CSV rows loaded: {csvSheet.RowCount}");

// Process rows exactly like any other worksheet
foreach (var row in csvSheet.Rows)
{
    string id   = row[0].StringValue;
    string name = row[1].StringValue;
    Console.WriteLine($"{id,-10} {name}");
}
$vbLabelText   $csharpLabel

Após o carregamento, você pode salvar os dados como XLSX usando csvWorkbook.SaveAs("output.xlsx"). Este é um padrão comum para pipelines de conversão CSV-para-Excel -- receber um arquivo CSV, enriquecê-lo com colunas calculadas ou formatação, e retornar um relatório XLSX formatado ao usuário.

Para arquivos separados por tabulações ou delimitadores personalizados, use WorkBook.LoadCSV("file.tsv", fileFormatar: ExcelFileFormatar.TSV) para especificar explicitamente o formato.

Formataros de Arquivo de Entrada Suportados no IronXL
Formatar Extensão Produzido Por Notas
XLSX `.xlsx` Excel 2007+, LibreOffice Formataro moderno padrão; baseado em XML
XLS `.xls` Excel 97--2003 Formataro binário; suporte completo de leitura/escrita
ODS `.ods` LibreOffice, OpenOffice Padrão de Planilha OpenDocument
CSV `.csv` Qualquer aplicativo Delimitador auto-detectado; sem formatação
TSV `.tsv` Exportações de banco de dados Separado por tabulação; especifique o formato explicitamente

Como o IronXL se Compara ao Microsoft.Office.Interop.Excel?

Interop, Open XML SDK e IronXL Lado a Lado

A alternativa mais comum ao IronXL para automação de Excel em .NET é Microsoft.Office.Interop.Excel. Compreender os trade-offs ajuda a escolher a ferramenta certa para seu projeto.

O Interop da Microsoft envolve o modelo de objeto COM do Excel. Isso significa que o Excel deve estar instalado em todas as máquinas que executam seu código -- incluindo servidores web, agentes de build e VMs em nuvem. O gerenciamento do ciclo de vida de objetos COM é manual: você deve liberar explicitamente cada objeto Range, Worksheet e Workbook, ou os processos do Excel se acumulam em segundo plano e consomem memória até que o servidor seja reiniciado. O licenciamento também é uma preocupação: o EULA do Office proíbe automação do lado do servidor em muitos cenários.

IronXL evita todas essas limitações. É uma biblioteca totalmente gerida sem dependência de COM. O objeto WorkBook é uma classe padrão do .NET; o coletor de lixo lida com a limpeza. Você pode executar o mesmo código em um laptop de desenvolvedor, um Azure App Service, um contêiner Docker ou um Raspberry Pi rodando Linux.

O Open XML SDK da Microsoft é outra alternativa. Ele fornece acesso direto ao formato de arquivo OOXML sem exigir o Excel, mas opera em um nível muito baixo -- você manipula elementos XML diretamente. Ler o valor de uma única célula requer navegar por tabelas de strings compartilhadas, referências de células e índices de estilo. IronXL envolve tudo isso na chamada de linha única sheet["A1"].StringValue mostrada ao longo deste guia.

Como Implementar o Processamento de Excel no Linux e Docker?

Implementações de servidor são onde a independência do IronXL em relação ao Excel se torna mais valiosa. O mesmo código que você escreve no Windows roda inalterado no Ubuntu, Alpine Linux ou macOS. Para implementações em contêiner, seu Dockerfile não requer configuração especial:

# Standard .NET runtime image -- no Office packages needed
FROM mcr.microsoft.com/dotnet/runtime:10.0
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "ExcelProcessor.dll"]
# Standard .NET runtime image -- no Office packages needed
FROM mcr.microsoft.com/dotnet/runtime:10.0
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "ExcelProcessor.dll"]
SHELL

Para Azure Functions e AWS Lambda, IronXL funciona dentro do runtime gerido sem qualquer configuração adicional. O overhead de inicialização a frio é mínimo porque não há etapa de inicialização do COM.

A segurança de thread é integrada: vários threads podem abrir instâncias diferentes de WorkBook simultaneamente sem coordenação. Se você precisar processar milhares de arquivos em paralelo -- por exemplo, em um trabalho em segundo plano que ingere planilhas enviadas pelo usuário -- você pode usar Parallel.ForEach ou Task.WhenAll em um pool de instâncias WorkBook sem risco de corrupção.

O uso de memória permanece previsível porque o IronXL carrega apenas a planilha solicitada na memória, não todo o livro na inicialização. Para arquivos muito grandes, essa distinção é importante: um livro com dez folhas de 50MB não requer 500MB de RAM apenas para ler uma única folha. A documentação de desempenho do IronXL cobre estratégias adicionais para lidar com cenários de processamento de arquivos em grande volume.

Quais são os seus próximos passos?

A maneira mais rápida de validar o IronXL no seu projeto é instalar o pacote NuGet e executar os exemplos deste guia contra um arquivo real do seu ambiente. Uma licença de teste gratuita desbloqueia todos os recursos sem a necessidade de alteração no código quando você estiver pronto para a produção.

Explore capacidades relacionadas do IronXL que complementam a leitura de arquivos:

Para dúvidas sobre licenciamento, suporte multiplataforma ou requisitos de formato de arquivo específico, a equipe de suporte do IronXL está disponível via chat ao vivo e email.

!{--010011000100100101000010010100100100000101010010010110010101111101000111010001010101010100010111110101001101010100010000010101001001010100010001010100010001011111010101110100100 101010100010010000101111101010000010100100111101000100010101010100001101010100010111110101010001010010010010010010010100000101001100010111110100001001001100010011110100001101001011--}

Perguntas frequentes

Como posso ler arquivos do OpenOffice Excel em C# sem ter o Excel instalado?

Você pode usar a biblioteca IronXL para ler arquivos do Open Office Excel em C# sem precisar ter o Excel instalado no seu servidor. Ela permite carregar arquivos XLS, XLSX, ODS e CSV de forma eficiente usando uma única chamada do método WorkBook.Load.

Que tipos de arquivos do Excel podem ser processados usando o IronXL?

O IronXL suporta o processamento de vários formatos de arquivo do Excel, incluindo XLS, XLSX, ODS (OpenDocument Spreadsheet) e CSV, o que o torna versátil para diferentes aplicativos de planilha, como LibreOffice e OpenOffice.

Por que os desenvolvedores deveriam usar o IronXL em vez do Microsoft Interop para ler arquivos do Excel?

O IronXL oferece uma maneira mais simples e eficiente de lidar com arquivos do Excel sem a necessidade do Microsoft Excel ou do COM Interop, reduzindo a complexidade e a sobrecarga em servidores de produção e permitindo implantações em Linux e Docker.

O IronXL consegue lidar com arquivos criados em aplicativos de planilha diferentes do MS Excel?

Sim, o IronXL consegue ler e processar arquivos de outros aplicativos de planilha, como o OpenOffice Calc e o LibreOffice Calc, tornando-se uma ferramenta flexível para desenvolvedores que trabalham com formatos compatíveis com ODS e ODF.

É necessário instalar o Excel nos servidores de produção para usar o IronXL?

Não, com o IronXL, você não precisa instalar o Excel em servidores de produção, o que simplifica a implantação e reduz os requisitos de manutenção. O IronXL funciona em Windows, Linux, macOS e dentro de contêineres Docker.

O IronXL suporta o processamento de arquivos CSV?

Sim, o IronXL oferece suporte completo à leitura e ao processamento de arquivos CSV, além de outros formatos do Excel, como XLS, XLSX e ODS, usando a mesma API WorkBook.Load.

Quais são os benefícios de usar o IronXL para desenvolvedores .NET?

IronXL oferece aos desenvolvedores .NET uma biblioteca fácil de usar para ler, escrever e manipular arquivos do Excel sem a necessidade do Microsoft Excel, aumentando a produtividade e reduzindo o tempo de desenvolvimento com uma API limpa e fortemente tipada.

Como o IronXL melhora a eficiência no processamento de arquivos do Excel?

O IronXL aumenta a eficiência ao eliminar a necessidade do software Excel, fornecendo acessadores de valores de células tipados, processamento concorrente seguro para threads e uma solução leve que processa arquivos do Excel diretamente em aplicativos .NET .

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