How to export DataTable to Excel

后端 未结 21 2594
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-22 15:36

How can I export a DataTable to Excel in C#? I am using Windows Forms. The DataTable is associated with a DataGridView control. I have

21条回答
  •  一生所求
    2020-11-22 15:54

    An elegant option is writing an extension method (see below) for the DataTable class of .net framework.

    This extention method can be called as follows:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Excel = Microsoft.Office.Interop.Excel;
    using System.Data;
    using System.Data.OleDb;
    
    DataTable dt;
    // fill table data in dt here 
    ...
    
    // export DataTable to excel
    // save excel file without ever making it visible if filepath is given
    // don't save excel file, just make it visible if no filepath is given
    dt.ExportToExcel(ExcelFilePath);
    

    Extension method for DataTable class:

    public static class My_DataTable_Extensions
    {
    
        // Export DataTable into an excel file with field names in the header line
        // - Save excel file without ever making it visible if filepath is given
        // - Don't save excel file, just make it visible if no filepath is given
        public static void ExportToExcel(this DataTable tbl, string excelFilePath = null) {
            try {
                if (tbl == null || tbl.Columns.Count == 0)
                    throw new Exception("ExportToExcel: Null or empty input table!\n");
    
                // load excel, and create a new workbook
                var excelApp = new Excel.Application();
                excelApp.Workbooks.Add();
    
                // single worksheet
                Excel._Worksheet workSheet = excelApp.ActiveSheet;
    
                // column headings
                for (var i = 0; i < tbl.Columns.Count; i++) {
                    workSheet.Cells[1, i + 1] = tbl.Columns[i].ColumnName;
                }
    
                // rows
                for (var i = 0; i < tbl.Rows.Count; i++) {
                    // to do: format datetime values before printing
                    for (var j = 0; j < tbl.Columns.Count; j++) {
                        workSheet.Cells[i + 2, j + 1] = tbl.Rows[i][j];
                    }
                }
    
                // check file path
                if (!string.IsNullOrEmpty(excelFilePath)) {
                    try {
                        workSheet.SaveAs(excelFilePath);
                        excelApp.Quit();
                        MessageBox.Show("Excel file saved!");
                    }
                    catch (Exception ex) {
                        throw new Exception("ExportToExcel: Excel file could not be saved! Check filepath.\n"
                                            + ex.Message);
                    }
                } else { // no file path is given
                    excelApp.Visible = true;
                }
            }
            catch (Exception ex) {
                throw new Exception("ExportToExcel: \n" + ex.Message);
            }
        }
    }
    

提交回复
热议问题