Как предложить пользователю сохранить автоматизированный файл Excel

Я искал, и ничто из того, что я нашел, не соответствовало тому, что я ищу (или, может быть, мои поиски не привели к сочетанию слов).

В С# я создал лист Excel, используя Interop.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

person Kevin    schedule 20.02.2012    source источник


Ответы (3)


Если у вас есть файл, сохраненный где-то после его сохранения, вы можете использовать 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();

Это должно подсказать пользователю, где он хочет сохранить файл на своем компьютере.

person TheBoyan    schedule 20.02.2012
comment
Thnx... Я делал Response.AddHeader в прошлом, когда я просто RenderControl в сетке данных, а затем появляется приглашение. Но в этом случае я не хочу сохранять файл на их машине или на моем сервере, если на то пошло, а затем снова получать его. Я хотел бы сделать один выход. - person Kevin; 21.02.2012
comment
@Kevin Вы можете использовать, например, Response.BinaryWrite для передачи файла в виде массива байтов пользователю без сохранения его на вашем сервере. Если это вариант для вас. - person TheBoyan; 21.02.2012
comment
Раньше я не использовал BinaryWrite, поэтому мне придется изучить его. Меня больше всего беспокоит неизвестность (даже если это произойдет быстро в коде), например, если пользователь изменил имя файла, его система вышла из строя, он находится на тонком клиенте, и диски могут быть сопоставлены по-разному, загрузка/конфликт может быть создавать, если это делают сразу несколько пользователей и т.д. - person Kevin; 21.02.2012

Это простой способ. :-)

myFilename = xlapp.GetSaveAsFilename
xlWorkbook.SaveAs filename:=myFilename
person VBAQueen    schedule 01.11.2013

Это то, что я сделал, это кажется безумием, но сработало.

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;
        }
person Chong Ching    schedule 25.02.2016