Аггрегация папки с файлами в итоговую таблицу

Автор luu, 5 декабря 2019, 11:16

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

mikekaganski

Цитата: Bigor от  5 декабря 2019, 15:52
Вставьте перед if



print ConverttoUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" )


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

luu

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

bigor

Цитата: mikekaganski от  5 декабря 2019, 16:05и очевидно, что там таки пусто?
я это подозревал, но вдруг конвертит неправильно :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

bigor

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

mikekaganski

Цитата: luu от  5 декабря 2019, 16:07в надежде что скрипт сам все пропишет из имеющихся файлов
Используйте функцию Dir.
С уважением,
Михаил Каганский

luu

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

Это выдает вот эта строчка:
print ConverttoUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" )
Которая расположена между While и If

mikekaganski

#21

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
С уважением,
Михаил Каганский

luu

#22
Спасибо за наводку. Вопрос с относительным адресом решил. Теперь получилось так:
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" - если его нет. Только как называются функции для реализации этого?

bigor

Смотри
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


bigor

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

а то у меня слишком коряво получилось  ???
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

luu

Попробовал перенести колонку с контрольными значениями о наличии файла (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

У тебя столбец А не используется, поменяй 59, на 0 в моем варианте и все
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

Цитата: Bigor от  5 декабря 2019, 17:16
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

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