DISABLE ADBLOCK

ADBlock is blocking some content on the site

ADBlock errore

Using Interop with C#, Excel Save changing original. How to negate this?

StackOverflow https://stackoverflow.com/questions/29141
  •   c#  -  excel
  •  | 
  •  
  •  | 
  •   ( words)

Question

The problem: Loading an excel spreadsheet template. Using the Save command with a different filename and then quitting the interop object. This ends up saving the original template file. Not the result that is liked.

public void saveAndExit(string filename)
{        
    excelApplication.Save(filename);
    excelApplication.Quit();
}

Original file opened is c:\testing\template.xls The file name that is passed in is c:\testing\7777 (date).xls

Does anyone have an answer?

(The answer I chose was the most correct and thorough though the wbk.Close() requires parameters passed to it. Thanks.)

Solution

Excel interop is pretty painful. I dug up an old project I had, did a little fiddling, and I think this is what you're looking for. The other commenters are right, but, at least in my experience, there's a lot more to calling SaveAs() than you'd expect if you've used the same objects (without the interop wrapper) in VBA.

Microsoft.Office.Interop.Excel.Workbook wbk = excelApplication.Workbooks[0];  //or some other way of obtaining this workbook reference, as Jason Z mentioned
wbk.SaveAs(filename, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, 
            Type.Missing, Type.Missing, Type.Missing, Type.Missing,
            Type.Missing);
wbk.Close();
excelApplication.Quit();

Gotta love all those Type.Missings. But I think they're necessary.

OTHER TIPS

Rather than using an ExcelApplication, you can use the Workbook object and call the SaveAs() method. You can pass the updated file name in there.

Have you tried the SaveAs from the Worksheet?

  1. Ditto on the SaveAs
  2. Whenever I have to do Interop I create a separate VB.NET class library and write the logic in VB. It is just not worth the hassle doing it in C#

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow