【问题标题】:How to prompt user to save an automated Excel file如何提示用户保存自动 Excel 文件
【发布时间】:2012-02-20 22:41:18
【问题描述】:

我已经搜索过,但没有找到任何直接命中我正在寻找的内容(或者我的搜索没有命中单词组合)。

在 C# 中,我使用 Interop.Excel 创建了一个 Excel 工作表,我在其中插入了一些数据并创建了一个图表。当我执行 xlWorkBook.SaveAs 时,这一切都很好。

我想要做的是提示用户将自动工作簿放在具有他们自己的文件名的某个位置。我已经尝试过(http://p2p.wrox.com/vb-how/63900-disabling-second-excel-save-prompt.html),他基本上做了一个新的 SaveFileDialog,然后如果它 == OK,他会构建他的 Excel 工作表,然后他说他的 workbook.SaveAs(FilePathFromSaveAsDialog) 会导致提示。当我尝试它时,我收到“当应用程序未在 UserInteractive 模式下运行时显示模式对话框不是有效操作”错误。 我会粘贴我所有的代码,但它在一个单独的系统上,但它只是:

using Excel = Microsoft.Office.Interop.Office 

//....then on click of link button....

Excel.Application xlApp;
Excel.Workbook xlWorbook;
Excel.Workbooks xlWorkbooks;
Excel.Sheets xlSheets;
Excel.Worksheet xlWorkSheet;
object misValue = System.Reflection.Missing.Value;

xlApp = new Excel.ApplicationClass();
xlWorkBooks = xlApp.Workbooks;
xlWorkBook = xlWorbooks.Add(misValue);
xlSheets = xlWorkBook.Worksheets;
xlWorkSheet = (Excel.Worksheet)xlSheets.get_Item(1);

//....Now I fill my Excel sheet data and make my chart >>> then I close like below...

xlApp.DisplayAlerts = true;

//HERE IS WHERE I WANT TO EITHER PASS THE PATH AND FILE NAME FROM USER OR USE A PROMPT
xlWorkBook.SaveAs("Test.xls", Excel.XFileFormat.XlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);    
xlWorkBook.Close(true, misValue, misValue);
xlApp.Quit();

//finally I release all my objects via Marshal.ReleaseComObject then GC.Collect

【问题讨论】:

    标签: c# excel automation savefiledialog


    【解决方案1】:

    这是最简单的方法。 :-)

    myFilename = xlapp.GetSaveAsFilename
    xlWorkbook.SaveAs filename:=myFilename
    

    【讨论】:

      【解决方案2】:

      如果您在保存文件后将文件存储在某处,则可以使用 Response。

      这是一个例子:

        const string fName = @"C:\Test.xls";
        FileInfo fi = new FileInfo(fName);
        long sz = fi.Length;
      
        Response.ClearContent();
        Response.ContentType = Path.GetExtension(fName);
        Response.AddHeader("Content-Disposition", string.Format("attachment; filename = {0}",System.IO.Path.GetFileName(fName)));
        Response.AddHeader("Content-Length", sz.ToString("F0"));
        Response.TransmitFile(fName);
        Response.End();
      

      这应该会提示用户他们想在他们的机器上存储文件的位置。

      【讨论】:

      • Thnx...过去,当我只是在数据网格上 RenderControl 然后出现提示时,我已经完成了 Response.AddHeader 的事情。但在这种情况下,我不想将文件保存在他们的机器或我的服务器上,然后再去获取它。我想做一个输出。
      • @Kevin 例如,您可以使用 Response.BinaryWrite 将文件作为字节数组传递给用户,而无需将其保存到您的服务器。如果这是您的选择。
      • 我之前没有使用过 BinaryWrite,所以我必须研究一下。我主要担心的是未知(即使这在代码中会很快发生),例如如果用户更改了文件名,他们的系统出现故障,他们在瘦客户端上并且驱动器可能被不同地映射,它可能的负载/冲突如果多个用户同时执行此操作,则创建,等等。
      【解决方案3】:

      这就是我所做的,看起来很疯狂,但确实有效。

      xlWorkBook.SaveAs(saveExcel(), Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);//import method

      internal object saveExcel()//method

          {
      
              SaveFileDialog sfd = new SaveFileDialog();// Create save the CSV
              sfd.Filter = "Text File|*.xls";// filters for text files only
              sfd.DefaultExt = "xls";
              sfd.AddExtension = true;
              sfd.FileName = "AutodeskScripts.xls";
              sfd.Title = "Save Excel File";
              if (sfd.ShowDialog() == DialogResult.OK)
              {
                  return sfd.FileName;
              }
              else
              {
                  return null;
              }
      

      【讨论】:

        猜你喜欢
        • 2012-12-11
        • 2017-03-10
        • 1970-01-01
        • 1970-01-01
        • 2011-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多