数据表到Excel互操作与其他方法;使用另存为/打开的必需弹出窗口

本文关键字:窗口 另存为 互操作 Excel 其他 方法 数据表 | 更新日期: 2023-09-27 18:31:23

我已经实现了以下方法,该方法似乎工作正常,但是它将文件保存到预定义的位置,相反,我希望它为用户提供一个选项,就像任何常规下载弹出窗口一样:打开,保存,另存为。 知道吗?


为了克服"当前线程必须设置为单线程单元 (STA) 模式才能进行 OLE 调用"异常,必须实现线程,请参阅编辑!

编辑:

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();
}

数据表到Excel互操作与其他方法;使用另存为/打开的必需弹出窗口

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

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

您可以通过设置SaveFileDialog的各种属性来配置默认文件夹位置、文件扩展名和其他信息。您甚至可以将SaveDialog.FileName设置为您在上面创建的默认名称,然后再ShowDialog接受或修改它们。

您也可以使用 excel.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();
}

如果您处理大量记录(假设超过 20000 或更多),您执行"foreach"循环的方式将花费大量时间。

我建议使用 EPPlus lib。

以下是直接将数据表放入Excel的方法:

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

我已经测试过它,它只需要大约 2 秒。

我不明白为什么MS没有在"Microsoft.Office.Interop.Excel"中提供这样的功能?

使用下面提到的代码在 aspx 中显示 saveAs 对话框。

        var excel = new Microsoft.Office.Interop.Excel.Application();
        var workbook = excel.Workbooks.Add(true);
        // to add a sheet to workbook
        AddExcelSheet(dataTable1, workbook, "Sheet Name");
        string spreadsheetName = "DefaultFilename";
        excel.DisplayAlerts = false;
        Dialog saveAsDialog = excel.Dialogs[XlBuiltInDialog.xlDialogSaveAs];
        // to show dialog box with default filename
        saveAsDialog.Show(spreadsheetName);
        workbook.Close(true);
        excel.Quit();
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);