Neste post quero mostrar uma função para exportar dados de uma DataTable para um arquivo do Excel. O método utiliza a biblioteca OpenXML e não requer o Office instalado, para usá-la você precisa apenas referenciar a biblioteca OpenXML.

Digite o comando abaixo no Package Manager Console:

PM> Install-Package DocumentFormat.OpenXml

Insira os seguintes namespaces.

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Spreadsheet;

Crie um arquivo de template onde a última linha guardará os títulos das colunas. Chame-o de Template.xlsx e coloque-o na mesma pasta do executável.

image 

static void ExportData(string filename, DataTable dt)
{
    using (SpreadsheetDocument doc = SpreadsheetDocument.Open(filename, true))
    {
        WorkbookPart workbookPart = doc.WorkbookPart;
        WorksheetPart worksheetPart = workbookPart.WorksheetParts.Last();
        SheetData sheetData = worksheetPart.Worksheet.GetFirstChild();

        //
        // CABEÇALHO
        //
        var cabecalho = sheetData.LastChild;

        for (int col = 0; col < dt.Columns.Count; col++)
        {
            Cell titulo = (Cell)cabecalho.ChildElements[col];
            titulo.DataType = CellValues.InlineString;
            titulo.InlineString = new InlineString { Text = new Text { Text = dt.Columns[col].Caption } };
        }

        //
        // CONTEÚDO
        //
        for (int row = 0; row < dt.Rows.Count; row++)
        {
            DataRow dtRow = dt.Rows[row];

            Row r = new Row();

            for (int col = 0; col < dt.Columns.Count; col++)
            {
                Cell c = new Cell();
                c.DataType = CellValues.InlineString;
                c.InlineString = new InlineString { Text = new Text { Text = dt.Rows[row][col].ToString() } };

                r.Append(c);
            }

            sheetData.Append(r);
        }

        worksheetPart.Worksheet.Save();
    }
}

Chame a função assim (Onde dt é uma DataTable qualquer.):

ExportData("Template.xlsx", dt);

Após executar a função o arquivo será atualizado com os dados da DataTable. Veja:

image