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

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

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

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Скрипт на Python запускает Libre calc и запускает макрос  (Прочитано 822 раз)
0 Пользователей и 1 Гость смотрят эту тему.
georgiy123
Участник
**
Offline Offline

Сообщений: 23


« Ответ #53360: 17 Январь 2020, 10:10 »

Ребята , всем привет ! , спасибо вашему форуму , и всем кто помогал мне дописать этот скрипт
Каждый день обрабатываю логи , в архиве +100 тхт файлов
Скрипт работает по файловой системе (удаляет , сохраняет , объединяет, открывает    , делает всё для результата )
Макрос ( module 1 ) каждый файл тхт всталяет как отдельный лист (страницу ) и на каждом листе делает Условное форматирование в столбце F
Макрос2 ( module 2 ) точно также вставляет файл из папки , ну только 1 , и удаляет строки по условию где сработало условное форматирование
Python
Код:
import os
import time
import tarfile
import sys
import subprocess
from pathlib import Path
import fileinput
import glob
#time.sleep(время в секундах ) пауза на несколько секунд
print('Скрипт начал начал работу , ждите окончание ')
path='C:\\Users\\g.nerovniy\\Desktop\\log1' #путь откуда берется ахрив .tar
path2='C:\\Users\\g.nerovniy\\Desktop\\log' #путь где будет происходить работа с файлами ( распаковка , удаление ,обьеденение )
print('Удаление ненужный файлов ')
directory='C:\\Users\\g.nerovniy\\Desktop\\log\\'# удаляются все файлы в папке
os.chdir(directory)
files=glob.glob('*.txt')#
for filename in files:#
    os.unlink(filename)#
time.sleep(5) #
print("Готово! ")#
print("Копирование файлов , распаковка файлов ")#
for file_name in os.listdir(path):# распаковка архива с path в path2
base_name, ext = os.path.splitext(file_name)#
abs_file_name = os.path.join(path, file_name)#
tar = tarfile.open(abs_file_name, 'r' )#
tar.extractall(path2)#
name_file_ok = file_name[:-7]# срезаное имя файла , если 2020-01-01.tar.gz  то 2020-01-01
time.sleep(3)#
print('Распаковка и копирование завершено!')
print('Запуск LibreOffice')
time.sleep(3)
command = ("C:/Program Files/LibreOffice/program/scalc.exe -norestore " )# запуск либр офис
p = subprocess.Popen(command)
print("Запуск макроса ")
time.sleep(5)
command = ("C:/Program Files/LibreOffice/program/scalc.exe   macro:///standard.module1.main" )# запуск макроса
p = subprocess.Popen(command)
time.sleep(15)#
command = ("C:/Program Files/LibreOffice/program/scalc.exe macro:///standard.module1.delle" )# запуск второго макроса
p = subprocess.Popen(command)
print("Обьеденение файлов")    
time.sleep(1) #
file_list = glob.glob("C:\\Users\\g.nerovniy\\Desktop\\log\\*.txt")#объеденение всех тхт файлов в один
with open('C:\\Users\\g.nerovniy\\Desktop\\log\\mismatching.txt', 'w') as file:#
    input_lines = fileinput.input(file_list)#
    file.writelines(input_lines)#
print("Обьеденение завершено ")
time.sleep(1) #
print('Удаление ненужный файлов ')#удаление всех файлов в папке начинаюищхся на 0
directory='C:\\Users\\g.nerovniy\\Desktop\\log\\'#
os.chdir(directory)#
files=glob.glob('0*.*')#
for filename in files:#
    os.unlink(filename)#
time.sleep(1) #
print("Удаление завершено ")
print("Запуск LibreOffice ")
command = ("C:/Program Files/LibreOffice/program/scalc.exe -norestore " )#запуск либр офис
p = subprocess.Popen(command)
print("Запуск макроса")
time.sleep(3)
command = ("C:/Program Files/LibreOffice/program/scalc.exe   macro:///standard.module2.main" )# запуск макроса их сторого модуля
p = subprocess.Popen(command)
time.sleep(15)#
command = ("C:/Program Files/LibreOffice/program/scalc.exe macro:///standard.module2.delsave" )#зупуск второго макроса
p = subprocess.Popen(command)
time.sleep(25)#
print("Готово! ")
print("Перемещение файлов по папкам")
okpath=name_file_ok+'.ods'# было 2020-01-01 стало 2020-01-01.ods
for path in Path('C:\\Users\\g.nerovniy\\Desktop\\').glob('Logi.ods'):# перенос файлов с рабочего стола , по папкам
    path.replace(Path('C:\\Users\\g.nerovniy\\Desktop\\') / okpath)#
time.sleep(1)
for path in Path('C:\\Users\\g.nerovniy\\Desktop\\').glob('mis.ods')#:
    path.replace(Path('C:\\Users\\g.nerovniy\\Desktop\\Mismatching\\') / okpath)#
print('Перемещение завершено!')

Libre calc Basic (если не ошибаюсь )

Module 1
Код:
private sub main
    dim p$, f$, t$, rw&, cl&, a(), i&
    dim wb as object, ws as object, c as object
    
    p="C:\Users\g.nerovniy\Desktop\log\" 'путь откуда брать тхт файлы
    f=dir(p+"*.txt")
    if len(f) then wb=thiscomponent else exit sub
    
    do          
       wb.sheets.insertnewbyname(f,i)
       ws=wb.sheets(i):i=i+1:rw=0
       open p+f for input as #1
            do while not eof(#1)
               line input #1, t
               a=split(t)
               for cl=0 to ubound(a)
                   c=ws.getcellbyposition(cl,rw)
                   select case cl
                       case 0 to 2, 5 to 7
                          c.setvalue(a(cl))
                       case else
                          c.setstring(a(cl))
                   end select
               next
               rw=rw+1
            loop
       close #1
       setFormat ws, rw
       f=dir
    loop while len(f)
    oDoc = ThisComponent

oDoc.Sheets.removeByName("Лист1")
end sub
 
sub setFormat(ws as object, rw&)
    dim r as object, cf as object
 
    r=ws.getcellrangebyname("f1:f"+rw)
    cf=r.conditionalformat  
    
    condFormat "0.95", "" , "Good", 3, cf
    condFormat "0.9", "0.95", "Neutral", 7, cf
    condFormat "0.85", "0.8999", "Bad", 7, cf
    condFormat "0", "0.85", "Error", 7, cf
    
    r.conditionalformat=cf
    
End Sub
 
sub condFormat(formula1$, formula2$, style$, o&, cf as object)
    dim p(3) As new com.sun.star.beans.PropertyValue
    
    
    
    
    p(0).name="StyleName"
    p(0).value=style
    p(1).name="Operator"
    p(1).value=o
    p(2).name="Formula1"
    p(2).value=formula1
    if len(formula2) then
       p(3).name="Formula2"
       p(3).value=formula2
    end if      
    cf.addnew(p)
   ' Application.Wait Time:=Now + TimeValue("0:00:02")
'delle
end sub

sub delle
odoc=thiscomponent
oSheet = oDoc.CurrentController.getActiveSheet()
myrows=oSheet.getrows
Dim args(0) As New com.sun.star.beans.PropertyValue
oDoc.storeToURL("file:///C:/Users/g.nerovniy/Desktop/Logi.ods", args())
oDoc.close(true)
end sub






Module 2

Код:
private sub main
    dim p$, f$, t$, rw&, cl&, a(), i&
    dim wb as object, ws as object, c as object
    
    p="C:\Users\g.nerovniy\Desktop\log\"
    f=dir(p+"*.txt")
    if len(f) then wb=thiscomponent else exit sub
    
    do          
       wb.sheets.insertnewbyname(f,i)
       ws=wb.sheets(i):i=i+1:rw=0
       open p+f for input as #1
            do while not eof(#1)
               line input #1, t
               a=split(t)
               for cl=0 to ubound(a)
                   c=ws.getcellbyposition(cl,rw)
                   select case cl
                       case 0 to 2, 5 to 7
                          c.setvalue(a(cl))
                       case else
                          c.setstring(a(cl))
                   end select
               next
               rw=rw+1
            loop
       close #1
       setFormat ws, rw
       f=dir
    loop while len(f)
    oDoc = ThisComponent

oDoc.Sheets.removeByName("Лист1")
end sub
 
sub setFormat(ws as object, rw&)
    dim r as object, cf as object
 
    r=ws.getcellrangebyname("f1:f"+rw)
    cf=r.conditionalformat  
    
    condFormat "0.95", "" , "Good", 3, cf
    condFormat "0.9", "0.95", "Neutral", 7, cf
    condFormat "0.85", "0.8999", "Bad", 7, cf
    condFormat "0", "0.85", "Error", 7, cf
    
    r.conditionalformat=cf
    
End Sub
 
sub condFormat(formula1$, formula2$, style$, o&, cf as object)
    dim p(3) As new com.sun.star.beans.PropertyValue
    p(0).name="StyleName"
    p(0).value=style
    p(1).name="Operator"
    p(1).value=o
    p(2).name="Formula1"
    p(2).value=formula1
    if len(formula2) then
       p(3).name="Formula2"
       p(3).value=formula2
    end if      
    cf.addnew(p)


end sub


sub delsave
 odoc=thiscomponent
 oSheet = oDoc.CurrentController.getActiveSheet()
 myrows=oSheet.getrows
 
 rowmax=3000
 rowmin=0
 
 For i=rowmax To rowmin step -1
 textnd = osheet.getcellbyposition(5,i).string
    If textnd >="0,95" Then
      myrows.removebyindex(i,1)
    End if  
 Next i
Dim args(0) As New com.sun.star.beans.PropertyValue
oDoc.storeToURL("file:///C:/Users/g.nerovniy/Desktop/mis.ods", args())
oDoc.close(true)
end sub



Если есть предложение как улучшить код , пишите ,буду рад  Смеющийся
« Последнее редактирование: 17 Январь 2020, 10:13 от georgiy123 » Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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