Datatable to Excel Interop VS其他方法; 需要另存为/打开popup

我已经实现了下面的方法,似乎工作正常,但它将文件保存到预定义的位置,而不是我想给用户一个选项,就像任何常规的下载popup窗口:打开,保存,另存为。 任何想法?


为了克服“当前线程必须设置为单线程单元(STA)模式之前,可以使OLE调用”exception,线程必须执行,请参阅编辑!

编辑:

1)

using System.Threading; 

2)

 [STAThread] private static void ExportToExcel(DataTable dt) { Thread t = new Thread(SaveIt); t.SetApartmentState(ApartmentState.STA); t.Start(dt); } 

3)

 static void SaveIt(Object dt) { DataTable table = (DataTable)dt; System.Windows.Forms.SaveFileDialog sfd = new System.Windows.Forms.SaveFileDialog(); if (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) SaveName = sfd.FileName; else SaveName = "ResourceProfile"; workbook.SaveAs(..... } 

编辑结束。

 private static void ExportToExcel(DataTable dt) { Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass(); Microsoft.Office.Interop.Excel.Workbook workbook = excel.Application.Workbooks.Add(true); int iCol = 0; foreach (DataColumn c in dt.Columns) { iCol++; excel.Cells[1, iCol] = c.ColumnName; } int iRow = 0; foreach (DataRow r in dt.Rows) { iRow++; // add each row's cell data... iCol = 0; foreach (DataColumn c in dt.Columns) { iCol++; excel.Cells[iRow + 1, iCol] = r[c.ColumnName]; } } object missing = System.Reflection.Missing.Value; DateTime CurrentDate = DateTime.Now; String CurDate = CurrentDate.ToShortDateString().Replace("/","."); workbook.SaveAs("ResourceProfile-" + CurDate + ".xls", Microsoft.Office.Interop.Excel.XlFileFormat.xlXMLSpreadsheet, missing, missing, false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing); excel.Visible = true; Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)excel.ActiveSheet; ((Microsoft.Office.Interop.Excel._Worksheet)worksheet).Activate(); ((Microsoft.Office.Interop.Excel._Application)excel).Quit(); } 

只需将SaveFileDialog添加到您的应用程序,并从用户获取文件名:

 String SaveName; if saveFileDialog1.ShowDialog = DialogResult.OK { SaveName := saveFileDialog1.FileName; workBook.SaveAs(SaveName, ...); } 

您可以通过设置SaveFileDialog各种属性来configuration默认的文件夹位置,文件扩展名和其他信息。 您甚至可以将SaveDialog.FileName设置为您在ShowDialog之前创build的默认名称,以便它们接受或修改。

你也可以用excel.Application.get_FileDialogexcel.Application.get_FileDialog – 这里有一个例子:

 Microsoft.Office.Core.FileDialog fd = excel.Application.get_FileDialog(Microsoft.Office.Core.MsoFileDialogType.msoFileDialogSaveAs); fd.AllowMultiSelect = true; fd.Filters.Clear(); fd.Filters.Add("Excel Files", "*.xls;*.xlw", missing); fd.Filters.Add("All Files", "*.*", missing); if (fd.Show() != 0) { fd.Execute(); } 

如果你正在处理大量的logging(可以说超过20000或更多),那么你做“foreach”循环的方式将花费很多时间。

我会build议使用EPPlus库。

这里是你如何直接把数据表放入excel:

 worksheet.Cells["A1"].LoadFromDataTable(dtForExcel, true); 

我已经testing了它,它只需要约2秒。

我不明白MS为什么没有在“Microsoft.Office.Interop.Excel”中提供这样的设施?