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

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

8 Август 2020, 09:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1 2 3 »   Вниз
  Печать  
Автор Тема: Аггрегация папки с файлами в итоговую таблицу  (Прочитано 2555 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
luu
Участник
**
Offline Offline

Сообщений: 48


« Стартовое сообщение: 5 Декабрь 2019, 11:16 »

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

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

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

* agg.zip (98.77 Кб - загружено 4 раз.)
Записан
Bigor
Мастер
*****
Offline Offline

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


« Ответ #1: 5 Декабрь 2019, 12:31 »

Была не так давно темы, сбора информации в файл, там вроде через DDE делали.
Вот нашел тему
« Последнее редактирование: 5 Декабрь 2019, 12:40 от Bigor » Записан

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

Сообщений: 48


« Ответ #2: 5 Декабрь 2019, 12:41 »

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

Пока сильно понятнее не стало. Ткните ссылочкой, пжлст
Записан
Bigor
Мастер
*****
Offline Offline

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


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

Там надо было книги по листам разнести, у вас проще макросом собрать данные и вставить в итоговую таблицу
Записан

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

Сообщений: 48


« Ответ #4: 5 Декабрь 2019, 14:00 »

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

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

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


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

Вариант макросом "в лоб"
Код:
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
Участник
**
Offline Offline

Сообщений: 48


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

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

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

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

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

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


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

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

ps у вас linux?

  попробуйте вариант 2 только в конце еще / добавьте
« Последнее редактирование: 5 Декабрь 2019, 15:41 от Bigor » Записан

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

Сообщений: 48


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

1. для первого листа нужно прописать 0
- Это ясно. Тут проблем нет

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

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


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

ps у вас linux?

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

Для контроля  в строчке после if вставьте
Код:
print ConverttoUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" )
посмотрите какой путь он ищет
« Последнее редактирование: 5 Декабрь 2019, 15:46 от Bigor » Записан

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

Сообщений: 48


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

попробуйте вариант 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" появляется, а второй - нет. Т.е. условие не выполняется и цикл не начинает работать.
Если я правильно понимаю написанное  Подмигивающий
« Последнее редактирование: 5 Декабрь 2019, 15:49 от luu » Записан
luu
Участник
**
Offline Offline

Сообщений: 48


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

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

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


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

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


Код:
print ConverttoUrl(FolderName & oASheet.getCellByPosition(1, iCol).String & ".ods" )
« Последнее редактирование: 5 Декабрь 2019, 15:57 от Bigor » Записан

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

Сообщений: 48


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

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

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


* Безымянное окно_080.png (10.38 Кб, 689x143 - просмотрено 9 раз.)
Записан
Bigor
Мастер
*****
Offline Offline

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


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

У вас в итоговой странице нет имен файлов (карточек). Или они не там где макрос их ищет
Записан

Поддержать разработчиков 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!