Automatyzacja zapisu - plik tekstowy, jeden arkusz

Użytkowanie arkusza kalkulacyjnego
mitex
Posty: 1
Rejestracja: śr sie 06, 2014 8:25 am

Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitex »

Witam

Czy jest możliwość zapisania jednego arkusza jednym kliknięciem do pliku tekstowego z rozszerzeniem np ###?

Mam świetnie przygotowany plik z kilkoma arkuszami... arkusz z dziesiątka przeliczę i tak dalej ... ale dla maszyny potrzebny jest plik tylko z jednego arkusza, zwykły tekstowy z informacjami oddzielonymi spacjami w odpowiednim katalogu ...

Czy można dodać do arkusza guzik który szybko by zapisał plik wcześniej ustalony w odpowiednim miejscu z odpowiednim rozszerzeniem? jeśli tak to jak to zrobić?

Z góry dziękuje za odpowiedź lub choćby małą podpowiedź w czym tego szukać...
OpenOffice 3.1 na Windows Vista
Awatar użytkownika
Jermor
Posty: 2351
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: Jermor »

Można to zrobić wybierając "Zapisz jako" i wskazując typ "Tekst CSV". Ten sposób zapisuje tylko aktywny arkusz.
W dalszych określanych parametrach należy podać sposób kodowania znaków i separatory pól i wierszy.
Całą procedurę można zarejestrować jako makro i przypisać do przycisku.
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: belstar »

Jermor pisze:Całą procedurę można zarejestrować jako makro i przypisać do przycisku.
Nagraną procedurę można wykorzystać jako szkielet do stworzenia lepszego rozwiązania, bo w tym przypadku nie pozbędziemy się okienka dialogowego, co zmusi nas do klikania, wciskania klawisza.
Cały kod mógłby wyglądać tak:

Kod: Zaznacz cały

Sub ZapiszJakoTekstCSV
Dim FileProperties(1) as new com.sun.star.beans.PropertyValue
Dim sUrl As String
Dim oDoc As Object
	oDoc = ThisComponent
	
    sUrl = ConvertToUrl("C:\Twójkatalog\ZapisanyCSV.txt")' home/ty/dokumenty/ZapisantCSV.txt <- to jest linux 
    FileProperties(0).Name = "FilterName"
    FileProperties(0).Value = "Text - txt - csv (StarCalc)"
    FileProperties(1).Name = "FilterOptions"
    FileProperties(1).Value = "32,34,76,1,,0,false,true,true,false" 'parametry filtra pobierz z nagranej procedury
    oDoc.storeAsURL(sUrl, FileProperties())
End Sub
Polecam lekturę https://wiki.openoffice.org/wiki/Docume ... tarDesktop

Na koniec wstaw przycisk jak kolega wyżej zaproponował.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Świetnie to działa

A jak można dodać by nazwa pliku była zawartością jakiejś komórki? (np data z nazwiskiem lub numer kolejny)

Dzięki serdeczne
LibreOffice 6.1.2.1 na Windows 10
Awatar użytkownika
Jermor
Posty: 2351
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: Jermor »

Dopisz coś takiego

Kod: Zaznacz cały

Dim sPath As String
Dim sFileName as String
sPath = "C:\Twójkatalog\"
sFileName = thisComponent.getSheets.getByName("Arkusz1").getCellRangeByName("F3").getString ' to jest przykładowy adres
sURL = ConvertToURL(sPath & sFileName)
Jeśli w F3 będzie pełna nazwa, z rozszerzeniem, to wszystko.

Jeśli tylko pierwsza część nazwy, napisz instrukcję tak

Kod: Zaznacz cały

sURL=ConvertToURL(sPath&sFileName&".txt")
Mam nadzieję, że się nie pomyliłem.
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Fantastycznie dokładnie o to chodziło !!! :)

Ale mam mały problemik innej natury :)

Chciałbym by nazwa zawierała zawartość trzech komórek. W jednej IMIE w kolejnej NAZWISKO i w ostatniej DATA potem wszystko razem umieszczam w komórce jednej stosując:

=Zamówienie.H2&" - "&Zamówienie.I8&" - "&(Zamówienie.$I$1)

i wyświetla mi się zamiast daty rząd cyfr...
LibreOffice 6.1.2.1 na Windows 10
Awatar użytkownika
Jermor
Posty: 2351
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: Jermor »

Data jesr w rzeczywistości liczbą, która mówi ile dni minęło od 31.12.1899 r. a ułamek odpowiada części doby.
Musisz skorzystać z funkcji DZIEŃ, MIESIĄC i ROK DZIEŃ(I1)&"-"&MIIESIĄC(I1)&"-"&ROK(I1)
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Fantastycznie :)

A można zrobić coś by dodawana była automatycznie zawsze zwiększona o jeden numeracja ?

Samo zamówienie zawsze będzie otwierane zawsze z jednego pliku tylko do odczytu który będzie jak szablon natomiast reszta będzie już tylko zapisem wypełnionych pól... no ale numeracja co jeden była by świetna... :)
LibreOffice 6.1.2.1 na Windows 10
Awatar użytkownika
Jermor
Posty: 2351
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: Jermor »

Wygląda na to, że to my napiszemy tę procedurę. A przecież belstar podał gdzie znaleźć literaturę.
Wybierz komórkę, w której umieścisz liczbę początkową. np F5 i zmodyfikuj tworzoną nazwę pliku
Uzupełnij procedurę w obszarze definicji:

Kod: Zaznacz cały

Dim NrKolejny as Integer 'typ zmiennej Integer przechowuje wartości od -32767 do 32767
Dim dokument   as object
Dim wykonawca as object
na końcu, po zapisaniu pliku txt dopisz to:

Kod: Zaznacz cały

NrKolejny= thisComponent.getSheets.getByName("Arkusz1").getCellRangeByName("F5").getValue ' to jest przykładowy adres
if NrKolejny > 32766 then 
NrKolejny = 0
End if
thisComponent.getSheets.getByName("Arkusz1").getCellRangeByName("F5").setValue(NrKolejny+1) 
Rem Poniższa procedura odpowiada wykonaniu skrótu CTRL+S, czyli zapisuje plik Twojego szablonu z nową wartością w F5
dokument   = ThisComponent.CurrentController.Frame
wykonawca = createUnoService("com.sun.star.frame.DispatchHelper")
wykonawca.executeDispatch(dokument, ".uno:Save", "", 0, Array())
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Może to co napiszę będzie bezczelne choć nie do końca ale zwyczajnie chce się usprawiedliwić ...

Miej nadzieje że karma istnieje bo jeśli tak i trafisz na forum stolarskie to rozpiszę dla Ciebie kuchnie na formatki lub trafisz na formu CNC to napiszę dla Ciebie skrypt dla PikoCNC... Wiem że marne to pocieszenie ale Serdecznie dziękuje za podpowiedzi a raczej całe składniki :bravo:
LibreOffice 6.1.2.1 na Windows 10
Awatar użytkownika
Jermor
Posty: 2351
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: Jermor »

Nie czuję się urażony, po prostu myślałem, że jesteś bardziej zorientowany w makrach.
Tu odpowiadam (podpowiadam) Ci na Twoje pytanie w innym wątku. Chodzi o listę plików.
Wiesz już jak wstawić kolejny numer pliku. Jeśli numeracja będzie zaczynała się od 1 i narastała kolejno, możesz go wykorzystać jako numer wiersza.
Załóż w swoim dokumencie nowy arkusz, np Archiwum.
W nim, po zapisaniu pliku TXT, umieścisz w kolejnym wierszu utworzoną nazwę, datę i te dane, które są Ci potrzebne.
Numerem wiersza może być np jakaś stała+NrKolejny z makra. Wykorzystaj strukturę instrukcji

Kod: Zaznacz cały

Dim Zmienna
thisComponent.getSheets.getByName("Archiwum").getCellRangeByPosition(0,NrKolejny).setValue(NrKolejny) 'wstawia numer kolejny w pierwszej kolumnie wiersza NrKolejny+1, bo numerowanie wierszy startuje od 0
Zmienna=thisComponent.getSheets.getByName("Arkusz1").getCellRangeByName("adres komórki").getValue  'tą strukturą pobierasz zawartość komórki
thisComponent.getSheets.getByName("Archiwum").getCellRangeByPosition(1,NrKolejny).setValue(Zmienna) ' tą strukturą wstawiasz do komórki
I wpisz je po instrukcji pobierania zmiennej NrKolejny, przed If. W tych instrukcjach
  • setValue wstawia wartości liczbowe, setString - ciągi tekstowe ( np nazwę pliku)
    getValue pobiera wartość z komórki, getString - pobiera ciąg tekstowy
dlatego musisz uważać co pobierasz i co zapisujesz
w układzie adresowania byPosition pierwsza liczba to kolumna druga to wiersz. Pierwsza kolumna w arkuszu i pierwszy wiersz w arkuszu sa oznaczone liczbą 0.
Wykorzystując naprzemian instrukcję pobierania i wstawiania wypełnisz arkusz Archiwum potrzebnymi danymi.
Dopiero po tych operacjach zapisz plik.
Teraz Twoje archiwum będzie razem z podstawowym plikiem.
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
Jermor
Posty: 2351
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: Jermor »

W mailu, który mi przysłałeś na priva, host Twojego adresu zwrotnego jest odrzucany przez system poczty, jako nieznany

Sorry, I couldn't find any host named mikrotech.net.pl. (#5.1.2)
AOO 4.1.15, LO 24.8.2 (x64) na Windows 10 64bit
Ważne!
Jeśli twój problem został rozwiązany, wróć do swojego pierwszego postu, przejdź do edycji i dopisz [SOLVED] w temacie.
Inni, którzy mają podobny problem, będą wiedzieli, że istnieje jego rozwiązanie.
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Panowie niestety zaczynam wchodzić na nieznane sobie wody a nałyka całego pakietu na potrzeby jednego arkusza to zły pomysł.

Zwracam się więc z pytaniem czy ktoś miałby trochę wolnego czasu i zrobił dla mnie taki arkusz a raczej dokończył oczywiście za jakieś rozsądne wynagrodzenie.

Potrzebne mi jeszcze rzeczy to:
- odczyt plików i umieszczenie kilku informacji na listach.
- możliwość zapisania kilku danych w tych plikach bez ich otwierania (znaczy mogą się otwierać i zamykać byle działo się to automatycznie...

mam nadzieje że ktoś pomorze. Czekam na maila na marekmitonski@op.pl i podeślę to co mam do tej pory zrobione.
LibreOffice 6.1.2.1 na Windows 10
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Mam taki problem

Chce wypełnić z macra pewną formułą komórkę i robię to tak jak poniżej i co dziwne mam trzy takie pozycje a działa tylko pierwsza... mało tego komórki dostają formule ale nic nie wyświetlają.
Co może być przyczyną

Dodam że próby z dodaniem (1) i tak dalej nic nie zmieniają i dział tak jak gdyby ich nie było

Kod: Zaznacz cały

sub OdczytPliku
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
Dim Sheet As Object 
Dim Cell As Object 
dim dispatcher as object
Dim NextFile As String
Dim AllFiles As String
Dim sLinkBaza As String
Dim bMode as Boolean
Dim wiersz as Integer
Dim wynik as String 
oDocument = ThisComponent
CompatibilityMode( True ) 'set mode
CompatibilityMode( False) 'clear mode
oDocument = ThisComponent
bMode = CompatibilityMode()
Doc = ThisComponent
Sheet = Doc.Sheets(0)
 


 
  AllFiles = ""
  sLinkBaza = thisComponent.getSheets.getByName("Ustawienia").getCellRangeByName("LinkBaza").getString ' "C:\Twójkatalog\"
  NextFile = Dir(sLinkBaza, 0)
  
  wiersz = 7 rem pierwsza pozycja w kolumnie 
  While NextFile  <> ""
    Cell = Sheet.getCellRangeByName("AA"&wiersz)
    Cell.String = NextFile
    
    Cell(0) = Sheet.getCellRangeByName("E"&wiersz) ' 
    Cell(0).Formula(0)   = "=DDE("& Chr(34)& "soffice"& Chr(34)& ";"& Chr(34)& sLinkBaza & NextFile & Chr(34)& ";"& Chr(34)& "DataZamowienia"& Chr(34)& ")" 'wyswietla normalnie
    
    Cell(1) = Sheet.getCellRangeByName("B"&wiersz)
    Cell(1).Formula(1)  = "=DDE("& Chr(34)& "soffice"& Chr(34)& ";"& Chr(34)& sLinkBaza & NextFile & Chr(34)& ";"& Chr(34)& "ZamawiajacyFirma"& Chr(34)& ")" 'komorki maja wstawiona formue ale nic nie wywietlaja

    Cell(2) = Sheet.getCellRangeByName("F"&wiersz)
    Cell(2).Formula(2)  = "=DDE("& Chr(34)& "soffice"& Chr(34)& ";"& Chr(34)& sLinkBaza & NextFile & Chr(34)& ";"& Chr(34)& "StanZamowione"& Chr(34)& ";2)" 'dodanie na koncu 2 przerabia na tekst ale i tak nie dziala
   
    oDocument.Sheets.getByName("STAN").getCellRangeByName("A"&wiersz).setValue(NextFile)
   
    AllFiles = AllFiles & Chr(13) & NextFile 
    NextFile = Dir
    wiersz = wiersz + 1
  Wend
  
  MsgBox  " Znalezione pliki " & Chr(13) & Chr(13) & AllFiles
  rem print AllFiles
  rem oDocument.Sheets.getByName("Zamówienie").getCellRangeByName("M20").setValue(NextFile)  
End Sub
LibreOffice 6.1.2.1 na Windows 10
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: belstar »

Przyglądając się twojej procedurze pierwsze co mi się rzuca w oczy to zmienna obiektowa Cell, w jednym miejscu jest to zmienna obiektowa a w drugim już tablica obiektów, i deklaracja zmiennej nie deklaruje tablicy:

Kod: Zaznacz cały

Cell
...
Cell(0)
...
Cell(1)
...
itd.
Musisz przyjąć jednakową konwencje, albo zmienna

Kod: Zaznacz cały

Cell
..
Cell1
...
itd
albo tablica

Kod: Zaznacz cały

Cell(0)
...
Cell(1)
...
itd.
Nie testowałem tego kodu lecz tylko przejrzałem, może chodzi o coś innego.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Próbowałem tak i tak i nic...

Co dziwne do arkusza jest wklejona procedura którą wypluwa cell z makro a mimo tego nie widać działania.
Wrzucam pliki. Działam na windows a całość była bezpośrednio na C

Proszę o pomoc bo dziwne to dla mnie...
Załączniki
Ciecie.zip
Plik rozpakować trzebna bezpośrednio na dysku C w windows
(124.83 KiB) Pobrany 193 razy
LibreOffice 6.1.2.1 na Windows 10
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

A może ktoś to tylko uruchomić w celu sprawdzenia. Może po prostu to coś na moim pc... Bo dla mnie to nie logiczne.

Mam jeszcze inne pytanie czy dla arkusza do wprowadzania danych można zrobić taki mały interfejs jak np w base... ?
LibreOffice 6.1.2.1 na Windows 10
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: belstar »

Dodaj funkcję ConvertToUrl()

Kod: Zaznacz cały

 sLinkBaza = ConvertToUrl(thisComponent.getSheets.getByName("Ustawienia").getCellRangeByName("LinkBaza").getString)
U mnie działa, choć projekt bardzo chaotyczny, wymagający głębokiego szlifu. Chwali się tobie że chociaż próbujesz. Wszystkie procedury można skrócić, powtarzające się zamienić na funkcje, wywołania dispatcher-a zamienić API i czy nie lepiej stworzyć to base.

Co do drugiego pytania, pewno chodzi ci o formularz - można i tak, można też skorzystać z dialogów. Jeden i drugi sposób wymaga programowania.

Tak czy inaczej próbuj dalej, powodzenia.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Za diabła mi to nie działa wyświetla się tylko data która tak czy inaczej jest zmieniana na aktualna a nie z pliku (prawdopodobnie kopiuje formue i ja wykonuje)
W komórkach innych jest umieszczana procedura ale nie zostaje wykonana... tak jak gdyby nie było nic w komórce :(

Może dało by się to tak poprawić by zostały wypluwane dane w komórki a nie procedury odczytujące... mmm
Załączniki
aa.JPG
LibreOffice 6.1.2.1 na Windows 10
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: belstar »

Sprawdź menu Narzędzia -> Zawartość komórki, czy masz zaptaszkowane Oblicz automatycznie. Kiedy jest nie zaznaczone formuła nie wyświetla wyniku, dopiero po wciśnięciu F9.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Dziwna sprawa :/ ale nidy wszystko ustawione ale nic nie działa...
Moze sprawdzę po powrocie na innych PC.
Tobie to działa normalnie w innych komórkach niż tych z datą?
LibreOffice 6.1.2.1 na Windows 10
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: belstar »

Działa, spróbuj standardową diagnostykę.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Co masz na myśli z tą diagnostyką bo klikam i klikam i nic nie widzę tu ... Może ... No nie wiem .
LibreOffice 6.1.2.1 na Windows 10
tury
Posty: 22
Rejestracja: czw gru 19, 2013 1:27 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: tury »

Apache Office 4.0.1
Windows XP Pro SP3
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

mmm dziwne zrobiłem wszystko włącznie z przeinstalowaniem i nic się nie zmieniło... może to coś z PC no nic będę musiał sprawdzić jak wrócę za kilka dni

EDIT............

Zadziałało :)

Kod: Zaznacz cały



REM  *****  BASIC  *****

Sub ZapiszJakoTekstODS
rem sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
Dim NrKolejny as Integer 'typ zmiennej Integer przechowuje wartości od -32767 do 32767
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------

Dim sPath As String
Dim sFileName as String
Dim FileProperties (2) as new com.sun.star.beans.PropertyValue
Dim sUrl As String
Dim oDoc As Object
    
    sPath = thisComponent.getSheets.getByName("USTAWIENIA").getCellRangeByName("C12").getString' "link do zapisu plikow bazy
    oDoc = ThisComponent
    sFileName = thisComponent.getSheets.getByName("ROZ").getCellRangeByName("A1").getString 'nazwa pliki
   ' sURL(1) = ConvertToURL(sPath(1) & sFileName(1))
    
    FileProperties(0).Name = "FilterName"
    FileProperties(0).Value = "calc8"
    FileProperties(1).Name = "Overwrite"
    FileProperties(1).Value = True 
    FileProperties(2).Name = "FilterOptions"
    FileProperties(2).Value = "32,34,76,1,,0,false,true,true,false" 'parametry filtra pobierz z nagranej procedury
    sURL=ConvertToURL(sPath & sFileName & ".ODS")
    oDoc.storeAsURL(sUrl, FileProperties())
    
    document   = ThisComponent.CurrentController.Frame
    dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
    
    msgbox "Plik ODS z danymi oraz czysty plik został zapisany zapisany-------------baza"
    
rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$B$8:$G$57"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Flags"
args2(0).Value = "SV"

dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(0) as new com.sun.star.beans.PropertyValue
args3(0).Name = "ToPoint"
args3(0).Value = "$I$3:$I$5"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Flags"
args4(0).Value = "SV"

dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args4())

rem ----------------------------------------------------------------------
dim args5(0) as new com.sun.star.beans.PropertyValue
args5(0).Name = "ToPoint"
args5(0).Value = "$I$10"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args5())

rem ----------------------------------------------------------------------
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "Flags"
args6(0).Value = "SV"

dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args6())

dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "ToPoint"
args7(0).Value = "$I$12"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args7())

rem ----------------------------------------------------------------------
dim args8(0) as new com.sun.star.beans.PropertyValue
args8(0).Name = "Flags"
args8(0).Value = "SV"

dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args8())

dim args9(0) as new com.sun.star.beans.PropertyValue
args9(0).Name = "ToPoint"
args9(0).Value = "$I$16"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args9())

rem ----------------------------------------------------------------------
dim args10(0) as new com.sun.star.beans.PropertyValue
args10(0).Name = "Flags"
args10(0).Value = "SV"

dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args10())


rem ----------------------------------------------------------------------
dim args13(0) as new com.sun.star.beans.PropertyValue
args13(0).Name = "ToPoint"
args13(0).Value = "$I$25"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args13())

rem ----------------------------------------------------------------------
dim args14(0) as new com.sun.star.beans.PropertyValue
args14(0).Name = "Flags"
args14(0).Value = "SV"

dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args14())

rem ----------------------------------------------------------------------
dim args15(0) as new com.sun.star.beans.PropertyValue
args15(0).Name = "ToPoint"
args15(0).Value = "$I$14"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args15())

rem ----------------------------------------------------------------------
dim args16(0) as new com.sun.star.beans.PropertyValue
args16(0).Name = "Flags"
args16(0).Value = "SV"

dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args16())

rem ----------------------------------------------------------------------
dim args17(0) as new com.sun.star.beans.PropertyValue
args17(0).Name = "ToPoint"
args17(0).Value = "$I$34"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args17())

rem ----------------------------------------------------------------------
dim args18(0) as new com.sun.star.beans.PropertyValue
args18(0).Name = "Flags"
args18(0).Value = "SV"

dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args18())
rem ----------------------------------------------------------------------
dim args19(0) as new com.sun.star.beans.PropertyValue
args19(0).Name = "ToPoint"
args19(0).Value = "$I$36"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args19())

rem ----------------------------------------------------------------------
dim args20(0) as new com.sun.star.beans.PropertyValue
args20(0).Name = "Flags"
args20(0).Value = "SV"

dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args20())

rem ----------------------------------------------------------------------
dim args21(0) as new com.sun.star.beans.PropertyValue
args21(0).Name = "ToPoint"
args21(0).Value = "$k$10"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args21())

rem ----------------------------------------------------------------------
dim args22(0) as new com.sun.star.beans.PropertyValue
args22(0).Name = "Flags"
args22(0).Value = "SV"
dispatcher.executeDispatch(document, ".uno:Delete", "", 0, args22())

rem ----------------------------------------------------------------------
dim args23(0) as new com.sun.star.beans.PropertyValue
args23(0).Name = "ToPoint"
args23(0).Value = "$k$12"
dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args23())


rem-----------------------------------------------------------------------
NrKolejny= thisComponent.getSheets.getByName("Zamówienie").getCellRangeByName("I2").getValue ' to jest przykładowy adres
if NrKolejny > 32766 then 
NrKolejny = 0
End if


thisComponent.getSheets.getByName("Zamówienie").getCellRangeByName("I2").setValue(NrKolejny+1) 
Rem Poniższa procedura odpowiada wykonaniu skrótu CTRL+S, czyli zapisuje plik Twojego szablonu z nową wartością w F5
dokument   = ThisComponent.CurrentController.Frame
wykonawca = createUnoService("com.sun.star.frame.DispatchHelper")
wykonawca.executeDispatch(dokument, ".uno:Save", "", 0, Array())

rem-------------------------------------------------------------------------

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim sPath1 As String
Dim sFileName1 as String
Dim FileProperties1 (2) as new com.sun.star.beans.PropertyValue
Dim sUrl1 As String
Dim oDoc1 As Object
    
    sPath1 = thisComponent.getSheets.getByName("USTAWIENIA").getCellRangeByName("C14").getString' "katalog glowny dla pliku Ciecie
    oDoc1 = ThisComponent
    sFileName1 = thisComponent.getSheets.getByName("USTAWIENIA").getCellRangeByName("C16").getString 'nazwa czystego pliku ciecia
   
    FileProperties1(0).Name = "FilterName"
    FileProperties1(0).Value = "calc8"
    FileProperties1(1).Name = "Overwrite"
    FileProperties1(1).Value = True 
    FileProperties1(2).Name = "FilterOptions"
    FileProperties1(2).Value = "32,34,76,1,,0,false,true,true,false" 'parametry filtra pobierz z nagranej procedury
    sURL1=ConvertToURL(sPath1 & sFileName1 & ".ODS")
    oDoc1.storeAsURL(sURL1, FileProperties1())
    
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

msgbox "Plik ODS z danymi oraz czysty plik został zapisany zapisany"

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Undo", "", 0, Array())

End Sub
I tu robi mi się inny problem...
Mianowicie skrypt ma zapisywać dwa pliki w rożnych miejscach.
Jeden plik z tym co jest na ekranie
dróg plik zawiera nieco mniej informacji ale zawiera nr o jeden większą i ma się zapisać z inną nazwą ale problem jest taki...

Pliki są zapisane w różnych miejscach ale zawierają to samo... co dziwne drógi plik zostaje nadpisany przez pierwszy dopiero na końcu bo w połowie wykonywania sprawdzałem i jest poprawny...
LibreOffice 6.1.2.1 na Windows 10
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Panowie choć mała podpowiedź w czym może tkwi problem że plik zostaje napisany skoro zmieniam ustawienia? może jakiś rejestr powinienem wyczyścić czy coś...
LibreOffice 6.1.2.1 na Windows 10
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

Nikt nie miał z czymś takim odczynienia nigdy?
LibreOffice 6.1.2.1 na Windows 10
Jan_J
Posty: 4576
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: Jan_J »

Może po prostu kod jest zbyt rozwlekły i niezachęcający do analizy, by komuś chciało się go zgłębiać?
Mnie osobiście odrzuca niejednolitość środków: raz wywołania API (doc.StoreAsURL), raz makra UNO (.executeDispatch(dokument, ".uno:Save", ...). Mając ograniczone zasoby czasu wolę się zaangażować w rozwiązanie czytelniejszych problemów. Patrz m.in. https://forum.openoffice.org/pl/forum/v ... 6#regula05
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
mitek
Posty: 69
Rejestracja: czw lip 15, 2010 11:52 pm

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: mitek »

mmm Niestety składam skrypt z tego co uda mi się znaleźć i z tego co uda mi się nagrać w makrach...

A problem polega na tym że mimo zmian między dwoma plikami które są zapisywane w jednym cyklu oba pliki są takie same i zawierają te same informacje co w pliku zapisanym podczas drugiego zapisu ma być... (pierwszy plik jest najpierw poprawnie zapisany następnie nadpisany...)

Kod uproszczony to:

Sub ZapiszJakoTekstODS
rem sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
Dim NrKolejny as Integer 'typ zmiennej Integer przechowuje wartości od -32767 do 32767
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------

Dim sPath As String
Dim sFileName as String
Dim FileProperties (2) as new com.sun.star.beans.PropertyValue
Dim sUrl As String
Dim oDoc As Object

sPath = thisComponent.getSheets.getByName("USTAWIENIA").getCellRangeByName("C12").getString' "link do zapisu plikow bazy
oDoc = ThisComponent
sFileName = thisComponent.getSheets.getByName("ROZ").getCellRangeByName("A1").getString 'nazwa pliki
' sURL(1) = ConvertToURL(sPath(1) & sFileName(1))

FileProperties(0).Name = "FilterName"
FileProperties(0).Value = "calc8"
FileProperties(1).Name = "Overwrite"
FileProperties(1).Value = True
FileProperties(2).Name = "FilterOptions"
FileProperties(2).Value = "32,34,76,1,,0,false,true,true,false" 'parametry filtra pobierz z nagranej procedury
sURL=ConvertToURL(sPath & sFileName & ".ODS")
oDoc.storeAsURL(sUrl, FileProperties())

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

msgbox "Plik ODS z danymi oraz czysty plik został zapisany zapisany-------------baza"


REM ............ TU znajdują się zmiany w pliku czyli usunięcie zawartości kilku komórek oraz zmiana nr w jednej komórce ... kilku komórek i ponowne zapisanie pliku o innej nazwie w innym katalogu a mimo tego pierwszy plik zostaje nadpisany

rem-----------------------------------------------------------------------
NrKolejny= thisComponent.getSheets.getByName("Zamówienie").getCellRangeByName("I2").getValue ' to jest przykładowy adres
if NrKolejny > 32766 then
NrKolejny = 0
End if


thisComponent.getSheets.getByName("Zamówienie").getCellRangeByName("I2").setValue(NrKolejny+1)
Rem Poniższa procedura odpowiada wykonaniu skrótu CTRL+S, czyli zapisuje plik Twojego szablonu z nową wartością w F5
dokument = ThisComponent.CurrentController.Frame
wykonawca = createUnoService("com.sun.star.frame.DispatchHelper")
wykonawca.executeDispatch(dokument, ".uno:Save", "", 0, Array())

rem-------------------------------------------------------------------------

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim sPath1 As String
Dim sFileName1 as String
Dim FileProperties1 (2) as new com.sun.star.beans.PropertyValue
Dim sUrl1 As String
Dim oDoc1 As Object

sPath1 = thisComponent.getSheets.getByName("USTAWIENIA").getCellRangeByName("C14").getString' "katalog glowny dla pliku Ciecie
oDoc1 = ThisComponent
sFileName1 = thisComponent.getSheets.getByName("USTAWIENIA").getCellRangeByName("C16").getString 'nazwa czystego pliku ciecia

FileProperties1(0).Name = "FilterName"
FileProperties1(0).Value = "calc8"
FileProperties1(1).Name = "Overwrite"
FileProperties1(1).Value = True
FileProperties1(2).Name = "FilterOptions"
FileProperties1(2).Value = "32,34,76,1,,0,false,true,true,false" 'parametry filtra pobierz z nagranej procedury
sURL1=ConvertToURL(sPath1 & sFileName1 & ".ODS")
oDoc1.storeAsURL(sURL1, FileProperties1())

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

msgbox "Plik ODS z danymi oraz czysty plik został zapisany zapisany"

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:Undo", "", 0, Array())

End Sub




Mam nadzieje że teraz łatwiej będzie przebrnąć przez to.
LibreOffice 6.1.2.1 na Windows 10
Jan_J
Posty: 4576
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Automatyzacja zapisu - plik tekstowy, jeden arkusz

Post autor: Jan_J »

Bez wnikania w szczegóły, mogę się mylić.

Dwa razy wywołujesz oDoc.storeAsURL, za każdym razem z inną nazwą -- OK. Ale co robi w wierszu 55

Kod: Zaznacz cały

wykonawca.executeDispatch(dokument, ".uno:Save", "", 0, Array())
Moim zdaniem zapisuje bieżący (zmieniony!) dokument pod bieżącą (niezmienioną!) nazwą.
JJ
LO (24.2|7.6) ∙ Python (3.12|3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Zablokowany