C# EPPlus库,另存为

C# EPPlus库,另存为,c#,wpf,epplus,C#,Wpf,Epplus,使用EPPlus,将文档保存到预定义路径很容易,但每次都需要保存到不同的路径,因此我需要EPPlus显示标准的保存对话框 “我的代码”可以从datatable创建Excel文件,对其稍加格式化,然后将其保存到指定位置: DirectoryInfo outputDir = new DirectoryInfo(@"C:\Users\user001\Downloads"); FileInfo newFile = new FileInfo(outputDi

使用EPPlus,将文档保存到预定义路径很容易,但每次都需要保存到不同的路径,因此我需要EPPlus显示标准的保存对话框

“我的代码”可以从datatable创建Excel文件,对其稍加格式化,然后将其保存到指定位置:

            DirectoryInfo outputDir = new DirectoryInfo(@"C:\Users\user001\Downloads");
            FileInfo newFile = new FileInfo(outputDir.FullName + @"\Crit.xlsx");

            if (newFile.Exists) {newFile.Delete();}

            using (ExcelPackage pck = new ExcelPackage(newFile))
            {
                ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Crit");
                ws.Cells["A1"].LoadFromDataTable(dtCrit, true);
                ws.Cells.AutoFitColumns(0);
                ws.Cells["A1:Z1"].Style.Border.Top.Style = ExcelBorderStyle.Thin;
                ws.Cells["A1:Z1"].Style.Font.Bold = true;
                pck.Save();
           }
如何显示对话框以手动选择目标文件夹? 我试过使用pck.SaveAs,但我无法让它工作,而且关于这方面的信息也不多

更新: 当从项目内部或从服务器执行时,应用程序可以工作。如果执行shourcut或将exe复制/粘贴到我的桌面,则会崩溃

string mydocpath = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

      try {
                DirectoryInfo outputDir = new DirectoryInfo(mydocpath);
                FileInfo newFile = new FileInfo(outputDir.FullName + @"\Requerimientos_" + DateTime.Now.ToString("dd-MM-yyyy_hh-mm") + ".xlsx");

                if (newFile.Exists) { newFile.Delete(); }

                using (ExcelPackage pck = new ExcelPackage(newFile))
                {
                    ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Requerimientos");
                    ws.Cells["A1"].LoadFromDataTable(dtReque, true);
                    ws.Cells.AutoFitColumns(0);
                    ws.Cells["A1:Z1"].Style.Border.Top.Style = ExcelBorderStyle.Thin;
                    ws.Cells["A1:Z1"].Style.Font.Bold = true;

                    var dlg = new SaveFileDialog { FileName = "Requerimientos_" + DateTime.Now.ToString("dd-MM-yyyy_hh-mm"), DefaultExt = ".xlsx", Filter = "Excel Sheet (.xlsx)|*.xlsx", InitialDirectory = mydocpath };
                    var result = dlg.ShowDialog();
                    if (result == true)
                    {
                        using (var stream = dlg.OpenFile())
                        {
                            pck.SaveAs(stream);
                            OpenDialog("File Created", "Export");
                        }
                    }
                }
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }

尝试使用
SaveFileDialog

private static bool? saveExcelPackageDialog(string fileName, string workingDirectory, byte[] rawBinaryObject)
{
    SaveFileDialog sfd = new SaveFileDialog();
    sfd.Filter = EXCEL_FILTER_FILE_DIALOG;
    sfd.InitialDirectory = workingDirectory;
    sfd.FileName = fileName;

    bool? result = sfd.ShowDialog();
    if (result == true)
    {
        File.WriteAllBytes(sfd.FileName, rawBinaryObject);
        System.Diagnostics.Process.Start(sfd.FileName);
    }
    return result;
}
你必须这样使用它:

saveExcelPackageDialog(newFile.FullName, outputDir.FullName, pkg.GetAsByteArray());

WPF通过Microsoft.Win32命名空间提供标准文件对话框。您可以使用显示对话框,并选择或创建要保存到的文件

选择文件后,通过路径创建文件信息并将其传递到
SaveAs
,例如:

// Configure save file dialog box
var dlg = new Microsoft.Win32.SaveFileDialog 
              {
                  FileName = "NewSheet", // Default file name
                  DefaultExt = ".xlsx", // Default file extension
                  Filter = "Excel Sheet (.xlsx)|*.xlsx" // Filter files by extension
              }

// Show save file dialog box
var result = dlg.ShowDialog();

// Process save file dialog box results
if (result == true)
{
    // Save document
        string filename = new FileInfo(dlg.FileName);
        package.SaveAs(newFile);
}
或者,您可以使用让对话框本身创建一个要保存到的流:

if (result == true)
{
        // Save document
        using(var stream=dlg.OpenStream())
        {
            package.SaveAs(stream);
        }
}

您是否尝试过使用对WPF有效的
SaveFileDialog
?找不到它。它在win32库上,WPF本身没有savefiledialog。但我正在做一个WPF项目,我使用了这个库。好的,添加了它,看起来很有效。但我不知道如何连接savedialog和我从EPPlus获得的内容。您是只处理本地pc的EXE还是整个生成文件夹?单独使用exe可能不够,因为您需要任何引用的dll(如Epplus.dll)。您不需要在内存中生成工作表。这会使内存使用率翻倍,但没有任何好处,而且如果用户取消,只会浪费内存
SaveAs
可以将内容保存到文件或流中。谢谢,它可以工作,但当我尝试从自己的计算机运行if时,我会遇到一个问题。该项目存储在服务器中,当我从自己的项目(从服务器)执行它时,它就工作了。如果我在桌面上复制或粘贴应用程序,当sabe对话框打开时,应用程序就会崩溃。请查看我的更新以查看最终代码。错误是什么?由
exception.ToString()
返回的完整异常是什么?在这种情况下,如何获取该异常?应用程序只是在典型的“程序停止工作”窗口中崩溃。请参阅更新的代码。