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

Como escrever arquivos CSV em .NET com IronXL

Por que desenvolvedores .NET precisam de uma solução CSV melhor?

Os arquivos CSV alimentam a troca de dados em inúmeras aplicações .NET -- e as opções da biblioteca padrão geralmente são insuficientes quando você precisa lidar com a complexidade do mundo real. De relatórios financeiros a sistemas de inventário, você pode criar programaticamente arquivos CSV em apenas algumas linhas de código. Enquanto bibliotecas como CsvHelper cobrem operações básicas de CSV, desenvolvedores modernos enfrentam cenários complexos: converter livros de Excel com fórmulas, preservar tipos de dados durante a exportação e lidar com fluxos de trabalho de planilhas de nível empresarial. IronXL aborda esses desafios combinando escrita confiável de CSV com funcionalidade completa de Excel em uma única biblioteca sem dependências que segue os padrões RFC 4180.

Isso a torna ideal para desenvolvedores que estão construindo um gravador CSV .NET personalizado ou um analisador CSV .NET que suporta múltiplas colunas, lógica de processamento específica para linhas e separadores inferidos automaticamente. Este tutorial você ensina as capacidades de CSV do IronXL -- desde a criação básica de arquivos até exportações de dados em escala empresarial.

Como instalar e configurar o IronXL?

A instalação do IronXL leva alguns segundos através do Gerenciador de Pacotes NuGet. Você pode usar o Console do Gerenciador de Pacotes ou a CLI do .NET :

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

Uma vez instalado, adicione o namespace IronXL e comece a escrever arquivos CSV imediatamente. O exemplo a seguir mostra como criar uma pasta de trabalho, preenchê-la com dados e exportar para CSV usando declarações de nível superior no .NET 10:

using IronXL;

// Create a new workbook and worksheet
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("data");

// Add headers
workSheet["A1"].Value = "Product";
workSheet["B1"].Value = "Quantity";
workSheet["C1"].Value = "Price";

// Add data rows
workSheet["A2"].Value = "Widget";
workSheet["B2"].Value = 100;
workSheet["C2"].Value = 19.99;

workSheet["A3"].Value = "Gadget";
workSheet["B3"].Value = 250;
workSheet["C3"].Value = 34.50;

workSheet["A4"].Value = "Component";
workSheet["B4"].Value = 75;
workSheet["C4"].Value = 8.99;

// Save as CSV with comma delimiter
workBook.SaveAsCsv("inventory.csv", ",");
using IronXL;

// Create a new workbook and worksheet
WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("data");

// Add headers
workSheet["A1"].Value = "Product";
workSheet["B1"].Value = "Quantity";
workSheet["C1"].Value = "Price";

// Add data rows
workSheet["A2"].Value = "Widget";
workSheet["B2"].Value = 100;
workSheet["C2"].Value = 19.99;

workSheet["A3"].Value = "Gadget";
workSheet["B3"].Value = 250;
workSheet["C3"].Value = 34.50;

workSheet["A4"].Value = "Component";
workSheet["B4"].Value = 75;
workSheet["C4"].Value = 8.99;

// Save as CSV with comma delimiter
workBook.SaveAsCsv("inventory.csv", ",");
$vbLabelText   $csharpLabel

Este programa simples mostra como escrever conteúdo CSV diretamente do seu código C#, criando um objeto WorkBook que contém seus dados. O método SaveAsCsv usa uma vírgula como delimitador padrão, mas permite especificar qualquer caractere delimitador -- útil para cenários específicos de localidade onde ponto e vírgula ou tabulações são os separadores de coluna padrão.

Compreendendo o Modelo de WorkBook e WorkSheet

IronXL organiza dados através de uma hierarquia de workbook para worksheet. Um WorkBook atua como um recipiente para um ou mais objetos WorkSheet, cada um representando uma grade de células. Quando você exporta para CSV, o IronXL cria um arquivo por planilha, nomeando-os com o padrão filename.SheetName.csv.

Este modelo oferece uma API consistente, seja ao criar novos arquivos do zero, carregar workbooks do Excel existentes ou exportar dados de um banco de dados. Você referencia células usando notação padrão do Excel (A1, B2) ou inteiros de linha e coluna baseados em zero, conforme se adapta melhor ao seu fluxo de trabalho.

Como Escrever Arquivos CSV com Delimitadores Personalizados?

Diferentes regiões e sistemas esperam diferentes separadores de coluna. As localidades europeias frequentemente usam ponto e vírgula porque as vírgulas aparecem em números decimais. Valores separados por tabulação (TSV) são comuns na bioinformática e em pipelines de processamento de logs. O método SaveAsCsv do IronXL aceita qualquer string como delimitador:

using IronXL;

WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("sales");

workSheet["A1"].Value = "Region";
workSheet["B1"].Value = "Revenue";
workSheet["C1"].Value = "Units";

workSheet["A2"].Value = "Europe";
workSheet["B2"].Value = "1250000.50";
workSheet["C2"].Value = 3400;

workSheet["A3"].Value = "Nãorth America";
workSheet["B3"].Value = "2800000.00";
workSheet["C3"].Value = 7200;

// Semicolon delimiter for European locales
workBook.SaveAsCsv("sales_europe.csv", ";");

// Tab delimiter for TSV output
workBook.SaveAsCsv("sales_tsv.tsv", "\t");
using IronXL;

WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("sales");

workSheet["A1"].Value = "Region";
workSheet["B1"].Value = "Revenue";
workSheet["C1"].Value = "Units";

workSheet["A2"].Value = "Europe";
workSheet["B2"].Value = "1250000.50";
workSheet["C2"].Value = 3400;

workSheet["A3"].Value = "Nãorth America";
workSheet["B3"].Value = "2800000.00";
workSheet["C3"].Value = 7200;

// Semicolon delimiter for European locales
workBook.SaveAsCsv("sales_europe.csv", ";");

// Tab delimiter for TSV output
workBook.SaveAsCsv("sales_tsv.tsv", "\t");
$vbLabelText   $csharpLabel

A string delimitadora vai diretamente para o slot de caractere separador sem qualquer configuração de análise adicional. IronXL lida com a citação para células que contêm o caractere delimitador, garantindo que a saída esteja em conformidade com o RFC 4180.

Como Converter Workbooks do Excel para CSV?

Como Criar um Escritor de CSV .NET Usando o IronXL: Figura 1 - Exemplo de saída CSV com IronXL

IronXL se destaca na conversão de arquivos Excel existentes para CSV, avaliando fórmulas e preservando a integridade dos dados. Isso é essencial ao trabalhar com planilhas que contêm tanto linhas de cabeçalho quanto valores calculados dinamicamente.

using IronXL;

// Load an Excel file with formulas and formatting
WorkBook workBook = WorkBook.Load("financial_report.xlsx");

// Evaluate all formulas before export so calculated values appear in CSV
workBook.EvaluateAll();

// Export to CSV -- each worksheet creates a separate CSV file
// Creates: report.Sheet1.csv, report.Sheet2.csv, etc.
workBook.SaveAsCsv("report.csv", ",");
using IronXL;

// Load an Excel file with formulas and formatting
WorkBook workBook = WorkBook.Load("financial_report.xlsx");

// Evaluate all formulas before export so calculated values appear in CSV
workBook.EvaluateAll();

// Export to CSV -- each worksheet creates a separate CSV file
// Creates: report.Sheet1.csv, report.Sheet2.csv, etc.
workBook.SaveAsCsv("report.csv", ",");
$vbLabelText   $csharpLabel

Ao converter livros de múltiplas planilhas, IronXL gera automaticamente arquivos CSV individuais para cada planilha. Os cálculos de fórmulas são executados antes da exportação, garantindo dados precisos na saída CSV final. O método EvaluateAll resolve todas as fórmulas, incluindo referências cruzadas entre folhas, antes que o arquivo seja gravado no disco.

Saída

Primeiro, aqui você pode ver os arquivos CSV gerados a partir do arquivo Excel com várias planilhas:

Como Criar um Escritor de CSV .NET Usando o IronXL: Figura 2 - Arquivos CSV

E este é um exemplo de comparação de uma das planilhas do Excel vs. o arquivo CSV correspondente:

Como Criar um Escritor de CSV .NET Usando o IronXL: Figura 3 - Exemplo de saída

Como você exporta um DataTable para CSV?

Para aplicativos baseados em banco de dados, IronXL torna exportações de DataTable simples. O exemplo a seguir lê um DataTable de uma fonte de dados simulada e escreve-o em CSV com um delimitador de ponto e vírgula:

using System.Data;
using IronXL;

// Simulate a DataTable from a database query
DataTable dataTable = GetSalesData();

WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("sales");

// Write column headers from DataTable schema
for (int col = 0; col < dataTable.Columns.Count; col++)
{
    workSheet.SetCellValue(0, col, dataTable.Columns[col].ColumnName);
}

// Write data rows
int row = 1;
foreach (DataRow dataRow in dataTable.Rows)
{
    for (int col = 0; col < dataTable.Columns.Count; col++)
    {
        workSheet.SetCellValue(row, col, dataRow[col]?.ToString() ?? string.Empty);
    }
    row++;
}

// Export with semicolon delimiter for European compatibility
workBook.SaveAsCsv("sales_data.csv", ";");
using System.Data;
using IronXL;

// Simulate a DataTable from a database query
DataTable dataTable = GetSalesData();

WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("sales");

// Write column headers from DataTable schema
for (int col = 0; col < dataTable.Columns.Count; col++)
{
    workSheet.SetCellValue(0, col, dataTable.Columns[col].ColumnName);
}

// Write data rows
int row = 1;
foreach (DataRow dataRow in dataTable.Rows)
{
    for (int col = 0; col < dataTable.Columns.Count; col++)
    {
        workSheet.SetCellValue(row, col, dataRow[col]?.ToString() ?? string.Empty);
    }
    row++;
}

// Export with semicolon delimiter for European compatibility
workBook.SaveAsCsv("sales_data.csv", ";");
$vbLabelText   $csharpLabel

Ao importar de um DataTable, cada linha na coleção dataTable.Rows torna-se uma nova linha na planilha. IronXL preserva tipos de dados durante a conversão -- números permanecem numéricos, datas mantêm seu formato e texto manuseia caracteres especiais sem configuração adicional.

Saída

Aqui, você pode ver a fonte de dados simulada ao lado do arquivo CSV de saída:

Como Criar um Escritor de CSV .NET Usando o IronXL: Figura 4 - Exportando DataTable para saída CSV

!{--010011000100100101000010010100100100000101010010010110010101111101000111010001010101010100010111110101001101010100010000010101001001010100010001010100010001011111010101110100100 101010100010010000101111101010000010100100111101000100010101010100001101010100010111110101010001010010010010010010010100000101001100010111110100001001001100010011110100001101001011--}

Como o IronXL se Compara ao CsvHelper para Escrever Arquivos CSV?

Considere este cenário de exportação de dados de funcionários demonstrando fluxos de trabalho de escrita de CSV com ambas as bibliotecas.

Implementação CsvHelper:

using System.Globalization;
using System.IO;
using CsvHelper;

using var writer = new StreamWriter("employees.csv");
using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
csv.WriteRecords(employees);
using System.Globalization;
using System.IO;
using CsvHelper;

using var writer = new StreamWriter("employees.csv");
using var csv = new CsvWriter(writer, CultureInfo.InvariantCulture);
csv.WriteRecords(employees);
$vbLabelText   $csharpLabel

Implementação IronXL:

using IronXL;

WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("employees");

int rowIndex = 1;
foreach (var emp in employees)
{
    workSheet[$"A{rowIndex}"].Value = emp.Name;
    workSheet[$"B{rowIndex}"].Value = emp.Salary;
    workSheet[$"C{rowIndex}"].Value = emp.StartDate;
    rowIndex++;
}

workBook.SaveAsCsv("employees.csv", ",");
using IronXL;

WorkBook workBook = WorkBook.Create();
WorkSheet workSheet = workBook.CreateWorkSheet("employees");

int rowIndex = 1;
foreach (var emp in employees)
{
    workSheet[$"A{rowIndex}"].Value = emp.Name;
    workSheet[$"B{rowIndex}"].Value = emp.Salary;
    workSheet[$"C{rowIndex}"].Value = emp.StartDate;
    rowIndex++;
}

workBook.SaveAsCsv("employees.csv", ",");
$vbLabelText   $csharpLabel
Comparação de Recursos do IronXL vs CsvHelper
Recurso CsvHelper IronXL
Escrita Básica de CSV Sim Sim
Conversão de Excel para CSV Não Sim
Avaliação de Fórmulas Não Sim
Manipulação de Múltiplas Planilhas Não Sim
Preservação de Tipos de Dados Manual Automático
Suporte a Formato Excel (XLSX, XLS, XLSM) Não Sim
Nenhum MS Office Necessário Sim Sim
Formatação e Estilos de Célula Não Sim
Multiplataforma (Suporte a .NET 10) Sim Sim

CsvHelper lida com a serialização direta de objetos POCO de forma eficiente. IronXL oferece capacidades adicionais quando você precisa carregar arquivos Excel existentes, avaliar fórmulas antes da exportação ou gerenciar intervalos de worksheet com controle detalhado. Se o seu fluxo de trabalho envolve receber arquivos .xlsx de usuários de negócios e convertê-los para CSV para sistemas downstream, o IronXL remove uma etapa inteira de conversão do seu pipeline.

Quais Recursos Corporativos o IronXL Oferece para Exportação CSV?

O método SaveAsCsv do IronXL vem com várias capacidades prontas para produção:

Recursos Corporativos de Exportação CSV do IronXL
Recurso Descrição Caso de uso
Delimitadores Personalizados Vírgula, ponto e vírgula, tabulação ou qualquer caractere Compatibilidade com localidade regional
Opções de Codificação UTF-8, UTF-16 e codificações personalizadas Conjuntos de caracteres internacionais
Avaliação de Fórmulas Calcula fórmulas do Excel antes da exportação Relatórios financeiros, dados dinâmicos
Suporte multiplataforma Windows, Linux, macOS Implantações na nuvem e em contêineres
Exportação de Múltiplas Planilhas Um arquivo CSV por worksheet Estruturas complexas de livro de trabalho
Compatibilidade com RFC 4180 Aspas automáticas para caracteres especiais Interoperabilidade garantida

Você pode aplicar formatação de dados de célula antes da exportação para controlar como números, moedas e datas aparecem na saída CSV. Para grandes volumes de dados, processe os dados em partes usando operações de intervalo de planilha para manter o uso de memória previsível.

O suporte multiplataforma significa que você pode implantar a geração de CSV com IronXL em contêineres Linux no Kubernetes ou no Azure App Service sem nenhuma alteração no seu código. A biblioteca não inclui dependências não gerenciadas, por isso funciona de forma idêntica em diferentes sistemas operacionais. Consulte o guia de compatibilidade de plataforma IronXL para obter detalhes completos sobre os ambientes suportados.

Como você lida com problemas comuns de exportação de CSV?

Ao trabalhar com exportações CSV em grande escala, surgem vários problemas previsíveis. Veja como resolver cada um deles:

Caracteres especiais em dados: IronXL escapa automaticamente aspas, vírgulas e quebras de linha dentro dos valores das células. Você não precisa pré-processar strings ou escrever lógica de escape personalizada -- a biblioteca lida com as regras de aspas do RFC 4180 internamente.

Manipulação de arquivos grandes: Para livros de trabalho com dezenas de milhares de linhas, use intervalos de planilha para processar dados em lotes. Escrever em planilhas intermediárias antes da exportação final dá a você controle sobre a alocação de memória.

Problemas de codificação: Especifique explicitamente a codificação UTF-8 ao lidar com caracteres internacionais, escrituras asiáticas ou emojis nos valores das células. IronXL oferece suporte a codificação UTF-8 e UTF-16 de imediato, então nenhuma biblioteca de codificação de terceiros é necessária.

Dados ausentes ou digitados incorretamente: IronXL preserva os formatos numéricos e de data por padrão. Quando uma célula contém uma fórmula que referencia dados ausentes, EvaluateAll() se resolverá em um valor de erro ao invés de emitir silenciosamente texto em branco, tornando problemas de qualidade de dados visíveis cedo no pipeline.

Conflitos de delimitador: Se seus dados contêm o caractere delimitador (por exemplo, um campo de preço contendo $1,200.00 ao usar vírgula como delimitador), o IronXL envolverá o valor em aspas duplas automaticamente conforme as regras do RFC 4180.

Para orientações detalhadas, visite a documentação CSV do IronXL, a referência de API e os recursos de suporte.

Como você lê e analisa arquivos CSV com IronXL?

Escrever CSV é apenas metade da história. IronXL também lida com leitura e análise de CSV, carregando dados separados por vírgulas em uma estrutura de livro de trabalho que você pode consultar, filtrar e transformar antes de exportar para qualquer formato.

using IronXL;

// Load an existing CSV file into a workbook
WorkBook workBook = WorkBook.Load("sales_data.csv");
WorkSheet workSheet = workBook.DefaultWorkSheet;

// Iterate over rows and process data
foreach (var row in workSheet.Rows)
{
    string product = row["A"].ToString();
    int quantity = row["B"].IntValue;
    decimal price = (decimal)row["C"].DoubleValue;

    Console.WriteLine($"Product: {product}, Qty: {quantity}, Price: {price:C}");
}

// Apply a filter and re-export to a new CSV
workBook.SaveAsCsv("filtered_output.csv", ",");
using IronXL;

// Load an existing CSV file into a workbook
WorkBook workBook = WorkBook.Load("sales_data.csv");
WorkSheet workSheet = workBook.DefaultWorkSheet;

// Iterate over rows and process data
foreach (var row in workSheet.Rows)
{
    string product = row["A"].ToString();
    int quantity = row["B"].IntValue;
    decimal price = (decimal)row["C"].DoubleValue;

    Console.WriteLine($"Product: {product}, Qty: {quantity}, Price: {price:C}");
}

// Apply a filter and re-export to a new CSV
workBook.SaveAsCsv("filtered_output.csv", ",");
$vbLabelText   $csharpLabel

Carregar um arquivo CSV através do IronXL dá acesso à API de planilha completa, incluindo classificação, filtragem e avaliação de fórmulas. Você também pode salvar os dados carregados como um arquivo Excel usando SaveAs, convertendo CSV para XLSX em uma única chamada de método -- um requisito comum ao construir serviços de geração de relatórios.

Como você valida dados CSV antes da exportação?

A validação de dados antes da exportação previne falhas no pipeline posterior. IronXL oferece acesso direto aos valores e tipos de célula, para que você possa verificar nulos, impor intervalos numéricos e rejeitar datas malformadas antes de escrever:

using IronXL;

WorkBook workBook = WorkBook.Load("input.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;

var errors = new List<string>();

for (int rowIdx = 1; rowIdx <= workSheet.RowCount; rowIdx++)
{
    string productName = workSheet[$"A{rowIdx}"].StringValue;
    double price = workSheet[$"C{rowIdx}"].DoubleValue;

    if (string.IsNullOrWhiteSpace(productName))
        errors.Add($"Row {rowIdx}: Product name is empty.");

    if (price <= 0)
        errors.Add($"Row {rowIdx}: Price must be greater than zero (found {price}).");
}

if (errors.Count == 0)
{
    workBook.SaveAsCsv("validated_output.csv", ",");
    Console.WriteLine("Export complete.");
}
else
{
    foreach (var error in errors)
        Console.WriteLine(error);
}
using IronXL;

WorkBook workBook = WorkBook.Load("input.xlsx");
WorkSheet workSheet = workBook.DefaultWorkSheet;

var errors = new List<string>();

for (int rowIdx = 1; rowIdx <= workSheet.RowCount; rowIdx++)
{
    string productName = workSheet[$"A{rowIdx}"].StringValue;
    double price = workSheet[$"C{rowIdx}"].DoubleValue;

    if (string.IsNullOrWhiteSpace(productName))
        errors.Add($"Row {rowIdx}: Product name is empty.");

    if (price <= 0)
        errors.Add($"Row {rowIdx}: Price must be greater than zero (found {price}).");
}

if (errors.Count == 0)
{
    workBook.SaveAsCsv("validated_output.csv", ",");
    Console.WriteLine("Export complete.");
}
else
{
    foreach (var error in errors)
        Console.WriteLine(error);
}
$vbLabelText   $csharpLabel

Este padrão é particularmente valioso em pipelines ETL, onde linhas ruins devem ser rejeitadas -- e registradas -- em vez de silenciosamente exportadas. Os métodos de acesso a dados de célula nos objetos RangeRow e Cell do IronXL retornam valores fortemente tipados, reduzindo o risco de erros silenciosos de coerção de tipo.

Como você começa a usar o IronXL para escrita de CSV?

IronXL transforma a escrita de CSV de um desafio de análise em uma operação direta. Ao combinar a funcionalidade de CSV com suporte a livros de trabalho do Excel, avaliação de fórmulas e manipulação automática de tipos, elimina a complexidade de gerenciar várias bibliotecas ou conversões manuais de dados.

O teste gratuito dá acesso completo a todos os recursos -- incluindo exportações multi-planilha, avaliação de fórmulas e implantação multiplataforma -- sem exigir uma chave de licença durante o desenvolvimento. Quando estiver pronto para mover para produção, o licenciamento começa em um nível de desenvolvedor único que cobre o uso comercial.

Recursos chave para começar:

Pronto para construir fluxos de trabalho CSV prontos para produção? Comece seu teste gratuito e tenha sua primeira exportação CSV rodando em menos de cinco minutos.

Perguntas frequentes

Para que serve o IronXL?

IronXL é uma biblioteca .NET projetada para trabalhar com arquivos do Excel, permitindo que desenvolvedores criem, leiam e modifiquem documentos do Excel, bem como os exportem para vários formatos, como CSV, preservando os tipos de dados e gerenciando cenários complexos de planilhas.

Como o IronXL pode ajudar na escrita de arquivos CSV em .NET?

O IronXL oferece funcionalidades para exportar planilhas do Excel para o formato CSV, garantindo a preservação dos tipos de dados e o tratamento eficaz de cenários complexos em planilhas, tornando-se a escolha ideal para desenvolvedores .NET que precisam de uma solução robusta para escrita de CSV.

Por que os desenvolvedores devem considerar o uso do IronXL para operações com arquivos CSV?

Os desenvolvedores devem considerar o uso do IronXL devido à sua capacidade de exportar arquivos do Excel para CSV de forma integrada, lidar com grandes conjuntos de dados e manter a integridade dos tipos de dados, oferecendo uma solução superior para operações com CSV em aplicativos .NET.

Quais são os benefícios de usar o IronXL para gerenciamento de planilhas?

As vantagens de usar o IronXL para gerenciamento de planilhas incluem a fácil manipulação de documentos do Excel, suporte a vários formatos de exportação, como CSV, e a capacidade de lidar com estruturas de dados complexas e grandes conjuntos de dados de forma eficiente em aplicativos .NET.

O IronXL consegue lidar com arquivos Excel grandes ao exportar para CSV?

Sim, o IronXL foi projetado para lidar com arquivos Excel grandes de forma eficiente, permitindo que os desenvolvedores exportem grandes quantidades de dados para CSV sem comprometer o desempenho ou a integridade dos dados.

Como o IronXL garante a preservação do tipo de dados ao exportar para CSV?

A IronXL garante a preservação do tipo de dados, convertendo com precisão os dados do Excel para o formato CSV, mantendo os tipos e estruturas de dados originais, o que é crucial para aplicações que exigem manipulação precisa de dados.

O IronXL é adequado para cenários complexos com planilhas?

O IronXL é ideal para cenários complexos com planilhas, oferecendo recursos avançados para gerenciar e manipular documentos Excel complexos e garantindo que os dados possam ser exportados com precisão para CSV ou outros formatos.

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