Excel快速DataGrid导出

时间:2019-10-04 04:32:31

标签: c# excel wpf

使用显示大量信息的数据网格,总是超过1万行,最多5到6列的百万行。 我想在我的WPF应用程序上有一个按钮,用于将数据导出到excel文件,并保持相同的列结构。

我正在使用MicrosoftOffice-Interop =,但是这需要很长时间才能执行。有没有更快的方法来实现这一目标?

谢谢

我的Excel导出帮助程序类:

public static DataTable ConvertToDataTable<T>(IList<T> data)
{
    var properties = TypeDescriptor.GetProperties(typeof(T));
    DataTable table = new System.Data.DataTable();
    foreach (PropertyDescriptor prop in properties)
    {
        table.Columns.Add(prop.Name, 
            Nullable.GetUnderlyingType(prop.PropertyType) ?? 
            prop.PropertyType);
    }
    foreach (T item in data)
    {
        DataRow row = table.NewRow();
        foreach (PropertyDescriptor prop in properties)
        {
            row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
        }
        table.Rows.Add(row);
    }
    return table;
}

public static void ExportToExcel(DataTable tbl, ProgressDialogController dialogController, 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 Microsoft.Office.Interop.Excel.Application();
        excelApp.Workbooks.Add();
        // single worksheet
        Microsoft.Office.Interop.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;
            if(dialogController.IsCanceled)
            {
                return;                        
            }
        }
        // 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];
            }
            dialogController.SetProgress((double)i / tbl.Rows.Count);
            if (dialogController.IsCanceled)
            {
                return;
            }
        }
        // check file path
        if (!string.IsNullOrEmpty(excelFilePath))
        {
            try
            {
                // workSheet.SaveAs(excelFilePath);
                workSheet.SaveAs(excelFilePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook, Missing.Value,
                    Missing.Value, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
                    Microsoft.Office.Interop.Excel.XlSaveConflictResolution.xlUserResolution, true,
                    Missing.Value);
                excelApp.Quit();
            }
            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);
    }
}

3 个答案:

答案 0 :(得分:0)

您可以使用Open XML SDK代替Microsoft Interop创建Excel文件。 Interop较慢,需要安装Excel应用程序。开放的XML速度更快,不需要Excel应用程序。

请参阅Microsoft的以下示例:

https://docs.microsoft.com/en-us/office/open-xml/how-to-create-a-spreadsheet-document-by-providing-a-file-name

https://docs.microsoft.com/en-us/office/open-xml/how-to-insert-text-into-a-cell-in-a-spreadsheet

答案 1 :(得分:0)

(defun summit2 (lst)
  (cond 
    ((null lst)
     0)
    ((null (car lst))
     (summit2 (cdr lst)))
    (t
     (+ (car lst) (summit2 (cdr lst))))))

答案 2 :(得分:0)

感谢所有的答案!

两个解决方案似乎都可以正常工作,并且比我的第一个解决方案更快。 但是,经过一些额外的研究,我发现很多人都在使用EPPlus,不仅速度快,而且即使没有安装Excel也可以在任何计算机上使用。 而且比上述解决方案容易得多。

干杯! https://github.com/JanKallman/EPPlus Export DataTable to Excel with EPPlus How do I create an Excel (.XLS and .XLSX) file in C# without installing Microsoft Office?