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

19,535

Solution 1

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.

Solution 2

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.

Share:
19,535

Related videos on Youtube

Philipp
Author by

Philipp

Opportunity favors the prepared mind. So it is best to keep the mind as prepared as possible.

Updated on April 20, 2022

Comments

  • Philipp
    Philipp almost 2 years

    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.)