Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

27 Сентябрь 2020, 21:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: « 1 2 3 »   Вниз
  Печать  
Автор Тема: Аггрегация папки с файлами в итоговую таблицу  (Прочитано 2911 раз)
0 Пользователей и 1 Гость смотрят эту тему.
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 043


« Ответ #15: 5 Декабрь 2019, 16:05 »

Вставьте перед if


Код:
print ConverttoUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" )

А причём тут FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods", если цикл проверяет oASheet.getCellByPosition(1, iCol).String <> "" - и очевидно, что там таки пусто?
Записан

С уважением,
Михаил Каганский
luu
Участник
**
Offline Offline

Сообщений: 48


« Ответ #16: 5 Декабрь 2019, 16:07 »

Точно! разобрался.
Я чистил ячейки на итоговой странице, в надежде что скрипт сам все пропишет из имеющихся файлов.
Просто не сразу понял смысл написанного скрипта.
Сейчас имена карточек прописал - все из файлов подтягивается, спасибо!
Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 959


« Ответ #17: 5 Декабрь 2019, 16:09 »

и очевидно, что там таки пусто?
я это подозревал, но вдруг конвертит неправильно Улыбка
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 959


« Ответ #18: 5 Декабрь 2019, 16:13 »

Можно еще добавить что бы файлы открывались скрыто. И подумать что делать, если файла нет, а карточка вписана. Точнее если файл был с него данные считали, а потом удалили, а карточка осталась.
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 043


« Ответ #19: 5 Декабрь 2019, 16:15 »

в надежде что скрипт сам все пропишет из имеющихся файлов
Используйте функцию Dir.
Записан

С уважением,
Михаил Каганский
luu
Участник
**
Offline Offline

Сообщений: 48


« Ответ #20: 5 Декабрь 2019, 16:15 »

А как все-таки указать относительный путь к папке?
При абсолютном - все работает. Оставляю путь "/Data/" - выхлоп нулевой.
При этом он отрабатывает, выдает диалоги с текстом:
Код:
file:///Data/001.ods
Код:
file:///Data/524.ods
Код:
file:///Data/026.ods

Это выдает вот эта строчка:
Код:
print ConverttoUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" )
Которая расположена между While и If
« Последнее редактирование: 5 Декабрь 2019, 16:20 от luu » Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 043


« Ответ #21: 5 Декабрь 2019, 16:32 »

Код:
GlobalScope.BasicLibraries.LoadLibrary("Tools")
searchDir = DirectoryNameoutofPath(ThisComponent.URL, "/") & "/Data/"
sODSFile = Dir(searchDir & "*.ods")
Do While (Len(sODSFile) > 0)
   sFullFileName = searchDir & sODSFile
   ...
   sODSFile = Dir() ' Next file from the list - omit path to continue the search
Loop
« Последнее редактирование: 5 Декабрь 2019, 16:44 от mikekaganski » Записан

С уважением,
Михаил Каганский
luu
Участник
**
Offline Offline

Сообщений: 48


« Ответ #22: 5 Декабрь 2019, 16:51 »

Спасибо за наводку. Вопрос с относительным адресом решил. Теперь получилось так:
Код:
Sub Aggr
    Dim iCol As Integer
    Dim FolderName As String
    
    GlobalScope.BasicLibraries.LoadLibrary("Tools")
searchDir = DirectoryNameoutofPath(ThisComponent.URL, "/") & "/Data/"
    
    FolderName = searchDir
    oASheet = Thiscomponent.Sheets(1)
    iCol = 2 ' перебираем с 3 строки
    
        Print "Перед циклом While"
  
    While oASheet.getCellByPosition(1, iCol).String <> ""
    
     If  FileExists(ConverttoUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" )) Then
        oDoc2 = StarDesktop.loadComponentFromUrl(ConverttoUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" ),"_blank",0,dimArray())
For i = 1 To 57

oASheet.getCellByPosition(i+1,iCol).String = oDoc2.Sheets(0).getCellByPosition(1, i).String
Next
oDoc2.Close(true)
End if

        iCol = iCol + 1
        
        Print "Перед выходом из цикла"
        
    Wend
  
End Sub

Все-таки Dir мне не понадобится. Мне удобнее как в первоначальном варианте, заранее прописывать имена карточек. А уже по этим записям проверять наличие файлов и вытаскивать из них информацию.
Теперь актуальный вопрос - как при такой конструкции открывать файлы скрытно? Почтому что это всего на трех карточках весьма много время отнимает, открывая каждый файл. А что будет, когда карточек будет 1000 Непонимающий

Ну и то что предлагал Bigor - отрабатывать событие, если имя карточки есть, а её файла нет.
Тут я думаю можно смело добавить 58 колонку в показателях, в которой ставить отметку "1", если файл карточки есть и "0" - если его нет. Только как называются функции для реализации этого?
« Последнее редактирование: 5 Декабрь 2019, 16:56 от luu » Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 959


« Ответ #23: 5 Декабрь 2019, 17:01 »

Смотри
Код:
Sub Aggr
    Dim iCol As Integer
    Dim FolderName As String
    Dim prop(0) as new com.sun.star.beans.PropertyValue
   
    oASheet = Thiscomponent.Sheets(1)
    iCol = 2 ' перебираем с 3 строки
    prop(0).Name="Hidden"
    prop(0).Value= true
    FolderName = left(ThisComponent.url,len(ThisComponent.url)-28)&"Inp/"
    'Print FolderName
    While oASheet.getCellByPosition(1, iCol).String <> ""
    If  FileExists(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" ) Then
        oDoc2 = StarDesktop.loadComponentFromUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" ,"_blank",0,Prop())
For i = 1 To 57

oASheet.getCellByPosition(i+1,iCol).String = oDoc2.Sheets(0).getCellByPosition(1, i).String
Next
oASheet.getCellByPosition(59,iCol).Value = 1
oDoc2.Close(true)
Else
oASheet.getCellByPosition(59,iCol).Value = 0
End if

        iCol = iCol + 1
    Wend
   
End Sub
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
luu
Участник
**
Offline Offline

Сообщений: 48


« Ответ #24: 5 Декабрь 2019, 17:05 »

отлично! спасибо!
 Всё хорошо
Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 959


« Ответ #25: 5 Декабрь 2019, 17:16 »

FolderName только лучше прописать как mikekaganski показал или так
 
Код:
= converttourl(replace(convertFromURL(Thiscomponent.URL),Thiscomponent.Title,"")&"Inp/")

а то у меня слишком коряво получилось  Непонимающий
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
luu
Участник
**
Offline Offline

Сообщений: 48


« Ответ #26: 5 Декабрь 2019, 17:28 »

Попробовал перенести колонку с контрольными значениями о наличии файла (0 и 1) в самое начало. К имени карточки, чтобы сразу выявлять недостачу.
Не выходит:
Код:
Sub Aggr
    Dim iCol As Integer
    Dim jCol As Integer
    Dim FolderName As String
    Dim prop(0) as new com.sun.star.beans.PropertyValue
   
    oASheet = Thiscomponent.Sheets(1)
    iCol = 2 ' перебираем с 3 строки
    jCol = 1 ' В карточке массив значений может начинаться с другой строки
    prop(0).Name="Hidden"
    prop(0).Value= true
    FolderName = converttourl(replace(convertFromURL(Thiscomponent.URL),Thiscomponent.Title,"")&"Data/")
    Print FolderName
    While oASheet.getCellByPosition(1, iCol).String <> ""
    If  FileExists(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" ) Then
        oDoc2 = StarDesktop.loadComponentFromUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" ,"_blank",0,Prop())
For i = 2 To 59
oASheet.getCellByPosition(i+1,iCol).String = oDoc2.Sheets(0).getCellByPosition(1, jCol).String
jCol = jCol + 1
Next
oASheet.getCellByPosition(2,iCol).Value = 1
oDoc2.Close(true)
Else
oASheet.getCellByPosition(2,iCol).Value = 0
End if

        iCol = iCol + 1

    Wend
End Sub

Причем, если в этой строке заменить jCol на i-1 - то все работает. Я не там вставляю накрутку индекса?
Код:
oASheet.getCellByPosition(i+1,iCol).String = oDoc2.Sheets(0).getCellByPosition(1, jCol).String
Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 959


« Ответ #27: 5 Декабрь 2019, 17:38 »

У тебя столбец А не используется, поменяй 59, на 0 в моем варианте и все
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 043


« Ответ #28: 5 Декабрь 2019, 19:30 »

FolderName только лучше прописать как mikekaganski показал или так
 
Код:
= converttourl(replace(convertFromURL(Thiscomponent.URL),Thiscomponent.Title,"")&"Inp/")

а то у меня слишком коряво получилось  Непонимающий

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

C:\Users\Vasya Pupkin\Documents\main.ods

и использовать код типо моего из ответа #21, или из ответа 25, то FolderName получится

file:///C:/Users/Vasya%20Pupkin/Documents/Data/

Теперь если карточка имеет название

написано Кириллицей

то в loadComponentFromUrl будет передан "URL"

file:///C:/Users/Vasya%20Pupkin/Documents/Data/написано Кириллицей.ods

а должно было

file:///C:/Users/Vasya%20Pupkin/Documents/Data/%D0%BD%D0%B0%D0%BF%D0%B8%D1%81%D0%B0%D0%BD%D0%BE%20%D0%9A%D0%B8%D1%80%D0%B8%D0%BB%D0%BB%D0%B8%D1%86%D0%B5%D0%B9.ods

Я не знаю, сработает ли первый неправильный вариант, но правильно было бы оставить FolderName в виде системного пути, и преобразовывать в URL только перед вызовом loadComponentFromUrl:

Код:
FolderName = convertFromURL(DirectoryNameoutofPath(ThisComponent.URL, "/") & "/Data/")
...
If FileExists(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" ) Then
  oDoc2 = StarDesktop.loadComponentFromUrl(convertToURL(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods"), "_blank", 0, Prop())

Далее, конечно, часто ThisComponent.Title используется для определения имени текущего файла. Но в общем случае это необязательно. Для интереса выполните код:

Код:
ThisComponent.Title = "123"

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

С уважением,
Михаил Каганский
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 959


« Ответ #29: 5 Декабрь 2019, 19:48 »

Не созрел я для системного подхода Улыбка
Хотя в самом первом варианте конвертил полный путь с именем файла.  Но потом смотрю файл цифрами обозван, чего лишнее писать.
А про
Код:
ThisComponent.Title = "123"
, но это сам себе злобный буратино,
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
Страниц: « 1 2 3 »   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!