Как я могу отредактировать или снять защиту одной ячейки в защищенном листе Excel из C #? - PullRequest
2 голосов
/ 10 января 2010

Я пытаюсь манипулировать файлом Excel с помощью C # с помощью Microsoft.Office.Interop.Excel. Книга, которой я пытаюсь манипулировать, имеет общую защиту пользователей.

У меня есть пароль файла и пароль ячеек, к которым я хочу получить доступ и отредактировать.

Если я пытаюсь сделать это из Excel, я делаю следующее:

  • открыть файл, ввести пароль
  • перейдите в ячейку, дважды щелкните ячейку для редактирования.
  • Появляется диалоговое окно с просьбой предоставить пароль, я ввожу пароль и затем могу редактировать.

Я хочу сделать это из приложения на C #.

Мой текущий код выглядит следующим образом:

xl.Application excelApp = new xl.Application();
excelApp.Visible = true;
xl.Workbook newworkbook =
    excelApp.Workbooks.Open(@"C:\1.xls", 0, false, 5, "password", "", false,
                            xl.XlPlatform.xlWindows, "", true, false, 0, true,
                            false, false);
xl.Sheets excelSheets = newworkbook.Worksheets;
xl.Worksheet excelWorksheet = (xl.Worksheet)excelSheets.get_Item("Sign On_Off");
excelWorksheet.Select(true);
xl.Range myrange = excelWorksheet.get_Range("b16", "b16");
myrange.Value2 = "testing"; 

Последняя строка выдает мне это сообщение об ошибке:

Ячейка или диаграмма, которую вы пытаетесь изменить, защищены и поэтому доступны только для чтения.

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

Итак, мой вопрос: есть ли способ снять защиту только с клетки?

Я представляю что-то вроде:

myrange.unprotect("pw");

Ответы [ 2 ]

1 голос
/ 10 января 2010

У меня не было времени попробовать, но этот абзац выглядит как то, что вы ищете. Кажется, что эквивалентный объект VBA, который вы ищете, это ActiveSheet.Protection. AllowEditRanges , в котором хранится информация об областях, которые могут редактироваться пользователями на листе.
Одна вещь, на которую вы также можете обратить внимание - это опция UserInterfaceOnly в ActiveSheet.Protect. Вы можете защитить диапазон паролем для пользователей, но получить к нему доступ без пароля с помощью макросов.

1 голос
/ 10 января 2010

Protect просто доступно для Workbook и Worksheet классов.

Кроме того, вы можете попробовать поработать с Worksheet.Protection Property:

ActiveSheet.Protection.AllowEditRanges.Add _
    Title:="Range123", Range:=Range("K4:L10"), Password:="123"
...