[SOLVED] import danych z pliku txt do calca

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
babiniec4
Posty: 53
Rejestracja: wt sie 03, 2010 10:20 pm

[SOLVED] import danych z pliku txt do calca

Post autor: babiniec4 »

Witam. Potrzebuję makra do importu wybranych danych z pliku txt do calca. Chciałbym zaimportować kilka różnych pozycji z pliku txt do calca. Plik txt to spis pewnych ustawień zapisanych jedne pod drugimi czyli jedna linia to jedna dana. Potrzebuje makro, które pobierze dane z wybranych pozycji pliku np 5-12 i wklei w A1:A8 calca. Dziękuję i prosze o pomoc.
Apache OpenOffice 4.1.5 na Windows 10
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: import danych z pliku txt do calca

Post autor: Jan_J »

Załączam działający przykład.

Nie mam biegłości w obsłudze plików w Basic-u, przykład jest w Pythonie, bo w nim piszę od ręki. Zalety: nowoczesny i elegancki; wady: brak dedykowanych narzędzi w OpenOffice.
Jakby Python okazał się nie do zaakceptowania, możemy pomyśleć o Basic-u. Zalety: popularność, istnienie dedykowanych narzędzi wewnątrz OpenOffice. Wady: przestarzała filozofia i składnia.

Wypakuj plik o rozszerzeniu .py z załącznika zip.

Znajdź kartotekę swojej osobistej konfiguracji OpenOffice. W Windows XP jest to najprawdopodobniej C:\Documents and Settings\nazwa\Dane Aplikacji\OpenOffice.org/3/User/Scripts
Załóż tam podkartotekę python i wkopiuj do niej załączony plik. Odpal Calca; Narzędzia/Makra/Zarządzaj/Python/moje makra/
Możesz przypisać makro do skrótu klawiatury, do przycisku albo do zdarzenia.
Załączniki
przyklad.zip
(1.26 KiB) Pobrany 461 razy
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
babiniec4
Posty: 53
Rejestracja: wt sie 03, 2010 10:20 pm

Re: import danych z pliku txt do calca

Post autor: babiniec4 »

Dziękuje za zainteresowanie i pomoc. Nie wiem czy sobie z tym poradzę, ale spróbuję...
Apache OpenOffice 4.1.5 na Windows 10
babiniec4
Posty: 53
Rejestracja: wt sie 03, 2010 10:20 pm

Re: import danych z pliku txt do calca

Post autor: babiniec4 »

No niestety nie wiem jak to powiazać....Nie za bardzo wiem w którym miejscu tego makro mam podać scieżkę pliku txt. Jeśli możesz mi zmodowac ten kod zakładając że ścieżka pliku txt to C:/test.txt to będe wdzięczny. Pozdrawiam i czekam na inne propozycje.
Apache OpenOffice 4.1.5 na Windows 10
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: import danych z pliku txt do calca

Post autor: Jan_J »

Zacznijmy od początku...

Fragment I zawiera wstępny komentarz, ściąga niezbędne biblioteki języka i definiuje okno dialogowe do wyboru pliku. Będzie ono wykorzystane w głównym podprogramie.

Kod: Zaznacz cały

# coding: utf-8

'''
  Ten plik zawiera makropolecenie pakietu OpenOfice.org
  Umieść plik w katalogu $HOME/.openoffice.org/3/user/Scripts/python/
  albo w %userprofile%/Application Data/openoffice.org/3.Scripys/puthon/
  albo w odpowiedniej kartotece właściwej dla Twojego systemu operacyjnego
  
  Uruchomienie z poziomu OOo Calc: Narzędzia/Makra/Zarządzaj/Python/Moje makra/[...] [Uruchom]
 '''

import os
import urllib

FILEOPEN_SIMPLE = 0
FILESAVE_SIMPLE = 1

def OOoFileOpenDialog(ctx, fname, title):
    ' definiuje okno dialogowe wyboru pliku via OOo '
    picker = ctx.ServiceManager.createInstanceWithContext("com.sun.star.ui.dialogs.FilePicker", ctx)
    picker.initialize( (FILEOPEN_SIMPLE, ) )
    picker.setDisplayDirectory("file:///" + fname)
    picker.setTitle(title)
    if picker.execute():
        fname = picker.getFiles()[0]
    else:
        fname = None
    picker.dispose()
    return fname
Fragment II wstawia listę wpisów (wszystko jedno skąd się wzięła), na wskazany arkusz, począwszy od wskazanego wiersz.
Każdy wpis próbujemy wstawić jako liczbę, a jeżeli się nie da, to jako tekst.

Kod: Zaznacz cały

def listaNaArkusz(lista, arkusz, kolumna, wiersz):
    ' wstawia elementy listy do wybranej kolumny arkusza, począwszy od wskazanego wiersza '
    for x in lista:
        try:        # próba zamiany na liczbę
            x = float(x)
            arkusz.getCellByPosition(kolumna, wiersz).setValue(x)
        except: # jak się nie da liczby, to wstawiamy napis
            arkusz.getCellByPosition(kolumna, wiersz).setString(x)
        wiersz += 1
Fragment III: czyta zawartość pliku o podanej nazwie, i wstawia wybraną jego sekcję (pomiędzy wierszami o numerach pierwszy i ostatni) na pierwszy arkusz bieżącego skoroszytu -- o tym powiada getByIndex(0) --, do kolumny kol, począwszy od wiersza wiersz na arkuszu. Zmodyfikuj te parametry, żeby dostroić skrypt do swoich potrzeb.

Kod: Zaznacz cały

def czytajUstawieniaZPliku(nazwapliku):
    ''' wczytuje wybrane wiersze ze wskazanego pliku do arkusza
        nazwapliku: url czytanego pliku
    '''
    p = urllib.urlopen(nazwapliku)
    zawartosc = p.read().split('\n')
    p.close()
    # zakres wierszy z pliku do uwzględnienia: zmień stosownie do potrzeb
    pierwszy = 3
    ostatni = 6
    # na który arkusz: zmień nr arkusza (liczbę w nawiasie po getByIndex) stosownie do potrzeb
    ark = XSCRIPTCONTEXT.getDocument().Sheets.getByIndex(0)
    # w które miejsce arkusza: zmień kol i/lub wiersz stosownie do potrzeb
    kol = 0
    wiersz = 1
    listaNaArkusz(zawartosc[pierwszy:ostatni+1], ark, kol, wiersz)
Fragment IV: czary-mary, czyli składamy wszystko razem. Czytamy dane z pliku, którego nazwę poda użytkownik za pomocą okna dialogowego.

Kod: Zaznacz cały

def czytajUstawienia():
    ' wybiera plik przez okno dialogowe i wczytuje z niego wybrane wiersze do arkusza '
    ctx = XSCRIPTCONTEXT.getComponentContext()
    nazwapliku = OOoFileOpenDialog(ctx, os.getcwd(), u'Czytaj plik')
    if nazwapliku:
        czytajUstawieniaZPliku(nazwapliku)
Jeżeli znasz na pamięć ścieżkę do pliku, zastąp ten fragment następującym:

Kod: Zaznacz cały

def czytajUstawienia():
    czytajUstawieniaZPliku('file:///c:/test.txt')
Fragment V, czyli kosmetyka: sprawiamy, by z zewnątrz dla użytkownika był widoczny tylko główny skrypt.

Kod: Zaznacz cały

g_exportedScripts = (czytajUstawienia, )
Voila.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: import danych z pliku txt do calca

Post autor: Jan_J »

Przepisałem na Basic, choć można mieć zastrzeżenia do wydajności.
Narzędzia/Makra/Zarządzaj/Makro/<wybierz poziom>/Nowy moduł/<wklej>

Wyższość jest taka, że teraz możesz sobie eksperymentować samodzielnie z kodem.

Kod: Zaznacz cały

'const FILEOPEN_SIMPLE = 0
'const FILESAVE_SIMPLE = 1

sub czytajUstawienia()
    ' wybiera plik przez okno dialogowe i wczytuje z niego wybrane wiersze do arkusza '
    nazwapliku = OOoFileOpenDialog("", "Czytaj plik")
    if nazwapliku <> "" then
        czytajUstawieniaZPliku(nazwapliku)
    endif
end sub

function OOoFileOpenDialog(fname, title) as string
    ' definiuje okno dialogowe wyboru pliku via OOo '
    picker = CreateUnoService( "com.sun.star.ui.dialogs.FilePicker" )
    picker.setDisplayDirectory("file:///" & fname)
    picker.setTitle(title)
    if picker.execute() then
        fname = picker.Files(0)
    else
        fname = ""
    endif
    OOoFileOpenDialog = fname
end function 

sub listaNaArkusz(lista, pierwszy, ostatni, arkusz, kolumna, wiersz)
    ' wstawia elementy listy do wybranej kolumny arkusza, począwszy od wskazanego wiersza '
    for i = pierwszy to ostatni
        x = lista(i)
        arkusz.getCellByPosition(kolumna, wiersz).setString(x)
        wiersz = wiersz + 1
    next i
end sub

sub czytajUstawieniaZPliku(nazwapliku)
    ' wczytuje wybrane wiersze ze wskazanego pliku do arkusza
    ' nazwapliku: url czytanego pliku
    p = FreeFile
    open nazwapliku for input as #p
    zawartosc = ""
    Do While not eof(p)
       Line Input #p, msg
       zawartosc = zawartosc & msg & "#13"
    Loop
    close #p
    zawartosc = split(zawartosc, "#13")
'    # zakres wierszy do uwzględnienia
    pierwszy = 3
    ostatni = 6
'    # na który arkusz
    ark = thisComponent.Sheets.getByIndex(0)
'    # w które miejsce arkusza
    kol = 0
    wiersz = 1
    listaNaArkusz(zawartosc, pierwszy, ostatni, ark, kol, wiersz)
end sub
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
babiniec4
Posty: 53
Rejestracja: wt sie 03, 2010 10:20 pm

Re: import danych z pliku txt do calca

Post autor: babiniec4 »

Pierwsze podejście i działa!!!! Teraz postaram sie dopasowac to makro do swoich potrzeb. Wersja python wieszała mi arkusz wiec dlatego myslałem że muszę ścieżke pliku podać...Ten sposób jest nawet bardziej wygodny bo mogę w prosty wskazać jeden z kilku plików do pobrania danych. Wielkie dzięki.
Apache OpenOffice 4.1.5 na Windows 10
buddelkasten
Posty: 1
Rejestracja: ndz lis 20, 2011 8:21 am

Re: [SOLVED] import danych z pliku txt do calca

Post autor: buddelkasten »

Proszę o pomoc.
potrzebuję napisać makro w calcu, które wczyta mi z 4 plików tekstowych dane do 4 arkuszy.
Każdy plik do osobnego arkusza.
liczby w plikach tekstowych są w kilku kolumnach oddzielonych tabulatorami.
Chciałbym, by skrypt wczytywał pliki automatycznie przy otwarciu skoroszytu ods.

Dziękuję z góry za wszelką pomoc.
OpenOffice 3.3
Jan_J
Posty: 4560
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [SOLVED] import danych z pliku txt do calca

Post autor: Jan_J »

Podpiąłeś się do wątku o czytaniu danych z pliku.
Twój problem wymaga uzupełnienia o 2 szczegóły:
* czytanie z czterech plików uzyskasz albo wywołując cztery razy czynność, za każdym razem z inną nazwą pliku i numem, albo za pomocą pętli przebiegającej nazwy tych czterech plików, i jednocześnie numerację arkuszy;
* automatyzację wykonania makra po otwarciu pliku, co we współczesnych wydaniach OOo/LO w ogóle nie wymaga programowania. Wystarczy użyć Narzędzia → Dostosuj → Zdarzenia ↓ Otwórz dokument → Makro ↓ Zapisz w swoim dokumencie. Może to wymagać dopasowania nagłówka Twojego makra stosownie do wymagań zdarzenia: w tym przypadku nagłówek winien zawierać jeden argument, gdyż taką ich liczbę zdarzenie "open document" przekazuje obsługującemu je podprogramowi.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
ODPOWIEDZ