2012-02-20 2 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 시트를 작성한 다음 그의 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 

답변

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

데이터 그리드 다음 프롬프트에 난 그냥 RenderControl가 올 때 Thnx ... 내가 과거에 Response.AddHeader의 일을했다. 그러나이 시나리오에서는 파일을 컴퓨터 나 서버에 저장하지 않고 다시 가져오고 싶지 않습니다. 하나의 결과물을 원합니다. – Kevin

+0

@Kevin 예를 들어 Response.BinaryWrite를 사용하여 파일을 서버에 저장하지 않고 사용자에게 바이트 배열로 전달할 수 있습니다. 그게 당신을위한 옵션입니다. – TheBoyan

+0

BinaryWrite를 사용하지 않으므로 사전에 조사해야합니다. 필자의 주요 관심사는 알 수 없음 (사용자가 파일 이름을 변경하고 시스템이 다운되고 씬 클라이언트에 있고 드라이브가 다르게 매핑되는 경우로드/충돌이 발생할 수 있음) 여러 사용자가 한 번에이 작업을 수행 할 경우 작성하십시오. – Kevin

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