Файл Excel создан только для чтения

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

Однако назначение члену экземпляра класса можно контролировать , поскольку вы хотите, переопределив .__setattr__().

class MyClass(object):
    def __init__(self, x):
        self.x = x
        self._locked = True
    def __setattr__(self, name, value):
        if self.__dict__.get("_locked", False) and name == "x":
            raise AttributeError("MyClass does not allow assignment to .x member")
        self.__dict__[name] = value

>>> m = MyClass(3)
>>> m.x
3
>>> m.x = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in __setattr__
AttributeError: MyClass does not allow assignment to .x member

Обратите внимание, что существует переменная-член, _locked, которая контролирует, разрешено ли присвоение. Вы можете разблокировать его, чтобы обновить значение.

0
задан Bedasy 6 March 2019 в 02:24
поделиться

2 ответа

Так что я думаю, что ваша проблема в Workbooks.Add (). Посмотрите, что Microsoft говорит об этом:

[Workbooks.Add ()] Определяет, как создается новая книга. Если этот аргумент является строкой, указывающей имя существующего файла Microsoft Excel, новая книга создается с указанным файлом в качестве шаблона.

Я считаю, что создаваемая книга - это точная копия того, что есть на сервере sharepoint, включая разрешения. Тот факт, что он работает локально, является еще одним признаком того, что sharepoint может возиться с разрешениями.

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

SaveFileDialog userSaveFileDialog = new SaveFileDialog();  
userSaveFileDialog.Filter = "Excel 2007 and later | *.xlsx, Excel Macro Enabled Worksheet | *.xlsm, I'm guessing this is a 2007 template | *.xltx, Template Macro maybe | *.xltm, I almost definitely think this is a template file | *.xlt";  
userSaveFileDialog.Title = "Save an Excel File";  
userSaveFileDialog.ShowDialog();  
this.Application.ActiveWorkbook.SaveCopyAs(@userSaveFileDialog.FileName);

Как только вы закончите, вы можете программно открыть вновь сохраненную книгу, используя userSaveFileDialog.FileName в качестве пути к файлу.

0
ответ дан slightly drifting 6 March 2019 в 02:24
поделиться

для двух упомянутых вами способов:

  1. установить библиотеку точек общего доступа в качестве безопасного источника - этого можно достичь, установив параметр Excel: Параметры -> Центр доверия -> Доверие Настройки центра -> Надежные расположения -> добавить местоположение общего ресурса

  2. установить доступ к файлу (readonly = false) в конце вашего процесса

[116 ] Фактически, в качестве общей практики при работе с файлом шаблона (не ограничиваясь Excel), система должна скопировать файл шаблона в локальное временное местоположение (в идеале, в папку TEMP работающего пользователя), использовать его и затем удалить. таким образом можно избежать всевозможных проблем, таких как проблемы с блокировкой файлов другими пользователями / процессами.

0
ответ дан Rex 6 March 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: