zapis wskazanego arkusza do xls bez funkcji

Użytkowanie arkusza kalkulacyjnego
dadu
Posty: 10
Rejestracja: wt sty 24, 2012 3:36 pm

zapis wskazanego arkusza do xls bez funkcji

Post autor: dadu »

dzien dobry,

w dokumencie mam ponizsze makro :

Kod: Zaznacz cały

sub doXLS

rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
dim url as string
Dim aLocale As New com.sun.star.lang.Locale 
  aLocale.Language = "pl" 
  aLocale.Country = "PL" 

document = ThisComponent
fileName ="Operacyjny"

dim args7(1) As New com.sun.star.beans.PropertyValue
args7(0).Name = "InteractionHandler"
args7(0).Value = ""
args7(1).Name = "FilterName"
args7(1).Value = "MS Excel 97" 
Properties1(1).Name = "FilterFlags"
 Properties1(1).Value = "44,34,0,1"    

document.storeToURL(ConvertToURL("C:/test/" & fileName & ".xls"),Properties())

end sub

celem jest by dany arkusz w rozbudowanym pliku zapisal sie jako oddzielny plik xls bez formul .. tylko obraz
niestety po powyzszym zapisie otrzymuje przy probie otwarcia pliku Operacyjny.xls, ze jest on niezgodny z zapisanym formatem i excel odczytuje go jako zwykly plik tekstowy ...

podejrzewam, ze uzylem zlych "filterflags", ale pewnosci nie mam

bardzo prosze o pomoc

pozdrawiam
Apache OpenOffice 4.1.6 na Ubuntu 22.04
Jan_J
Posty: 4557
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: zapis wskazanego arkusza do xls bez funkcji

Post autor: Jan_J »

No bo makro jest bez sensu napisane.

Najpierw deklarujesz dwuskładnikowy wektor par nazwa-wartość o nazwie args7:
dim args7(1) As New com.sun.star.beans.PropertyValue
args7(0).Name = "InteractionHandler"
args7(0).Value = ""
args7(1).Name = "FilterName"
args7(1).Value = "MS Excel 97"
Potem tworzysz BEZ DEKLARACJI (u mnie to się przewraca przy uruchamianiu) podobny wektor Properties,
i wypełniasz tylko jego DRUGI wpis — bo indeks 1 znaczy „drugi” w świecie, gdzie numeracja zaczyna się od zera.
Properties1(1).Name = "FilterFlags"
Properties1(1).Value = "44,34,0,1"
Na koniec, używasz wektora Properties a nie args7. Informacja że chcesz zapisać filtrem dla xls jest w args7:
document.storeToURL(ConvertToURL("C:/test/" & fileName & ".xls"),Properties())
To nie ma prawa działać.
Modyfikacja jak niżej działa — tj. produkuje plik XLS — ale nie zastępuje formuł wynikami. Dlatego cytuję tylko zmieniony fragment, nieobudowany w procedurę.

Kod: Zaznacz cały

dim args7(2) As New com.sun.star.beans.PropertyValue
args7(0).Name = "InteractionHandler"
args7(0).Value = ""
args7(1).Name = "FilterName"
args7(1).Value = "MS Excel 97" 
args7(2).Name = "FilterFlags"
args7(2).Value = "44,34,0,1"    

document.storeToURL(ConvertToURL("C:/test/" & fileName & ".xls"), args7())

Znaczenia wpisów FilterFlags nie śledziłem, więc nie wiem, za co odpowiadają. Warto sprawdzić w dokumentacji filtra, np. tu: https://wiki.openoffice.org/wiki/Docume ... er_Options, czy posługujesz się opcjami tego filtra, którego uzywasz.
JJ
LO (7.6) ∙ AOO (4.1) ∙ Python (3.11|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
Awatar użytkownika
Jermor
Posty: 2233
Rejestracja: sob paź 12, 2013 11:09 am
Kontakt:

Re: zapis wskazanego arkusza do xls bez funkcji

Post autor: Jermor »

FilterFlags w tym wypadku dotyczy chyba konwersji na plik CSV.
Bo tu chyba jest jakieś nieporozumienie. Wydaje mi się, że nie można zapisać pliku Calc jako Excel tak, aby był to obraz tabeli (bez formuł). Można to osiągnąć plikiem CSV, który wczytany w Excelu odtworzy obraz wynikowy. Jednak ten obraz będzie pozbawiony wszelkich formatowań (filtr csv ich nie przenosi).
Ewentualnie makro powinno utworzyć nowy arkusz, w którym powstanie kopia arkusza oryginalnego z zastąpieniem formuł obliczeniowych ich wartościami i dopiero ten plik zapisać jako Excelowi. A do tego wystarczy tylko FilterName.
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