如何提示用户保存自动化的Excel文件

3

我搜索了很久,但似乎没有直接解决我的问题的答案(或者是我的搜索关键词不太准确)。

在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)会引起提示。 当我尝试时,我收到“在非交互模式下运行应用程序时显示模态对话框框不是有效操作”错误消息。

我可以贴出全部代码,但它在另一个系统上,但它的主体是:

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
3个回答

3
这是简单的方法。:-)
myFilename = xlapp.GetSaveAsFilename
xlWorkbook.SaveAs filename:=myFilename

1
如果您在保存文件后将其存储在某个位置,则可以使用 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();

这应该提示用户选择他们想在哪里存储文件。


谢谢...我以前在使用DataGrid的RenderControl时做过Response.AddHeader的事情,然后提示框就会出现。但在这种情况下,我不想让文件保存在他们的机器上,或者说我的服务器上,然后再去获取它。我希望只有一个输出。 - Kevin
@Kevin 如果这对你是一个选项,你可以使用Response.BinaryWrite将文件作为字节数组传递给用户,而无需将其保存到服务器上。 - TheBoyan
我以前没有使用过BinaryWrite,所以我需要研究一下。我的主要担忧是未知的情况(即使这会在代码中很快发生),例如如果用户更改了文件名,他们的系统崩溃了,他们处于瘦客户端上,驱动器可能被映射到不同位置,如果多个用户同时这样做可能会产生的负载/冲突等。 - Kevin

0

这是我做的,看起来很疯狂,但却奏效了。

xlWorkBook.SaveAs(saveExcel(), Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);//导入方法

internal object saveExcel()//方法

    {

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接