2012-02-20 33 views
2

我已經搜索,沒有發現我找到的東西直接點擊(或者我的搜索沒有打到單詞的組合)。如何提示用戶保存一個自動Excel文件

在C#中,我創建了一個使用Interop.Excel的Excel工作表,我在其中插入一些數據並創建圖表。這一切工作正常,當我做一個xlWorkBook.SaveAs。

我想要做的是提示用戶把自動工作簿放在某個地方,用他們自己的文件名。我試過(http://p2p.wrox.com/vb-how/63900-disabling-second-excel-save-prompt.html),他基本上做了一個新的SaveFileDialog,然後如果它的== OK,他建立他的Excel表格,然後他說他的工作簿.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 

回答

1

如果你保存它,你可以使用響應後您儲存的地方文件。

下面是一個例子:

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

這應當提示用戶,他們希望將文件存儲在他們的機器上。

+0

日Thnx ...我已經做了,在過去的Response.AddHeader事情時,我只是RenderControl上一個DataGrid,然後迅速出現。但在這種情況下,我不想將文件保存在他們的機器上,或者我的服務器上,然後再次獲取它。我想做一個輸出。 – Kevin 2012-02-20 23:01:04

+0

@Kevin您可以使用例如Response.BinaryWrite將文件作爲字節數組傳遞給用戶,而無需將其保存到服務器。如果這是你的選擇。 – TheBoyan 2012-02-20 23:12:18

+0

我之前沒有使用BinaryWrite,因此我不得不查看它。我的主要擔憂是未知的(儘管這會在代碼中很快發生),就像用戶更改文件名稱,系統關閉,瘦客戶端和驅動器映射不同,負載/衝突可能如果多個用戶一次執行此操作,則創建等等。 – Kevin 2012-02-20 23:35:22

3

這是簡單的方法。 :-)

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

這就是我所做的,似乎很瘋狂,但工作。

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; 
     } 
相關問題