Доступ с помощью макроса к открытым другим пользователем файлам

Автор almaster13, 2 апреля 2025, 15:50

0 Пользователи и 1 гость просматривают эту тему.

almaster13

В системе Microsoft Windows открытые файлы можно было открыть только для чтения. Если не ошибаюсь, это же можно было сделать с помощью макросов.
А в Libre Calc можно ли взять данные из файла, открытого у другого пользователя? При попытке обращения к открытому файлу происходит ошибка. Но, к сожалению, нет возможности сделать файлу совместный доступ в свойствах файла, иначе при работе происходит полная анархия! Неужели нет другого способа?

mikekaganski

Цитата: almaster13 от  2 апреля 2025, 15:50При попытке обращения к открытому файлу происходит ошибка.

В какой строке кода?
С уважением,
Михаил Каганский

almaster13

Цитата: mikekaganski от  2 апреля 2025, 15:55
Цитата: almaster13 от  2 апреля 2025, 15:50При попытке обращения к открытому файлу происходит ошибка.

В какой строке кода?

Привожу код макроса:
Sub Nedovirabotka

oCdoc=thiscomponent
oCSheet=oCdoc.sheets(0)
 
Dim vFileDialog 'экземпляр сервиса FilePicker
Dim vFileAccess 'экземпляр сервиса SimpleFileAccess
Dim iAccept as Integer 'Ответ от FilePicker
Dim sInitPath as String 'Содержит начальный путь

Dim FileProperties(2) As New com.sun.star.beans.PropertyValue
FileProperties(0).Name = "FilterName"
FileProperties(0).Value ="scalc: Text - txt - csv (StarOffice Calc)"
FileProperties(1).Name = "USE_CONFIG"
FileProperties(1).Value ="3"
FileProperties(2).Name = "Hidden"
FileProperties(2).Value = True

vFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
vFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
'Здесь устанавливаем начальный путь!
sInitPath = "file:///cifs/UCHET/НИИ АЭС/"
rem sInitPath = ConvertToUrl(CurDir)

If vFileAccess.Exists(sInitPath) Then
vFileDialog.SetDisplayDirectory(sInitPath)
End If

iAccept = vFileDialog.Execute() 'Выполняем диалог выбора файла
If iAccept = 1 Then 'Какое возвращаемое значение?
GetAFileName = vFileDialog.Files(0) 'Устанавливаем имя файла если не была
End If 'нажата кнопка Отмена
vFileDialog.Dispose() 'Избавляемся от диалога

rem sURLFolderA=sURLFolder+"АПРЕЛЬ 2024.xlsx"

sURLFolderA=vFileDialog.Files(0)
oAdoc = StarDesktop.loadComponentFromURL(sURLFolderA, "_blank", 0, FileProperties())

oASheet=oAdoc.sheets(0)'Tabelle 3
oArange=oASheet.getCellRangeByName("B7:E9")'source
oAarray=oArange.getDataArray()
oCrange=oCSheet.getCellRangeByName("B4:E6")'target
oCrange.setDataArray(oAarray)

oAdoc.close (true)

MsgBox "Данные успешно внесены"

End Sub

Ошибка выдается в строке с командой:
oASheet=oAdoc.sheets(0)'Tabelle 3

Если другой пользователь закрывает файл, ошибки обращения к файлу нет.

sokol92

Метод loadComponentFromURL вернет Null. если файл занят другим приложением.
Добавьте в свой список свойств FileProperties свойство "ReadOnly" со значением True.
Владимир.

almaster13

Цитата: sokol92 от 28 апреля 2025, 17:29Метод loadComponentFromURL вернет Null. если файл занят другим приложением.
Добавьте в свой список свойств FileProperties свойство "ReadOnly" со значением True.

А если файл занят не другим приложением, а открыт в ПО Либре Офис другого пользователя? В папке появляется файл LOCK и открыть этот файл самому нельзя (даже не предлагает открыть для чтения, просто блокируется). Я попробовал добавить свойство ReadOnly, но ошибка осталась и в том же самом месте.

Sub Nedovirabotka

oCdoc=thiscomponent
oCSheet=oCdoc.sheets(0)
 
Dim vFileDialog 'экземпляр сервиса FilePicker
Dim vFileAccess 'экземпляр сервиса SimpleFileAccess
Dim iAccept as Integer 'Ответ от FilePicker
Dim sInitPath as String 'Содержит начальный путь

Dim FileProperties(3) As New com.sun.star.beans.PropertyValue
FileProperties(0).Name = "FilterName"
FileProperties(0).Value ="scalc: Text - txt - csv (StarOffice Calc)"
FileProperties(1).Name = "USE_CONFIG"
FileProperties(1).Value ="3"
FileProperties(2).Name = "Hidden"
FileProperties(2).Value = True
FileProperties(3).Name = "ReadOnly"
FileProperties(3).Value = True

vFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
vFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
'Здесь устанавливаем начальный путь!
sInitPath = "file:///cifs/UCHET/НИИ АЭС/"
rem sInitPath = ConvertToUrl(CurDir)

If vFileAccess.Exists(sInitPath) Then
vFileDialog.SetDisplayDirectory(sInitPath)
End If

iAccept = vFileDialog.Execute() 'Выполняем диалог выбора файла
If iAccept = 1 Then 'Какое возвращаемое значение?
GetAFileName = vFileDialog.Files(0) 'Устанавливаем имя файла если не была
End If 'нажата кнопка Отмена
vFileDialog.Dispose() 'Избавляемся от диалога

rem sURLFolderA=sURLFolder+"АПРЕЛЬ 2024.xlsx"

sURLFolderA=vFileDialog.Files(0)
oAdoc = StarDesktop.loadComponentFromURL(sURLFolderA, "_blank", 0, FileProperties())

oASheet=oAdoc.sheets(0)'Tabelle 3
oArange=oASheet.getCellRangeByName("B7:E9")'source
oAarray=oArange.getDataArray()
oCrange=oCSheet.getCellRangeByName("B4:E6")'target
oCrange.setDataArray(oAarray)

oAdoc.close (true)

MsgBox "Данные успешно внесены"

End Sub

Может быть, я неправильно прописал данное свойство файла?

sokol92

Только что провел следующий эксперимент.

1. Открыл с другого компьютера в сетевой папке файл FontReplace.ods. При этом в той же папке появился файл .~lock.FontReplace.ods#

2. На своем компьютере скопировал в новый документ Calc Ваш макрос из предыдущего сообщения.

Произвел в макросе изменения:
  • значение свойства Hidden изменил на False (иначе ничего не видно)
  • удалил все строки макроса после открытия файла (loadComponentFromURL) до Msgbox

Запустил макрос на выполнение и выбрал файл FontReplace.ods. Файл успешно открылся c информационным окном "This document is open in read-only mode" и кнопкой "Edit Document" (у меня в параметрах установлен интерфейс пользователя на английском языке).

Владимир.

almaster13

Я провел этот же эксперимент, да, открылся для чтения документ под названием "Недовыработка ЯНВАРЬ 2025.xlsx", но открылся он приложением Writer и открыл чистый лист (то есть он открыл для чтения пустой файл). Тогда становится понятно, почему макрос не может взять данные. Их не подргрузилось.

В связи с этим я и хотел узнать, прочесть залоченный файл невозможно в принципе, или есть еще какие то пути решения?

sokol92

Посмотрел текст Вашего макроса повнимательнее.
1. У Вас открывается файл формата .xlsx, а я проверял открытие файла формата .ods.

2. У Вас в списке свойств FileProperties есть свойство "FilterName" со значением "scalc: Text - txt - csv (StarOffice Calc)". Этот фильтр, как следует из названия, предназначен для открытия текстовых файлов, а не файлов Excel.
 
Оставьте в списке свойств FileProperties только "Hidden" и "ReadOnly".


Повторил эксперимент с новым списком свойств для файла формата .xlsx. Открывается нормально как в случае, когда на другом компьютере файл открыт приложением LibreOffice Calc, так и в случае, когда файл открыт приложением Excel (в этом случае файл блокировки имеет другое название).

Владимир.

mikekaganski

Цитата: almaster13 от 29 апреля 2025, 09:06FileProperties(1).Name = "USE_CONFIG"
FileProperties(1).Value ="3"
Тут вообще какой-то винегрет в FileProperties.
Вероятно, хотелось установить MacroExecutionMode из MediaDescriptor.
С уважением,
Михаил Каганский

almaster13

Попробовал такой макрос:

Sub Nedovirabotka

oCdoc=thiscomponent
oCSheet=oCdoc.sheets(0)
 
Dim vFileDialog 'экземпляр сервиса FilePicker
Dim vFileAccess 'экземпляр сервиса SimpleFileAccess
Dim iAccept as Integer 'Ответ от FilePicker
Dim sInitPath as String 'Содержит начальный путь

Dim FileProperties(1) As New com.sun.star.beans.PropertyValue
FileProperties(0).Name = "Hidden"
FileProperties(0).Value = False
FileProperties(1).Name = "ReadOnly"
FileProperties(1).Value = True

vFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
vFileAccess = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
'Здесь устанавливаем начальный путь!
sInitPath = "file:///cifs/UCHET/НИИ АЭС/"
rem sInitPath = ConvertToUrl(CurDir)

If vFileAccess.Exists(sInitPath) Then
vFileDialog.SetDisplayDirectory(sInitPath)
End If

iAccept = vFileDialog.Execute() 'Выполняем диалог выбора файла
If iAccept = 1 Then 'Какое возвращаемое значение?
GetAFileName = vFileDialog.Files(0) 'Устанавливаем имя файла если не была
End If 'нажата кнопка Отмена
vFileDialog.Dispose() 'Избавляемся от диалога

rem sURLFolderA=sURLFolder+"АПРЕЛЬ 2024.xlsx"

sURLFolderA=vFileDialog.Files(0)
oAdoc = StarDesktop.loadComponentFromURL(sURLFolderA, "_blank", 0, FileProperties())


MsgBox "Данные успешно внесены"

End Sub

В результате выполнения снова открывается приложение Writer с чистым листом, но называется он "Недовыработка ЯНВАРЬ 2025.xlsx" (только для чтения)

Версия Libre Office 7.6.7.2
ОС Астролинукс (Linux 5.15)

mikekaganski

С уважением,
Михаил Каганский

almaster13

Мы раньше указывали индивидуальный путь, в который входит логин пользователя, но тогда макрос можно запускать только у одного пользователя. Сейчас попробую указать полный путь....

Нет, указание пути начина я от ///home/пользователь/discs/... не помогло, видимо этой действительно настройки сервера!

Если бы еще знать, какие настройки нужно сделать... а потом убедить поддержку в необходимости их внесения!

sokol92

Цитата: almaster13 от 30 апреля 2025, 14:05В результате выполнения снова открывается приложение Writer с чистым листом, но называется он "Недовыработка ЯНВАРЬ 2025.xlsx" (только для чтения)
Это почти то, что надо, только приложение не то.  :)

Вызовите  Меню / Справка / О программе LibreOffice, нажмите кнопку "Сведения о версии" и скопируйте в сообщение форума содержимое буфера обмена.

Вот, подобрал похожую версию для Astra Linux:

Version: 7.6.7.2 (X86_64) / LibreOffice Community
Build ID: 60(Build:2)
CPU threads: 4; OS: Linux 5.15; UI render: default; VCL: kf5 (cairo+xcb)
Locale: ru-RU (ru_RU.UTF-8); UI: ru-RU
Debian package version: 4:7.6.7-0ubuntu0.18.04.1~lo1+ci202406101034+astra7+b1
Calc: threaded
Владимир.

sokol92

Проверил в указанной выше конфигурации - ошибок нет.

На всякий случай, выложите файл, при открытии которого происходят проблемы. Если там есть конфиденциальная информация - удалите и проверьте, что проблема осталась.

Далее, надо проверить с "чистым" профайлом.
Создайте в своем домашнем каталоге /home/ВашеИмя папку libreoffice и выполните:

libreoffice --calc -env:UserInstallation=file:///home/ВашеИмя/libreoffice

Разрешите выполнение макросов и выполните наш эксперимент.
Владимир.

mikekaganski

Можно ещё проверить с файлом в другом месте. Можно начать с локального файла; открыть его в другом инстансе LibreOffice (с использованием -env:UserInstallation), а потом проверить макрос.
С уважением,
Михаил Каганский