Как закрыть без сохранения книгу Excel/xlsm с пользовательской функцией из С#

У меня есть рабочая книга Excel с настраиваемой функцией ячейки, не зависящей от времени, которую я открываю из приложения C# WindowsForms с помощью Interop.Excel. Я читаю из него четыре значения, не выполняю явных изменений/вычислений, а затем закрываю его из С#.

Когда я пытаюсь закрыть напрямую (без сохранения), я получаю приглашение сохранить. Я подозреваю, что это связано с тем, что Excel интерпретирует автоматический пересчет при открытии как создание изменения, хотя на самом деле ничего не меняется ни в числовом, ни в формульном смысле. Я также установил Excel.Application.Calculation = Excel.XlCalculation.xlCalculationManual. Как предотвратить появление запроса на сохранение и просто закрыть без сохранения?


person Jack Huang    schedule 11.01.2012    source источник
comment
вы также можете сделать workbook.Saved = true перед сохранением, чтобы сообщить приложению Excel, что это уже сохранено и не нужно запрашивать..   -  person nawfal    schedule 17.07.2012


Ответы (1)


Когда вы используете объекты Excel, обязательно закройте книгу следующим образом:

Excel.Application xlApp ;
Excel.Workbook xlWorkBook ;
Excel.Worksheet xlWorkSheet ;
object misValue = System.Reflection.Missing.Value;

xlApp = new Excel.ApplicationClass();
xlWorkBook = xlApp.Workbooks.Add("Yourworkbook");

xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

....do your stuff

xlWorkBook.Close(false, misValue, misValue);

xlApp.Quit();

Значение false в методе close означает, что изменения не сохраняются.

person Motes    schedule 11.01.2012
comment
Действительно ли необходимо передавать аргументы System.Reflection.Missing.Value методу Close? Я закрываю, только передавая ложь, и пока не было никаких проблем. - person Jeremy Cook; 22.01.2016
comment
@JeremyCook Когда-то это было, возможно, необходимость в этом изменилась с обновлением точки сети. - person Motes; 22.01.2016
comment
Больше не нужно проходить Missing.Value. Благодаря поддержке именованных и необязательных аргументов, появившихся в C# 4.0, вы можете просто напиши xlWorkBook.Close(SaveChanges: false); - person Ronald Boehm; 24.01.2016
comment
Что делать, если я хочу закрыть лист после его сохранения? Я также не хочу, чтобы отображалось диалоговое окно «Сохранить как». Что-то вроде принудительного сохранения? - person John; 12.04.2016
comment
@John На самом деле другой вопрос, но сделайте что-нибудь подобное до xlWorkBook.Close : Application.DisplayAlerts = False xlWorkBook.SaveAs (etc.) Application.DisplayAlerts = True - person Motes; 12.04.2016
comment
@Motes Это сохраняет несколько копий ... На мою книгу ссылаются и редактируют несколько раз. Можно ли перезаписать существующий? - person John; 12.04.2016
comment
@John Укажите имя файла - person Motes; 12.04.2016
comment
Ах!!! Моя ошибка. Я не хочу перезаписывать. Вместо этого добавьте новые данные в существующий файл (сохраняя старые данные в безопасности) - person John; 12.04.2016
comment
@John Джон, тебе нужно задать новый вопрос, пожалуйста. - person Motes; 12.04.2016