使用显示大量信息的数据网格,总是超过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);
}
}
答案 0 :(得分:0)
您可以使用Open XML SDK代替Microsoft Interop创建Excel文件。 Interop较慢,需要安装Excel应用程序。开放的XML速度更快,不需要Excel应用程序。
请参阅Microsoft的以下示例:
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?