HOWTO · Csharp
Escribir en un archivo de Excel en C#
Podemos usar la API de Microsoft Office para escribir en un archivo de Excel en C#.
En esta página
Para escribir datos en un libro de Excel desde C#, usa Microsoft Office Interop cuando el programa deba automatizar la aplicación de escritorio de Excel instalada. Interop permite crear un libro, rellenar celdas y guardar un archivo .xlsx nativo. El equipo donde se ejecute el programa debe tener Excel instalado. Si Excel no está disponible en el entorno de implementación, usa una biblioteca de hojas de cálculo que escriba directamente archivos de libro.
Las etiquetas y cadenas visibles de los ejemplos de código se conservan en inglés.
Elige el método para escribir en Excel adecuado para tu aplicación
Microsoft Office Interop inicia Excel y se comunica con su modelo de objetos mediante COM. Elígelo para automatizar la aplicación de escritorio cuando la tarea dependa del propio Excel, por ejemplo, de un comportamiento específico de sus libros. No es una biblioteca independiente para escribir archivos: agregar una referencia de Interop al proyecto no instala Excel en otro equipo.
Para datos tabulares sencillos que no requieran hojas, fórmulas ni formato, un archivo CSV es una alternativa más simple. Excel puede abrir texto CSV, pero un CSV no es un libro de Excel y no puede almacenar sus características. Los ejemplos siguientes mantienen separados ambos resultados.
Configura Microsoft Office Interop en C#
En Visual Studio, agrega una referencia COM a Microsoft Excel Object Library desde el cuadro de diálogo Referencias del proyecto. La versión de la biblioteca depende de la versión de Office instalada. Con una referencia de enlace temprano, importa Microsoft.Office.Interop.Excel, por ejemplo, mediante using Excel = Microsoft.Office.Interop.Excel;, para distinguir los tipos de Excel de los tipos de .NET con nombres similares.
El ejemplo de libro que aparece a continuación usa enlace tardío mediante el ProgID de Excel para COM, así que no necesita ese espacio de nombres en el código fuente. Aun así, automatiza Excel y requiere que Excel esté instalado en Windows durante la ejecución. Usa la referencia de enlace temprano si quieres tipos de Excel en tiempo de compilación e IntelliSense; usa el enlace tardío si el entorno de implementación controla la versión instalada de Excel y quieres evitar una referencia específica de versión. Una referencia por sí sola no hace que Excel esté disponible en un servidor ni en otro equipo.
Crea un libro y escribe datos en las celdas
Este ejemplo con Interop inicia Excel, agrega un libro, escribe un encabezado y dos filas de datos, y guarda un archivo .xlsx nativo en el directorio temporal del sistema. El valor de formato 51 corresponde al formato de archivo xlOpenXMLWorkbook de Excel. Un GUID hace que el nombre del archivo de salida sea único en cada ejecución, de modo que la instancia oculta de Excel no se quede esperando una confirmación para sobrescribirlo. El código está pensado para Windows con Excel de escritorio instalado y no se acompaña de una salida de ejecución.
El código y las etiquetas o salidas visibles de esta sección se mantienen en 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 datos tabulares sencillos, un ejemplo aparte de CSV escribe texto separado por comas que Excel puede abrir. No crea un libro ni admite varias hojas, fórmulas o formato. Los valores de muestra no necesitan comillas CSV; al escribir texto arbitrario, encierra entre comillas los campos que contengan comas, comillas o saltos de línea, y duplica las comillas que aparezcan dentro de esos campos.
Ejecuta este ejemplo:
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
Escribe en un archivo de Excel existente
Abre el libro con su ruta completa, conserva el rango seleccionado como referencia COM y libérala durante la limpieza. Save actualiza el archivo abierto en su ubicación actual; usa SaveAs si quieres guardar en otra ruta o crear una copia. Sustituye la ruta de muestra por la del libro que quieras editar. Este ejemplo para Excel de escritorio en Windows no se acompaña de una salida de ejecución.
El código y las etiquetas o salidas visibles de esta sección se mantienen en 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 { }
}
}
Si el archivo de origen es un CSV, usa operaciones de archivos y vuelve a escribir sus filas: CSV no tiene un modelo de objetos para hojas ni celdas.
Cierra Excel y gestiona los errores
Las operaciones con archivos pueden fallar si una ruta no está disponible o si el destino no permite escritura. Interop también puede fallar al iniciar Excel, abrir un libro, escribir en una celda o guardar, por ejemplo, cuando el libro está en uso. Captura los errores allí donde la aplicación pueda mostrar o registrar un mensaje útil. Coloca el cierre del libro, Quit y la liberación de referencias COM en finally; capturar un error por sí solo no limpia Excel. El ejemplo protege cada acción de limpieza para que un fallo al cerrar no impida intentar las acciones posteriores.
Limita la vida de la aplicación de Excel a la duración de la operación y evita conservar referencias COM adicionales, como objetos Range que no se controlen. Al adaptar el ejemplo, cambia la ruta temporal de salida por el destino que elijas. Para aplicar formato, establece las propiedades pertinentes del rango de la hoja después de escribir los valores; la salida CSV no puede conservar ese formato. Si usas el ejemplo CSV en una aplicación, también debes gestionar los errores de operaciones con archivos.