Ač né tedy ještě úplně "intelektuálně fit", tohle mi dnes šlo docela pěkně. Zde to je. Je pro to potřeba udělat si soubor v Calcu a naklikat si tam na celé prázdné sloupce ta potřebná Podmíněná formátování. Pak jej uložit jako šablonu a zkontrolovat jestli je ta šablona v adresáři který je nastaven v Nástroje/Možnosti/LibreOffice/Cesty -> Šablony. Pak dát jeho jméno do makra, nyní je tam const sSouborSablony="calcPodm.ots" tak změnit to calcPodm.ots na ten svůj název.
Kopíruje rozsah buněk od A1 do konce použité oblasti v ODS. Kdyby měl kopírovat od jiných buněk, tak si lze v makru nastavit proměnné i0 a j0 (např. i0=0 : j0=1 by kopíroval až od A2).
No a pak si otevřít ten svůj ODS soubor s daty a spustit následující makro. To si zjistí rozsah vašich dat v tom ODS, vytvoří si na pozadí soubor z oné šablony, udělá Ctrl+C v rozsahu dle ODS a do ODS nakopíruje jakožto Vložit jinak -> Formáty, Přidat zvolené Podmíněné formátování.
Sub podmineneFormatovaniSablonaCtrlCV 'otevře šablonu, udělá CtrlC na rozsah buněk z aktuálního ODS aby zkopíroval Podmíněné formátování do aktuálního ODS souboru
const sSouborSablony="calcPodm.ots" 'jméno souboru šablony
dim args1(1) as new com.sun.star.beans.PropertyValue, args2(5) as new com.sun.star.beans.PropertyValue
dim sUrl$, sSablonyUrl$, oSoubor as object, p(), oList as object, oListSabl as object, oCur as object, oRozsah as object, i&, j&, i0&, j0&, oDoc as object
oDoc=ThisComponent 'aktuální ODS
oList=oDoc.CurrentController.ActiveSheet 'aktuální list ODS
oCur=oList.CreateCursor 'kurzor
oCur.goToEndOfUsedArea(false) 'kurzor na konec
i=oCur.RangeAddress.EndColumn : j=oCur.RangeAddress.EndRow 'číslo posledního využitého sloupce a posledního využitého řádku
i0=0 : j0=0 'od prvního sloupce od prvního řádku (čísla buněk: A1=0,0; A2=0,1; B1=1,0; B2=1,1 atd.)
rem otevřít soubor vytvořený ze šablony a zkopírovat z něj data, z prvního listu; pak jej zavřít
args1(0).Name="Hidden" : args1(0).Value=true 'otevřít skrytý
args1(1).Name="AsTemplate" : args1(1).Value=true 'udělat nový soubor ze šablony (pro jistotu ať se nepodělá šablona)
sSablonyUrl=ConvertToUrl(CreateUnoService("com.sun.star.util.PathSettings").Template_writable) 'cesta k šablonám nastavená v Nástroje/Možnosti/LibreOffice/Cesty -> Šablony
sUrl=sSablonyUrl & "/" & sSouborSablony
oSoubor=StarDesktop.LoadComponentFromUrl(sURL, "_blank", 0, args1()) 'soubor ze šablony
oListSabl=oSoubor.sheets(0) 'první list šablony
oRozsah=oListSabl.getCellRangeByPosition(i0, j0, i, j) 'rozsah použitých buněk
oSoubor.CurrentController.select(oRozsah) 'vybrat rozsah buněk v šabloně dle rozsahu v aktuálním ODS
uno("Copy", oSoubor) 'Ctrl+C
oSoubor.Close(true) 'zavřít šablonu
rem teď dát Ctrl+V do ODS souboru
oRozsah=oList.getCellRangeByPosition(i0, j0, i, j) 'rozsah použitých buněk v ODS
oDoc.CurrentController.select(oRozsah) 'vybrat první řádek šablony
args2(0).Name="Flags" : args2(0).Value="T" 'Vložit jinak, parametry ze záznamu makra
args2(1).Name="FormulaCommand" : args2(1).Value=1
args2(2).Name="SkipEmptyCells" : args2(2).Value=false
args2(3).Name="Transpose" : args2(3).Value=false
args2(4).Name="AsLink" : args2(4).Value=false
args2(5).Name="MoveMode" : args2(5).Value=4
uno("InsertContents", oDoc, args2) 'Vložit jinak -> Formáty, Přidat
uno("Deselect", oDoc) 'odznačit
End Sub
Sub uno(s$, oDoc as object, optional args()) 'provede uno příkaz
if isMissing(args) then args=Array()
s=".uno:" & s 'jaký uno příkaz
createUnoService("com.sun.star.frame.DispatchHelper").executeDispatch(oDoc.CurrentController.Frame, s, "", 0, args()) 'provést
End Sub
Nebo druhé makro které to dělá opačně a asi bude o něco pomalejší. Soubor se šablonou je k tomu potřeba stejný jako v předešlém případě. Makro si udělá nový soubor ze šablony a k tomu otevírací dialog pro výběr ODS souboru ve kterém máte data a ta data nakopíruje (jako prostý neformátovaný text) do nového souboru.
Sub podmineneFormatovaniZeSablonyImport 'otevře soubor ze šablony která má nastavené podmíněné formátování na dané sloupce a naimportuje do něj data z vybraného ODS souboru
const sSouborSablony="calcPodm.ots" 'jméno souboru šablony
dim args1(0) as new com.sun.star.beans.PropertyValue, args2(0) as new com.sun.star.beans.PropertyValue, oDoc as object
dim sUrl$, sSablonyUrl$, oSoubor as object, sSoubor$, p(), oList as object, oCur as object, oRozsah as object, i&, j&, i0&, j0&
rem vybrat soubor a načíst z něj data z prvního listu
args1(0).Name="Hidden" : args1(0).Value=true
sSoubor=vyberSouborODS 'vybrat ODS soubor ze kterého se budou brát data
if sSoubor="" then exit sub
oSoubor=StarDesktop.LoadComponentFromUrl(sSoubor, "_blank", 0, args1()) 'otevřít ho skrytý
oList=oSoubor.sheets(0) 'první list
oCur=oList.CreateCursor 'kurzor
oCur.goToEndOfUsedArea(false) 'kurzor na konec
i=oCur.RangeAddress.EndColumn : j=oCur.RangeAddress.EndRow 'číslo posledního využitého sloupce a posledního využitého řádku
i0=0 : j0=0 'od prvního sloupce od prvního řádku (čísla buněk: A1=0,0; A2=0,1; B1=1,0; B2=1,1 atd.)
oRozsah=oList.getCellRangeByPosition(i0, j0, i, j) 'rozsah použitých buněk
p=oRozsah.GetDataArray() 'data z buněk
oSoubor.close(true) 'zavřít soubor
rem teď dát data do souboru otevřeného ze šablony
sSablonyUrl=ConvertToUrl(CreateUnoService("com.sun.star.util.PathSettings").Template_writable) 'cesta k šablonám nastavená v Nástroje/Možnosti/LibreOffice/Cesty -> Šablony
sUrl=sSablonyUrl & "/" & sSouborSablony 'šablona
args2(0).Name="AsTemplate" : args2(0).Value=true
oDoc=StarDesktop.LoadComponentFromUrl(sURL, "_blank", 0, args2()) 'soubor otevřený dle šablony
oList=oDoc.sheets(0) 'první list
oRozsah=oList.getCellRangeByPosition(0, 0, i, j) 'rozsah použitých buněk
oRozsah.SetDataArray(p) 'nastavit data
End Sub
Function vyberSouborODS() as string 'spustí dialog pro výběr souboru a vrátí URL jméno souboru
dim oFileDlg, oFileAccess, oFiles, sFile$, sInitDir$
oFileDlg=CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
oFileDlg.AppendFilter("Calc (*.ods)", "*.ods") : oFileDlg.SetCurrentFilter("Calc (*.ods)") 'filtry na typ souborů
oFileAccess=CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
sInitDir=convertToUrl(CreateUnoService("com.sun.star.util.PathSettings").Work) 'výchozí adresář z Nástroje/Možnosti/LibreOffice/Cesty -> Dokumenty
if oFileAccess.Exists(sInitDir) then
oFileDlg.SetDisplayDirectory(sInitDir)
end if
if oFileDlg.execute() then
oFiles=oFileDlg.getFiles()
if ubound(oFiles)>=0 then
sFile=oFiles(0)
end if
end if
vyberSouborODS=sFile
End Function