Метод SaveCopyAs не работает

(Я неделю в английском языке, поэтому сначала извините меня за плохое объяснение: D)

Я открываю файл Excel через свое приложение.

У меня есть надстройка в Excel и кнопка на ленте для сохранения (именно такое действие сохранения, которое выполняет кнопка "Сохранить"), код события Click кнопки находится здесь:

Globals.ThisAddIn.Application.ActiveWorkbook.Save();

В моем приложении я назначаю метод (называемый WorkbookBeforeSave) обработчику событий «BeforeSave» книги, который сохраняет книгу вручную в моем пользовательском каталоге.

private void WorkbookBeforeSave(bool saveasui, ref bool cancel)
{
    _excelApp.EnableEvents = false;//_excelApp is my Excel Application

    if (!_excelWorkbook.Saved)//_excelWorkbook is Active Excel Workbook
    {
        _excelWorkbook.SaveCopyAs(_savedFilePath);//_savedFilePath is my custom directory

        _excelWorkbook.Saved = true;
    }

    cancel = true;

    _excelApp.EnableEvents = true;
}

проблема заключается в том, что когда я нажимаю оригинальную кнопку сохранения Excel, метод «SaveCopyAs» работает правильно, но когда я нажимаю на мою пользовательскую кнопку «Сохранить», метод «SaveCopyAs» не работает. (исключений не возникло, все коды скомпилированы и отлажены)


person Omid-RH    schedule 12.02.2012    source источник
comment
Не используйте взаимодействие с Excel. это очень плохо.   -  person gdoron is supporting Monica    schedule 12.02.2012
comment
_excelApp.EnableEvents = false; выглядит подозрительно.   -  person gdoron is supporting Monica    schedule 12.02.2012
comment
Я согласен с вами, взаимодействие с Excel очень плохое. Но я должен использовать. Какие другие доступные варианты?   -  person Omid-RH    schedule 12.02.2012
comment
_excelApp.EnableEvents = ложь; предназначен для предотвращения бесконечного цикла при сохранении и событии BeforeSave   -  person Omid-RH    schedule 12.02.2012
comment
Наиболее распространенная причина не получить исключение состоит в том, что функция действительно сделала то, что вы просили. Вы просто не можете найти файл обратно. Что происходит, когда вы не указываете полный путь к файлу.   -  person Hans Passant    schedule 12.02.2012
comment
Благодарю. Я переключаю точку останова и проверяю _savedFilePath перед вызовом метода SaveCopyAs. _savedFilePath правильный, и это то же самое, когда я нажимаю кнопку сохранения или кнопку сохранения excel.   -  person Omid-RH    schedule 12.02.2012
comment
Я думаю, что проблема связана с вызовом Сохранить вручную из надстройки и вызовом события Excel в моем приложении во время работы с надстройкой.   -  person Omid-RH    schedule 12.02.2012
comment
Я мало что знаю о С#... но, судя по вашему описанию проблемы, if (!_excelWorkbook.Saved) не делает того, что, по вашему мнению, должно. Может быть, попробуйте удалить его и посмотреть, не выдается ли ошибка в этом случае.   -  person Pynner    schedule 13.02.2012


Ответы (1)


Попробуйте выполнить отладку с помощью try-catch, это должно вам помочь.

// using interop, excel tool, interop-excel, core

public void MyBeforeSave(Microsoft.Office.Interop.Excel.Workbook Wb, bool SaveAsUI, ref bool Cancel)
{
  //Globals.ThisAddIn.Application.ActiveWorkbook.SaveCopyAs(filename2); // if u use an external class to save (for threading or something else )
  this.Application.ActiveWorkbook.SaveCopyAs(filename); 

}   

Без многопоточности/задач офис 2007 превосходит - иногда - отстает или медленнее, чем обычно, при загрузке и в методе сохранения.

Простой метод saveAs() имеет множество параметров (поищите его, вы видите его в msdn и здесь), и для него требуется некоторая уловка в пути, потому что последнее изменение пути сохранения на путь сохранения С# используется.

Я предпочитаю решение SaveCopyAs, потому что всего один параметр и быстро и яростно. :D

person huncyrus    schedule 10.08.2012