HOWTO · Csharp
Grave em um arquivo do Excel em C#
Podemos usar a API do Microsoft Office para gravar em um arquivo Excel em C#.
Nesta página
Para gravar dados em uma pasta de trabalho do Excel usando C#, use o Microsoft Office Interop quando o programa precisar automatizar o aplicativo Excel para desktop instalado. Com o Interop, é possível criar uma pasta de trabalho, preencher células e salvar um arquivo .xlsx nativo. O computador que executa o programa precisa ter o Excel instalado. Se o Excel não estiver disponível no ambiente de implantação, use uma biblioteca de planilhas que grave arquivos de pasta de trabalho diretamente.
Escolha uma abordagem para gravar no Excel em sua aplicação
O Microsoft Office Interop inicia o Excel e se comunica com seu modelo de objetos por meio do COM. Escolha essa opção para automatizar o Excel no desktop quando a tarefa depender do próprio aplicativo, por exemplo, de um comportamento específico das pastas de trabalho do Excel. O Interop não é uma biblioteca independente para gravar arquivos: adicionar uma referência ao Interop em um projeto não instala o Excel em outro computador.
Para dados tabulares simples que não precisam de planilhas, fórmulas ou formatação, um arquivo CSV é uma alternativa mais enxuta. O Excel pode abrir o texto de um CSV, mas CSV não é uma pasta de trabalho do Excel e não armazena seus recursos. Os exemplos a seguir mantêm esses dois resultados separados.
Configure o Microsoft Office Interop em C#
No Visual Studio, adicione uma referência COM à Microsoft Excel Object Library pela janela References do projeto. A versão da biblioteca depende da versão do Office instalada. Com uma referência de associação antecipada, importe Microsoft.Office.Interop.Excel, por exemplo, usando using Excel = Microsoft.Office.Interop.Excel;, para distinguir os tipos do Excel de tipos .NET com nomes semelhantes.
O exemplo de pasta de trabalho a seguir usa associação tardia por meio do ProgID do COM do Excel, portanto não precisa desse namespace no código-fonte. Ainda assim, ele automatiza o Excel e requer que o Excel esteja instalado no Windows durante a execução. Use a referência de associação antecipada quando quiser tipos do Excel verificados em tempo de compilação e IntelliSense; use a associação tardia quando a implantação controlar a versão instalada do Excel e você quiser evitar uma referência específica de versão. Uma referência, por si só, não disponibiliza o Excel em um servidor ou em outro computador.
Crie uma pasta de trabalho e grave dados nas células
Este exemplo com Interop inicia o Excel, adiciona uma pasta de trabalho, grava um cabeçalho e duas linhas de dados e salva um arquivo .xlsx nativo no diretório temporário do sistema. O valor de formato 51 corresponde ao formato de arquivo xlOpenXMLWorkbook do Excel. Um GUID torna exclusivo o nome do arquivo de saída a cada execução, evitando que a instância oculta do Excel aguarde uma confirmação para sobrescrever o arquivo. O código foi feito para Windows com o Excel para desktop instalado; não há saída de execução apresentada.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
using System;
using System.IO;
using System.Runtime.InteropServices;
class Program
{
static void Main()
{
if (Environment.OSVersion.Platform != PlatformID.Win32NT)
{
Console.WriteLine("This example requires Windows with Excel installed.");
return;
}
object excelApp = null;
object workbooks = null;
object workbook = null;
object worksheets = null;
object worksheet = null;
object cells = null;
try
{
Type excelType = Type.GetTypeFromProgID("Excel.Application");
if (excelType == null)
{
Console.WriteLine("Excel is not registered on this computer.");
return;
}
dynamic app = Activator.CreateInstance(excelType);
excelApp = app;
app.Visible = false;
workbooks = app.Workbooks;
dynamic books = workbooks;
workbook = books.Add();
dynamic book = workbook;
worksheets = book.Worksheets;
dynamic sheets = worksheets;
worksheet = sheets[1];
dynamic sheet = worksheet;
cells = sheet.Range["A1:B3"];
dynamic dataRange = cells;
object[,] values =
{
{ "Name", "Age" },
{ "Ava", 28 },
{ "Liam", 31 }
};
dataRange.Value2 = values;
string fileName = "example-" + Guid.NewGuid().ToString("N") + ".xlsx";
string path = Path.Combine(Path.GetTempPath(), fileName);
book.SaveAs(path, 51);
Console.WriteLine("Saved " + Path.GetFileName(path));
}
catch (Exception ex)
{
Console.WriteLine("Excel operation failed: " + ex.Message);
}
finally
{
CloseWorkbook(workbook);
ReleaseComObject(cells);
ReleaseComObject(worksheet);
ReleaseComObject(worksheets);
ReleaseComObject(workbook);
ReleaseComObject(workbooks);
QuitExcel(excelApp);
ReleaseComObject(excelApp);
}
}
static void CloseWorkbook(object value)
{
if (value == null) return;
try { ((dynamic)value).Close(false); }
catch { }
}
static void QuitExcel(object value)
{
if (value == null) return;
try { ((dynamic)value).Quit(); }
catch { }
}
static void ReleaseComObject(object value)
{
if (value == null) return;
try
{
if (Marshal.IsComObject(value)) Marshal.FinalReleaseComObject(value);
}
catch { }
}
}
Para dados tabulares simples, um exemplo separado de CSV grava texto separado por vírgulas que o Excel pode abrir. Ele não cria uma pasta de trabalho nem oferece suporte a várias planilhas, fórmulas ou formatação. Os valores de exemplo não precisam de aspas CSV; ao gravar texto arbitrário, coloque entre aspas os campos que contenham vírgulas, aspas ou quebras de linha e duplique as aspas que já existirem no campo.
Execute este exemplo:
using System;
using System.IO;
class Program
{
static void Main()
{
string path = "example.csv";
string contents = "Name,Age\nJohn Doe,30\n";
File.WriteAllText(path, contents);
Console.WriteLine("Wrote " + path);
}
}
Wrote example.csv
Grave em um arquivo do Excel existente
Abra a pasta de trabalho pelo caminho completo, mantenha o intervalo selecionado como uma referência COM e libere essa referência durante a limpeza. Save atualiza o arquivo aberto no próprio local; use SaveAs quando quiser salvar em um novo caminho ou criar uma cópia. Substitua o caminho de exemplo pelo da pasta de trabalho que deseja editar. Este exemplo para Excel no desktop do Windows não apresenta saída de execução.
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
using System;
using System.IO;
using System.Runtime.InteropServices;
class Program
{
static void Main()
{
if (Environment.OSVersion.Platform != PlatformID.Win32NT)
{
Console.WriteLine("This example requires Windows with Excel installed.");
return;
}
object excelApp = null;
object workbooks = null;
object workbook = null;
object worksheets = null;
object worksheet = null;
object cells = null;
string path = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
"report.xlsx");
try
{
if (!File.Exists(path))
throw new FileNotFoundException("Workbook not found; update the sample path.", path);
Type excelType = Type.GetTypeFromProgID("Excel.Application");
if (excelType == null)
throw new InvalidOperationException("Excel is not registered on this computer.");
dynamic app = Activator.CreateInstance(excelType);
excelApp = app;
app.Visible = false;
workbooks = app.Workbooks;
dynamic books = workbooks;
workbook = books.Open(path);
dynamic book = workbook;
worksheets = book.Worksheets;
dynamic sheets = worksheets;
worksheet = sheets[1];
dynamic sheet = worksheet;
cells = sheet.Range["B2:C2"];
dynamic selectedCells = cells;
selectedCells.Value2 = new object[,] { { "Reviewed", DateTime.Today.ToString("yyyy-MM-dd") } };
book.Save();
Console.WriteLine("Updated " + Path.GetFileName(path));
}
catch (Exception ex)
{
Console.WriteLine("Excel operation failed: " + ex.Message);
}
finally
{
CloseWorkbook(workbook);
ReleaseComObject(cells);
ReleaseComObject(worksheet);
ReleaseComObject(worksheets);
ReleaseComObject(workbook);
ReleaseComObject(workbooks);
QuitExcel(excelApp);
ReleaseComObject(excelApp);
}
}
static void CloseWorkbook(object value)
{
if (value == null) return;
try { ((dynamic)value).Close(false); }
catch { }
}
static void QuitExcel(object value)
{
if (value == null) return;
try { ((dynamic)value).Quit(); }
catch { }
}
static void ReleaseComObject(object value)
{
if (value == null) return;
try
{
if (Marshal.IsComObject(value)) Marshal.FinalReleaseComObject(value);
}
catch { }
}
}
Se a origem for um CSV, use operações de arquivo e regrave suas linhas; CSV não tem um modelo de objetos de planilha ou célula.
Feche o Excel e trate os erros
As operações com arquivos podem falhar quando um caminho não está disponível ou o destino não permite gravação. O Interop também pode falhar ao iniciar o Excel, abrir uma pasta de trabalho, gravar em uma célula ou salvar, inclusive quando a pasta de trabalho está em uso. Capture erros nos pontos em que a aplicação possa exibir ou registrar uma mensagem útil. Coloque o fechamento da pasta de trabalho, Quit e a liberação das referências COM em finally; capturar um erro, por si só, não limpa os recursos do Excel. O exemplo protege cada etapa de limpeza para que uma falha ao fechar não impeça as tentativas seguintes.
Mantenha o aplicativo Excel aberto apenas durante a operação e evite guardar referências COM adicionais, como objetos Range sem controle. Ao adaptar o exemplo, altere o caminho de saída temporário para o destino escolhido. Para aplicar formatação, defina as propriedades relevantes do intervalo da planilha depois de gravar os valores; a saída CSV não preserva essa formatação. Se usar o exemplo de CSV em uma aplicação, trate também os erros de operações com arquivos.