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

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

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

luu

Привет всем!
Задача такая:
В отдельной папке лежат учетные карточки вида ***.ods, в каждой из карточек на определенном листе есть строка с показателями.
Необходимо получить итоговую таблицу, содержащую в себе строки из каждой карточки по порядку.
Файл итоговой таблицы должен находиться на оди уровень вверх (не в этой же папке)
При изменении значений в какой-либо учетной карточке, нужно автоматическое обновление строк в итоговой таблице (можно по нажатию кнопки или выполнению принудительного действия)

Во вложении прилагаю пример.

Можно ли это реализовать средствами Calc?

bigor

#1
Была не так давно темы, сбора информации в файл, там вроде через DDE делали.
Вот нашел тему
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

luu

Цитата: Bigor от  5 декабря 2019, 12:31
Была не так давно темы, сбора информации в файл, там вроде через DDE делали.
Вот нашел тему

Пока сильно понятнее не стало. Ткните ссылочкой, пжлст

bigor

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

luu

Первоначально была идея сделать так:
В итоговой книге сделать много листов (на каждую карточку свой лист), в каждый из них через Лист -> Связь с внешними данными вставлять строку из нужной карточки. А потом все это формулами собирать на первом листе в одну большую таблицу.
Но:
1. Это слишком костыльно и монструозно, учитывая, что число карточек приближается к 1000
2. Импорт из каждой карточки нужно будет прописывать вручную. А хочется, чтобы при появлении нового файла-карточки он подхватывался автоматически
3. Если собирать итоговую таблицу формулами - то она и будет из формул состоять. А хотелось бы иметь таблицу со значениями

Поэтому, подозревая, что это можно сделать намного проще - прошу помощи.
В Макросах совсем не силен. Пока изучаю тему, на которую дали ссылочку.
Но если кто-то из гору покажет на простом примере, как сделать нужный макрос - буду благодарен. Из простого примера куда проще подкручивать под свои нужды :)

bigor

Вариант макросом "в лоб"
Sub Aggr
    Dim iCol As Integer
    Dim FolderName As String
    FolderName = "d:\test\Inp\"
    oASheet = Thiscomponent.Sheets(1)
    iCol = 2 ' перебираем с 3 строки
   
    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
    Wend
   
End Sub
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

luu

Спасибо! Вставил этот код в свою библиотеку. Попробовал запустить на новом "чистом" файле. Он ругнулся на эту строку:
    oASheet = Thiscomponent.Sheets(1)
Ну тут вроде понятно, он хочет второй лист, а у меня в свежеоткрытой книге только один. Меняю значение на 0 или создаю второй лист.

Но дальше ничего не происходит. Можно ли как-то запускать макрос в форме отладки или что-то в этом духе? Чтобы понять, как он работает.

Подозреваю, что ему просто нечего обрабатывать, потому что путь указан неверно. Но тут затык, пробую разные варианты:
    FolderName = "/Данные/"
- относительный путь к папке с файлами
    FolderName = "/home/l/Документы/_Work/аггрегация показателей/Данные"
- полный путь к папке
    FolderName = "\home\l\Документы\_Work\аггрегация показателей\Данные"
- и такой вариант

Всё безрезультатно - макрос выполняется и на выходе ничего. ЧЯДНТ?

bigor

#7
1. для первого листа нужно прописать 0
2. Папка с файлами для обработки задается здесь FolderName = "d:\test\Inp\"

ps у вас linux?

  попробуйте вариант 2 только в конце еще / добавьте
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

luu

Цитата: Bigor от  5 декабря 2019, 15:37
1. для первого листа нужно прописать 0
- Это ясно. Тут проблем нет

Цитата: Bigor от  5 декабря 2019, 15:37
2. Папка с файлами для обработки задается здесь FolderName = "d:\test\Inp\"
- Это я тоже понял. Но проблема в том, что я указываю свой путь к папке, но макрос файлы не видит

bigor

#9
ps у вас linux?

 попробуйте вариант 2 только в конце еще / добавьте
  и про регистрозависимость не забудьте

Для контроля  в строчке после if вставьте
print ConverttoUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" )
посмотрите какой путь он ищет
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

luu

#10
Цитата: Bigor от  5 декабря 2019, 15:42попробуйте вариант 2 только в конце еще / добавьте

Да, linux.
Пробовал - так же безрезультатно

Попробовал немного упростить путь, убрал пробел (на всякий случай). И добавил контрольные диалоги, для понимания, удовлетворяется ли условие для цикла:

Sub Aggr
    Dim iCol As Integer
    Dim FolderName As String
    FolderName = "/home/l/Документы/_Work/Aggr/"
    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


Так вот диалог "Перед циклом While" появляется, а второй - нет. Т.е. условие не выполняется и цикл не начинает работать.
Если я правильно понимаю написанное  ;)

luu

Цитата: luu от  5 декабря 2019, 15:44Для контроля  в строчке после if вставьте
Код:
print ConverttoUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" )
посмотрите какой путь он ищет
Попробовал. Никакой не ищет. Как я уже выше писал - даже цикл отрабатывать не начинает

bigor

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



print ConverttoUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" )
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

luu

Вставил перед if - тишина

Вставил перед While - получил путь (см. скрин). Вроде бы все верно. Может, проблемы с кирилицей?

bigor

У вас в итоговой странице нет имен файлов (карточек). Или они не там где макрос их ищет
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут