C# Excel快速数据网格导出
使用datagrid显示大量信息,总是超过10k行,最多一百万行,有5列或6列。 我想在我的WPF应用程序上有一个按钮,将数据导出到excel文件,保持相同的列结构 我使用的是MicrosoftOffice-Interop=,但是,这需要很长时间才能执行。有没有更快的方法来实现这一点 谢谢 我的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
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();
}