SaveFileDialog 一直保存文件到 Document 目录

SaveFileDialog keeps saving files to Document directory

我有一个奇怪的问题,我正在使用 SaveFileDialog 将我的数据保存在 excel 文件中。我将 RestoreDirectory 设置为 true 并将 InitialDirectory 设置为 Environemnt.SpecialFolder.Desktop 但程序每次都会将文件保存在 Documents 中。我 select 文件最终位于 Documents 中的目录并不重要。任何的想法?

 private void btnExcellExport_Click(object sender, EventArgs e)
    {
        if (!(dataGridView1.RowCount == 0))
        {
            if (backgroundWorker1.IsBusy)
                return;
            using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Workbook|*.xlsx", RestoreDirectory = true, InitialDirectory = Environment.SpecialFolder.Desktop.ToString()
        })
            {
                sfd.FileName = HelpMeClass.SearchString;
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    progressBar1.Show();
                    progressBar1.Minimum = 0;
                    progressBar1.Value = 0;
                    backgroundWorker1.RunWorkerAsync();

                }
            }
        }
        else
        {
            MessageBox.Show("Oops! Nothing to export!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1);
        }
    }

BackgroundWorker 工作:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
        Workbook wb = excel.Workbooks.Add(XlSheetType.xlWorksheet);
        Worksheet ws = (Worksheet)excel.ActiveSheet;

        excel.Visible = true;
        int index = 0;

        int process = dataGridView1.Rows.Count;
        int process1 = dataGridView2.Rows.Count;
        int process2 = dataGridView3.Rows.Count;



        ws.get_Range("A1", "C1").Merge(); // Merge columns for header
        ws.Cells[1, 1] = "Keyword: " + HelpMeClass.SearchString;
        ws.Cells[1, 1].Font.Bold = true; // Bold font in header

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            backgroundWorker1.ReportProgress(index++ * 100 / process);

            foreach (DataGridViewCell cell in row.Cells)
            {
                ws.Cells[index + 1, 1] = cell.Value;
            }
        }

        index = 0;         
        foreach (DataGridViewRow row in dataGridView2.Rows)
        {
            backgroundWorker1.ReportProgress(index++ * 100 / process1);

            foreach (DataGridViewCell cell in row.Cells)
            {
                ws.Cells[index + 1, 2] = cell.Value;
            }
        }

        index = 0;
        foreach (DataGridViewRow row in dataGridView3.Rows)
        {
            backgroundWorker1.ReportProgress(index++ * 100 / process2);

            foreach (DataGridViewCell cell in row.Cells)
            {
                ws.Cells[index + 1, 3] = cell.Value;
            }
        }

        ws.Columns.AutoFit();



        try
        {
            ws.SaveAs(HelpMeClass.SearchString, XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, false, false, XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);
        }
        catch (Exception ex)
        {
            MessageBox.Show("Ooops! I can`t access the file. Make sure the excel file is closed and try again. " + ex.Message, "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
            return;
        }

关键是在调用 SaveAs 时包含一个 Path,这样您就可以完全控制文件的保存位置。当参数称为 Filename 时,您可以按照 docs:

传递完整路径

A string that indicates the name of the file to be saved. You can include a full path; if you don't, Microsoft Excel saves the file in the current folder.

所以代替:

ws.SaveAs(HelpMeClass.SearchString, XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, false, false, XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);

你会打电话给:

ws.SaveAs(Path.Combine(HelpMeClass.GetExcelDirectory, HelpMeClass.SearchString), XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, false, false, XlSaveAsAccessMode.xlNoChange, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing);