Eksport Tabeli do oddzielnego pliku

Użytkowanie arkusza kalkulacyjnego
Altaro
Posty: 32
Rejestracja: czw paź 26, 2023 10:13 am

Eksport Tabeli do oddzielnego pliku

Post autor: Altaro »

Witam, czy istnieje możliwość, w makro libre office, wyeksportowania tabeli do osobnego pliku? Zależy mi na funkcjonalności w której po naciśnięciu przycisku formantu (utworzyłem przycisk który wywołuje procedure w makro) uruchomi okno do wybrania miejsca zapisu pliku z tabelą do oddzielnego pliku.
Win 10
LibreOffice 7.1.3.2 x64
Altaro
Posty: 32
Rejestracja: czw paź 26, 2023 10:13 am

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Altaro »

Wykonuję taką procedurę:

Kod: Zaznacz cały

Sub importTabeli
Dim sURL As String ' URL of current spreadsheet
Dim FileN As String ' URL of target CSV-file
Dim oCurrentController As Object ' Before save - activate sheet sSheetName
Dim storeParms(2) as new com.sun.star.beans.PropertyValue 
Const sSheetName = "Gotowa Tabela"
   GlobalScope.BasicLibraries.LoadLibrary("Tools") ' Only for GetFileName
   sURL = thisComponent.getURL()
   If Not thisComponent.getSheets().hasByName(sSheetName) Then
        MsgBox ("Arkusz """ & sSheetName & """ Nie został znaleziony")
        Exit Sub
   EndIf
   FileN = thisComponent.getSheets().hasByName(sSheetName).getCellByPosition(3,3) & ".csv" ' For Data.ods it will be Data.csv
   'GetFileNameWithoutExtension(sURL) 
REM Options to StoreTo:
   storeParms(0).Name = "FilterName"
   storeParms(0).Value = "Text - txt - csv (StarCalc)"
   storeParms(1).Name = "FilterOptions"
   storeParms(1).Value = "9,34,,65535,1,,0,true,true,true" 
REM About this string see https://wiki.openoffice.org/wiki/Documentation/DevGuide/Spreadsheets/Filter_Options
   storeParms(2).Name = "Overwrite"
   storeParms(2).Value = True
REM Activate sheet for export - select "DataSheet"
   thisComponent.getCurrentController().setActiveSheet(thisComponent.getSheets().getByName(sSheetName))
REM storeToURL can raises com.sun.star.io.IOException! Only now:
On Error GoTo Errorhandle
REM Export
   thisComponent.storeToURL(FileN,storeParms())
   MsgBox ("Nie znaleziono błędów, plik został zapisany : """ + ConvertFromUrl(FileN) + """.")
Exit Sub
Zastanawiam się tylko jakie parametry filtra PropertyValue muszę wybrać, aby plik csv eksportował się z zachowaniem wszystkich formatowań?
Win 10
LibreOffice 7.1.3.2 x64
Awatar użytkownika
Jermor
Posty: 2267
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Jermor »

Zakładam, że skopiowany obszar ma być też arkuszem Calc.
Jeśli chodzi o wyeksportowanie tabeli do nowego dokumentu (przez tabelę rozumiem jakiś wybrany obszar w arkuszu), to potrzebne są cztery kroki.
  1. Utworzenie nowego pustego dokumentu.
  2. Przekopiowanie wybranego obszaru na wskazane miejsce w tym nowym dokumencie.
  3. Zapisanie dokumentu w wybranym folderze pod własną nazwą.
  4. Zwolnienie nowo utworzonego dokumentu
Przedstawiam ci więc rozwiązanie. Procedurę kopiowania zbudowałem z wykorzystaniem kodu podanego przez A. Pitonyak'a w jego podręczniku OpenOffice.org Macros Explained, OOME Fourth Edition (Rozdział 15.5.5 "Clipboard")
Makro nosi nazwę NowyPlik() i wywołuje dwa moduły: moduł kopiowanie i moduł zapisywania.
Moduł kopiowania otwiera nowy pusty plik Calca i kopiuje do niego określony zakres komórek. Kopiowanie obejmuje tylko wartości i formatowanie. Nie są kopiowane formuły. To makro kopiuje zakres B1:D8 z arkusza źródła do obszaru zaczynającego się w komórce D3 nowego pliku.
Moduł zapisywania żąda wskazania folderu, w którym plik ma zostać zapisany oraz podania nazwy pliku. Po zapisaniu pliku następuje jego zamknięcie i przywracany jest aktywny arkusz pliku źródłowego.

Kod: Zaznacz cały

Dim Dummy()
Dim oDoc1, oDoc2
Sub NowyPlik()
	Kopiowanie()
	Zapisz()
End Sub

Sub Zapisz
Cz1= GetPath
sPlik=InputBox ("Podaj nazwę pliku z rozszerzeniem","Określenie nazwy pliku")
sZapis= Cz1 & sPlik
oDoc2.StoreAsURL(ConvertToURL(sZapis), Dummy())
oDoc2.Dispose
oDoc1.getCurrentController.getActiveSheet
End Sub
Function GetPath() As String
REM funkcja zwraca adres URL wybranego folderu
	Dim  oPathSettings, oFolderDialog
	oPathSettings = CreateUnoService("com.sun.star.util.PathSettings")
	sPath = oPathSettings.Work
	oFolderDialog = _
		CreateUnoService("com.sun.star.ui.dialogs.FolderPicker")
	oFolderDialog.SetDisplayDirectory(sPath)
	If oFolderDialog.Execute() = _
			com.sun.star.ui.dialogs.ExecutableDialogResults.OK Then
				sPath = oFolderDialog.GetDirectory
	Else
				sPath = sDefaultPath
	End If
	If Right(sPath, 1) <> "/" Then sPath = sPath & "/"
	getPath=ConvertToURL(sPath)

End Function
sub Kopiowanie
Dim oRange
	oDoc1=ThisComponent
	oDoc2=StarDesktop.loadComponentFromURL("private:factory/scalc", _
			"_blank", 0, Array())
	oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 
	oFrame1 = oDoc1.CurrentController.Frame 		
	oRange = oDoc1.Sheets(0).getCellRangeByName("B1:D8")
	oDoc1.CurrentController.select(oRange)
	oDispatcher.executeDispatch(oFrame1, ".uno:Copy", "", 0, Array()) 
	oRange = oDoc2.Sheets(0).getCellRangeByName("D3")
	oDoc2.CurrentController.select(oRange)
	oFrame2 = oDoc2.CurrentController.Frame 
dim args4(5) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Flags"
args4(0).Value = "SVDT"
args4(1).Name = "FormulaCommand"
args4(1).Value = 0
args4(2).Name = "SkipEmptyCells"
args4(2).Value = false
args4(3).Name = "Transpose"
args4(3).Value = false
args4(4).Name = "AsLink"
args4(4).Value = false
args4(5).Name = "MoveMode"
args4(5).Value = 4
	oDispatcher.executeDispatch(oFrame2, ".uno:InsertContents", "", 0, args4())
end sub
AOO 4.1.15, LO 7.5.9 (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.
Altaro
Posty: 32
Rejestracja: czw paź 26, 2023 10:13 am

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Altaro »

Ta procedura niestety nie działa. Nie jest określone z jakim rozszerzeniem, ma się generować nowy plik. Po nadaniu rozszerzenia, plik jest uszkodzony. Być może wykorzystam cześć tego kodu, do ulepszenia swojej procedury,.
Win 10
LibreOffice 7.1.3.2 x64
Awatar użytkownika
Jermor
Posty: 2267
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Jermor »

Altaro pisze: pn kwie 29, 2024 2:29 pm Ta procedura niestety nie działa.
Masz wyjątkową umiejętność niewyjaśniania, co się wydarzyło. Napisanie, że nie działa, to jakby nic nienapisanie.
Plik powstał, czy nie? Jeśli powstał, to może warto byłoby go załączyć do przeanalizowania.
U mnie makro tworzy nowy plik.
Jak napisałem, makro tworzy plik programu Calc. Określając nazwę, należy podać ją łącznie z rozszerzeniem.
Nawiasem pisząc, brak rozszerzenia nie uniemożliwia otwarcia pliku. Rozszerzenie ma bowiem charakter umowny, a nie obligatoryjny. Przyjęło się stosowanie rozszerzeń związanych z konkretnym plikiem wynikowym, np. ods dla plików Calca. Po zainstalowaniu programu Calc, w systemie operacyjnym tworzone jest skojarzenie, mówiące, że rozszerzenie ods jest przypisane do wynikowego pliku programu Calc. Dzięki temu, gdy dwukrotnie kliknie się nazwę pliku, system — na podstawie utworzonego skojarzenia — wywoła program Calc, a ten w następnym kroku otworzy plik.
Jeśli najpierw wywołasz program Calc, to możesz wskazać mu do otworzenia plik z dowolnym rozszerzeniem (lub bez rozszerzenia). Program sprawdzi, czy struktura pliku jest zgodna z oczekiwaną przezeń. Jeśli jest, to plik zostanie otwarty.
Podsumowując, u mnie wszystko działa.
Co do
Altaro pisze: pn kwie 29, 2024 2:29 pm Nie jest określone z jakim rozszerzeniem, ma się generować nowy plik
Sądziłem, że na tyle znasz Basic, że odpowiednio zmodyfikujesz ten fragment makra, w którym "składana" jest cała ścieżka zapisu pliku. W moim makrze okno zapytania o nazwę pliku wyraźnie informuje, żeby wpisać nazwę wraz z rozszerzeniem, czyli np. tak aaa.ods
AOO 4.1.15, LO 7.5.9 (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.
Altaro
Posty: 32
Rejestracja: czw paź 26, 2023 10:13 am

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Altaro »

Oczywiście jestem w stanie to naprawić samodzielnie. Napisałem tylko informacyjnie. Nie mniej jednak przy próbie otwarcia pliku, wskazywane jest, że plik jest uszkodzony.
Win 10
LibreOffice 7.1.3.2 x64
Awatar użytkownika
Jermor
Posty: 2267
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Jermor »

Załączam ci wobec tego mój plik testowy.
Załączniki
Nowy plik.ods
(12.68 KiB) Pobrany 9 razy
AOO 4.1.15, LO 7.5.9 (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.
Altaro
Posty: 32
Rejestracja: czw paź 26, 2023 10:13 am

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Altaro »

Zauważyłem że plik da się normalnie otworzyć, natomiast... przy otwieraniu otrzymuje komunikat:
1.PNG
Następny komunikat to :
2.PNG
Tylko po nacisnieniu "Nie" w pierwszym komunikacie, plik pomimo następnego komunikatu, otwiera się poprawnie.
Załączniki
2.PNG
2.PNG (4.59 KiB) Przejrzano 217 razy
1.PNG
1.PNG (13.75 KiB) Przejrzano 217 razy
Win 10
LibreOffice 7.1.3.2 x64
Awatar użytkownika
Jermor
Posty: 2267
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Jermor »

Jak zrozumiałem, otworzyłeś załączony mój plik i wywołałeś makro NowyPlik. Nadałeś nazwę brbr.ods.
Czyli w pliku brbr.ods przekopiowane dane zaczynają się w komórce D3. Jeśli tak, to u mnie akurat wszystko przebiega OK. Mam także LO 64-bitowe, tylko że wersji 7.5.9. Sprawdziłem także działanie na wersji 24.2.1 i wszystko działa prawidłowo.
Nie rozumiem tych komunikatów.
AOO 4.1.15, LO 7.5.9 (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.
Jan_J
Posty: 4562
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Jan_J »

Potwierdzam opinię @Jermor-a.
Po otwarciu dokumentu "Nowy plik.ods" i uruchomieniu zapisanego w nim makropolecenia NowyPlik powstaje plik o nadanej interaktywnie nazwie, będący poprawnym dokumentem Calca o zawartości zgodnej z opisem.
Nie udało mi się odtworzyć zachowania sygnalizowanego przez @Altaro.
Testowałem na LibreOffice 6.2.8 z 32-bitowej instalacji Linux/rpm oraz na 7.5.9 z 64-bit Linux/rpm. Ale to nie powinno mieć znaczenia.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Altaro
Posty: 32
Rejestracja: czw paź 26, 2023 10:13 am

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Altaro »

U mnie nawet przestała się teraz wykonywać kopia. Dziwne rzeczy.
Win 10
LibreOffice 7.1.3.2 x64
Jan_J
Posty: 4562
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Jan_J »

To zrób obrazek-screenshot z widocznym komunikatem o niepowodzeniu i załącz.
JJ
LO (7.6|24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Jermor
Posty: 2267
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Jermor »

Może zaktualizuj program do najnowszej stabilnej wersji. Obecnie jest to wersja 7.6.6. Nie instalowałem u siebie aktualizacji do 7.6, bo kilka tygodni temu toczyła się na forum dyskusja o niepoprawnym zachowaniu pakietu LibreOffice w wersji 7.6.5. Pojawiła się jednak wersja 7.6.6 i nie pojawiły się głosy o problemach.
AOO 4.1.15, LO 7.5.9 (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.
Altaro
Posty: 32
Rejestracja: czw paź 26, 2023 10:13 am

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Altaro »

Niestety nie jestem w stanie powiększyć wersji. Komputery w firmie mają zainstalowaną wersję 7.1.3
Win 10
LibreOffice 7.1.3.2 x64
Awatar użytkownika
Jermor
Posty: 2267
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Jermor »

Altaro pisze: wt kwie 30, 2024 1:57 pm U mnie nawet przestała się teraz wykonywać kopia.
Wyjaśnij, co przez to rozumiesz. Czy dostajesz jakiś komunikat, czy po prostu nie możesz jej znaleźć na dysku?
Jeśli — niechcący — kliknąłeś "Wybierz folder" bez wskazywania konkretnego, to plik zapisze się w folderze moje dokumenty i tam go nalezy szukać.
Jeśli nie podałeś nazwy, pojawi się błąd wykonania makra.
AOO 4.1.15, LO 7.5.9 (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.
Altaro
Posty: 32
Rejestracja: czw paź 26, 2023 10:13 am

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Altaro »

Plik się generuje, lecz przy próbie otwarcia, powtarzają się powyższe komunikaty, zaś plik jest pusty.
Win 10
LibreOffice 7.1.3.2 x64
Awatar użytkownika
Jermor
Posty: 2267
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: Eksport Tabeli do oddzielnego pliku

Post autor: Jermor »

Może warto uczulić administratora waszych komputerów (sieci?), żeby regularnie aktualizował oprogramowanie do najnowszej wersji. 7.1.3 to wersja z maja 2021 roku. Ponadto nie należy za bardzo ufać wersjom, które na trzeciej pozycji indeksu mają liczbę mniejszą niż 4. Przyjmuje się bowiem, że dopiero od indeksu 4 pakiet jest stabilny.
Sprawdź również, czy makro da się poprawnie wykonać na innym komputerze. Będzie wówczas wiadome, czy problem jest lokalny (na twoim komputerze) czy globalny (na wszystkich komputerach w firmie).
AOO 4.1.15, LO 7.5.9 (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.
ODPOWIEDZ