Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Excel快速数据网格导出_C#_Excel_Wpf - Fatal编程技术网

C# Excel快速数据网格导出

C# Excel快速数据网格导出,c#,excel,wpf,C#,Excel,Wpf,使用datagrid显示大量信息,总是超过10k行,最多一百万行,有5列或6列。 我想在我的WPF应用程序上有一个按钮,将数据导出到excel文件,保持相同的列结构 我使用的是MicrosoftOffice-Interop=,但是,这需要很长时间才能执行。有没有更快的方法来实现这一点 谢谢 我的Excel导出助手类: public static DataTable ConvertToDataTable<T>(IList<T> data) { var propert

使用datagrid显示大量信息,总是超过10k行,最多一百万行,有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);
    }
}
公共静态数据表ConvertToDataTable(IList数据)
{
var properties=TypeDescriptor.GetProperties(typeof(T));
DataTable=新的System.Data.DataTable();
foreach(属性中的PropertyDescriptor属性)
{
表.列.添加(道具名称,
可为Null.GetUnderlineType(prop.PropertyType)??
属性类型);
}
foreach(数据中的T项)
{
DataRow行=table.NewRow();
foreach(属性中的PropertyDescriptor属性)
{
行[prop.Name]=prop.GetValue(项)??DBNull.Value;
}
table.Rows.Add(行);
}
返回表;
}
公共静态void ExportToExcel(数据表tbl,ProgressDialogController,字符串excelFilePath=null)
{
尝试
{
if(tbl==null | | tbl.Columns.Count==0)
抛出新异常(“ExportToExcel:Null或空输入表!\n”);
//加载excel,并创建新工作簿
var excelApp=new Microsoft.Office.Interop.Excel.Application();
excelApp.Workbooks.Add();
//单一工作表
Microsoft.Office.Interop.Excel.\u工作表工作表=excelApp.ActiveSheet;
//列标题
对于(变量i=0;i
您可以使用Open XML SDK来创建Excel文件,而不是Microsoft Interop。互操作速度较慢,需要安装Excel应用程序。Open XML速度更快,不需要Excel应用程序

请参阅Microsoft提供的以下示例:


您可以使用Open XML SDK来创建Excel文件,而不是Microsoft Interop。互操作速度较慢,需要安装Excel应用程序。Open XML速度更快,不需要Excel应用程序

请参阅Microsoft提供的以下示例:


感谢所有的答案,伙计们

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

干杯!
感谢所有的答案,伙计们

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

干杯!

所有这些数据都可以在SQL表中找到。是否可以对其进行编码以将其从SQL表直接导出到Excel?不要尝试逐个单元格进行此操作-这将花费很长时间(正如您已经看到的…)创建一个二维数组,并通过一次操作将其写入工作表。SQL表中提供了所有这些数据。是否可以对其进行编码以将其从SQL表直接导出到Excel?不要尝试逐个单元格进行此操作-这将花费很长时间(正如您已经看到的…)创建一个二维数组,并在一次操作中将其写入工作表。
      //very simple method without external any DLL
      //dg is Datagrid 
      {
        string Destination = ".\.....location\_filename.xls";
        dg.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
        dg.SelectAllCells();


        ApplicationCommands.Copy.Execute(null, dg);
        String resultat = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);
        String result = (string)Clipboard.GetData(DataFormats.Text);
        //dg.UnselectAllCells();
        System.IO.StreamWriter file1 = new System.IO.StreamWriter(Destination);
        file1.WriteLine(result.Replace(',', ' '));
        file1.Close();
       }