MS Excel Interop - запретить вход в систему при открытии книги с ограниченным доступом - PullRequest
0 голосов
/ 13 декабря 2018

Я использую MS Excel Interop для анализа информации из коллекции файлов Excel.Если один из этих файлов Excel имеет ограниченный доступ , открывается модал входа в Windows и приостанавливает мою программу.Я хотел бы пропустить эти файлы, чтобы этот модал не появлялся.

enter image description here

Мой текущий код с различными настройками для блокировки любых предупреждений Excel:

var application = new Microsoft.Office.Interop.Excel.Application();
application.DisplayAlerts = false;
application.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable;
var workbook = application.Workbooks.Open(filePath, UpdateLinks: 0, ReadOnly: true, IgnoreReadOnlyRecommended: true, Password: "fakePassword");

Я столкнулся с аналогичной проблемой с защищенными паролем документами Excel, но смог предотвратить модальный ввод пароля, установив поддельный пароль в коде .Open выше.Это вызывает исключение, когда файл защищен паролем, который я затем перехватываю, и программа переходит к следующему файлу Excel.

Я надеялся, что опция WriteResPassword для Openметод будет работать аналогичным образом, но даже если я укажу это, появится окно входа в Windows.

Любая помощь с благодарностью!

1 Ответ

0 голосов
/ 02 января 2019

Я не особенно доволен этим решением, но я нашел обходной путь для избежания модальностей входа в MS (и многих других модалов) до открытия документа Excel.

Перед открытием документа Excelв MS Excel Interop я провожу «zip-тест», где я заархивирую файл во временный каталог, попытаюсь извлечь его, а затем немедленно удалить этот каталог.

private void ZipTest(string xlsxFilePath, string tempDirectoryPath)
{
    try
    {
        Directory.CreateDirectory(tempDirectoryPath);
        string zipPath = ZipFile(xlsxFilePath, tempDirectoryPath);
        using (ZipArchive zip = System.IO.Compression.ZipFile.Open(zipPath, ZipArchiveMode.Update))
        {
            zip.ExtractToDirectory(tempDirectoryPath);
        }
        Directory.Delete(tempDirectoryPath, true);
    }
    catch (Exception ex)
    {
        if (Directory.Exists(tempDirectoryPath))
        {
            Directory.Delete(tempDirectoryPath, true);
        }
        throw ex; // Do whatever you want
    }
}

private string ZipFile(string filePath, string destinationDirectory)
{
    string fileName = Path.GetFileName(filePath);
    string zipFileName = Path.ChangeExtension(fileName, ".zip");
    string destinationPath = $"{destinationDirectory}\\{zipFileName}";
    File.Copy(filePath, destinationPath, false);
    return destinationPath;
}
* 1005ошибка, если рабочая книга имеет ограниченный доступ, защищена паролем или не может быть записана иным образом.Это предотвращает модальный вход MS, поскольку документ Excel никогда не открывается.

Обратите внимание, что это работает только для файлов xlsx.Любые файлы xls должны быть сначала преобразованы в xlsx.

...