1° SCRIPT: OpenCalcScript.wsf |
<package>
<job id="DoneInVBS">
<?job error="true" debug="true" ?>
<script language="VBScript">
'----------------------------------------------------------------------
' OPENCALCSCRIPT.WSF - OLE Sample WSF Script
' (c) 2009 Cormatron Ghost Ltd. All Rights Reserved.
'----------------------------------------------------------------------
Dim ObjOpenCalc
Dim objOpenDesk
Dim OpenPar(1)
Dim SavePar(1)
Const ColonnaMatricola=0
Const ColonnaCognome=1
Const ColonnaNome=2
Const ColonnaClasse=3
'// **** Lancio il Service manager, necessario per qualsiasi applicazione
OpenOffice
Set objOpenCalc = CreateObject("com.sun.star.ServiceManager")
'// **** Creazione del Desktop, assieme al create object completa la creazione
Set objOpenDesk = objOpenCalc.createInstance("com.sun.star.frame.Desktop")
'// **** Apertura del documento e aggancio sul primo foglio
odsFilename = "file:///C:/sample.ods"
'We call the MakePropertyValue function, defined just before, to access the
structure
Set OpenPar(0) = MakePropertyValue("ReadOnly", true)
Set OpenPar(1) = MakePropertyValue("Hidden", true)
Set odsDoc = objOpenDesk.LoadComponentFromURL(odsFilename, "_blank", 0, OpenPar)
set objOdsWorksheet = odsDoc.GetSheets.GetByIndex(0)
riga= 1
WScript.Echo CompletaConSpazi("Matr.",4,"destra"), _
CompletaConSpazi("Cognome",10,"sinistra"), _
CompletaConSpazi("Nome" ,10,"sinistra"), _
CompletaConSpazi("Classe",10,"sinistra")
WScript.Echo string(34,"-")
Do While (objOdsWorksheet.getCellByPosition(ColonnaMatricola, riga).string <>
"")
WScript.Echo CompletaConSpazi(objOdsWorksheet.getCellByPosition(ColonnaMatricola,
riga).string,4,"destra"), _
CompletaConSpazi(objOdsWorksheet.getCellByPosition(ColonnaCognome, riga).string,10,"sinistra"),
_
CompletaConSpazi(objOdsWorksheet.getCellByPosition(ColonnaNome, riga).string
,10,"sinistra"), _
CompletaConSpazi(objOdsWorksheet.getCellByPosition(ColonnaClasse, riga).string,10,"sinistra")
riga = riga + 1
Loop
WScript.Echo string(34,"-")
odsDoc.Close (True)
Set odsDoc = Nothing
Public Function MakePropertyValue(cName, uValue)
Dim oStruct, oServiceManager
Set oServiceManager = CreateObject("com.sun.star.ServiceManager")
Set oStruct = oServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
oStruct.Name = cName
oStruct.Value = uValue
Set MakePropertyValue = oStruct
End Function
Function CompletaConSpazi(s,n, direzione)
s=cstr(s)
sp=n-len(s)
if sp>0 then
if direzione="sinistra" then
CompletaConSpazi = s & space(sp)
else
CompletaConSpazi = space(sp) &
s
end if
else
CompletaConSpazi = left(s,n)
end if
End Function
Function ConvertToUrl(strFile)
strFile = Replace(strFile, "\", "/")
strFile = Replace(strFile, ":", "|")
strFile = Replace(strFile, " ", "%20")
strFile = "file:///" + strFile
ConvertToUrl = strFile
End Function
</script>
</job>
</package>
ESEMPIO ESECUZIONE |
Il file di esempio di OpenCalc contiene il seguente foglio:
L'esecuzione dello script crea il seguente output:
2° SCRIPT: Ole_CalcScript.wsf |
<package> <job id="DoneInVBS"> <?job error="true" debug="true" ?> <script language="VBScript"> '---------------------------------------------------------------------- ' OLE_OPENCALC.WSF - OLE Sample WSF Script ' (c) 2009 Cormatron Ghost Ltd. All Rights Reserved. '---------------------------------------------------------------------- ' -------------------------------------------------------- ' LETTURA DEGLI ARGOMENTI ' -------------------------------------------------------- Dim OpenCalcHidden if (IsProcessRunning("soffice.bin")) then wScript.Echo "Open Office Attivo! Chiudere il processo associato a soffice.bin" wscript.Quit end if If Wscript.Arguments.Count = 0 Then OpenCalcHidden=True else OpenCalcHidden=(Ucase(Wscript.Arguments(0)) <> "/VISIBILE") end if Set fso = CreateObject("Scripting.FileSystemObject") ' -------------------------------------------------------- ' DICHIARAZIONI PER OPENCALC ' -------------------------------------------------------- Dim ObjOpenCalc Dim objOpenDesk Dim OpenPar(1) Dim ExportPar(0) Dim NoArg() Const ColonnaMatricola=0 Const ColonnaCognome=1 Const ColonnaNome=2 Const ColonnaClasse=3 odsFilename = ConvertToUrl("C:\sample.ods") ' trasformato in "file:///C|/sample.ods" xlsFilename = ConvertToUrl("C:\export.xls") ' trasformato in "file:///C|/export.xls" Set ExportPar(0) = MakePropertyValue("FilterName", "MS Excel 97") ' -------------------------------------------------------- ' APERTURA FILE DI OPENCALC ' -------------------------------------------------------- '// **** Lancio il Service manager, necessario per qualsiasi applicazione OpenOffice Set objOpenCalc = CreateObject("com.sun.star.ServiceManager") '// **** Creazione del Desktop, assieme al create object completa la creazione Set objOpenDesk = objOpenCalc.createInstance("com.sun.star.frame.Desktop") '// **** Apertura del documento e aggancio sul primo foglio Set OpenPar(0) = MakePropertyValue("ReadOnly", false) Set OpenPar(1) = MakePropertyValue("Hidden", OpenCalcHidden) Set odsDoc = objOpenDesk.LoadComponentFromURL(odsFilename, "_blank", 0, OpenPar) set objOdsWorksheet = odsDoc.GetSheets.GetByIndex(0) 'HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ' Per Creare un documento vuoto di Open Office utilizzare queste sigle: ' * private:factory/sdraw ' * private:factory/swriter ' * private:factory/scalc ' * private:factory/simpress' ' Esempio: ' Set odsDoc = objOpenDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, aNoArgs()) 'HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH Do ' -------------------------------------------------------- ' GESTIONE MENU ' -------------------------------------------------------- WScript.Echo "----------- Menu Programma -------------" WScript.Echo "1 - Aggiungi Nuovo Studente (in sCalc)" WScript.Echo "2 - Ricerca Matricola in Elenco (in sCalc)" WScript.Echo "3 - Stampa Elenco Studenti (in sCalc)" if OpenCalcHidden then WScript.Echo "V - Visualizza OpenCalc" else WScript.Echo "N - Nascondi OpenCalc" end if WScript.Echo "E - Esporta in EXCEL" WScript.Echo "B - Backup del file di OpenCalc" WScript.Echo "S - Salva il file di OpenCalc" WScript.Echo "X - Quit" WScript.Echo "----------------------------------------" WScript.stdout.write "scelta --> " strOption = WScript.StdIn.ReadLine Select Case UCase(strOption) Case "1" ' -------------------------------------------------------- ' AGGIUNTA NUOVO STUDENTE ' -------------------------------------------------------- '// **** Richiesta Dati N=PrimaRigaDisponiBile(objOdsWorksheet) WScript.StdOut.WriteLine "Matricola: " & N WScript.StdOut.Write "Cognome Studente: " Cognome = WScript.StdIn.ReadLine WScript.StdOut.Write "Nome Studente: " Nome = WScript.StdIn.ReadLine WScript.StdOut.Write "Classe Studente: " Classe = WScript.StdIn.ReadLine '// **** Richiesta conferma sui dati Do WScript.stdout.write "Confermi la registrazione ? (S/N) --> " strOption = Ucase(WScript.StdIn.ReadLine) Loop Until ( (strOption="S") OR (strOption="N") ) if (strOption="S") then '// **** Scrittura dei dati sul foglio ' Uso modi differenti solo a fini didattici Call objOdsWorksheet.getCellByPosition(ColonnaMatricola, N).SetValue(N) Call objOdsWorksheet.getCellByPosition(ColonnaCognome, N).SetFormula(Cognome) objOdsWorksheet.getCellByPosition(ColonnaNome, N).string = Nome objOdsWorksheet.getCellByPosition(ColonnaClasse, N).string = Classe '// **** Formato del testo e del Paragrafo objOdsWorksheet.getCellRangeByName("A" & (N+1) & ":D" & (N+1)).CharHeight = 8 objOdsWorksheet.getCellRangeByName("A" & (N+1) & ":D" & (N+1)).CharFontName = "Courier New" objOdsWorksheet.getCellRangeByName("A" & (N+1) & ":D" & (N+1)).ParaAdjust = 3 ' (1=Destra, 2=Sinistra, 3=Centrato) objOdsWorksheet.getCellByPosition(ColonnaMatricola, N).CharWeight = 150 objOdsWorksheet.getCellByPosition(ColonnaMatricola, N).CharColor = RGB(0, 0, 255) ' BGR '// **** Bordi Set Bordo= objOpenCalc.Bridge_GetStruct("com.sun.star.table.BorderLine") Bordo.Color = RGB(204, 204, 204) Bordo.OuterLineWidth = 35 Bordo.InnerLineWidth = 0 set objOdsWorksheet.getCellRangeByName("A" & (N+1) & ":D" & (N+1)).RightBorder = Bordo set objOdsWorksheet.getCellRangeByName("A" & (N+1) & ":D" & (N+1)).BottomBorder = Bordo set objOdsWorksheet.getCellRangeByName("A" & (N+1) & ":D" & (N+1)).LeftBorder = Bordo set objOdsWorksheet.getCellRangeByName("A" & (N+1) & ":D" & (N+1)).TopBorder = Bordo '// **** Altezza Righe Set oRow = objOdsWorksheet.GetRows().getByIndex(N) oRow.height = 450 ' 0,45cm End if Case "2" ' -------------------------------------------------------- ' RICERCA MATRICOLA STUDENTE ' -------------------------------------------------------- WScript.StdOut.Write "Matricola da controllare: " Matricola = WScript.StdIn.ReadLine riga= 1 Trovato=false Do While (objOdsWorksheet.getCellByPosition(ColonnaMatricola, riga).string <> "") if (objOdsWorksheet.getCellByPosition(ColonnaMatricola, riga).string=Matricola) then Call StampaSchedaStudente(Riga, objOdsWorksheet) Trovato=True Exit Do end if riga = riga + 1 Loop If Not Trovato then WScript.Echo "Matricola " & Matricola & " non trovata!" end if Case "3" ' -------------------------------------------------------- ' STAMPA ELENCO STUDENTI ' -------------------------------------------------------- riga= 1 StampaIntestazioni Do While (objOdsWorksheet.getCellByPosition(ColonnaMatricola, riga).string <> "") Call StampaRigaStudente(Riga, objOdsWorksheet) riga = riga + 1 Loop WScript.Echo string(34,"-") & chr(10) & Chr(13) Case "V" ' -------------------------------------------------------- ' RENDE VISIBILE OPENCALC ' -------------------------------------------------------- odsDoc.getCurrentController.getFrame.getContainerWindow.setVisible (True) OpenCalcHidden=False Case "N" ' -------------------------------------------------------- ' NASCONDE OPENCALC ' -------------------------------------------------------- odsDoc.getCurrentController.getFrame.getContainerWindow.setVisible (False) OpenCalcHidden=True Case "E" ' -------------------------------------------------------- ' EXPORT IN EXCEL DEL FILE DI OPENCALC ' -------------------------------------------------------- Call odsDoc.storeToURL(xlsFilename , ExportPar) WScript.Echo "export in excel completato" Case "S" ' -------------------------------------------------------- ' SALVA OPENCALC ' -------------------------------------------------------- '// **** Il metodo Store non è applicabile a documenti nuovi privi di nome Call odsDoc.store() WScript.Echo "File ODS aggiornato!" Case "B" ' -------------------------------------------------------- ' BACKUP DEL FILE SAMPLE.ODS ' -------------------------------------------------------- If CreaDirectory("C:\BACKUP",Fso) then odsbckFilename=ConvertToUrl("C:\BACKUP\Bck_" & GeneraEstensioneBckFile() & ".ods") Call odsDoc.storeToURL(odsbckFilename , NoArg) WScript.Echo "Backup effettuato: " & odsbckFilename Call ApriFinestraFileSystem("C:\BACKUP") End If Case "X" ' -------------------------------------------------------- ' USCITA DAL BATCH WSH ' -------------------------------------------------------- odsDoc.Close (True) Set odsDoc = Nothing WScript.Quit -1 Case Else WScript.Echo "Scelta non valida - ripeti" End Select Loop Until False ' ------------------------------------------------------------- ' PROCEDURE DI OUTPUT ' ------------------------------------------------------------- Public Function PrimaRigaDisponibile(SCalcSheet) riga= 1 Do While (SCalcSheet.getCellByPosition(ColonnaMatricola, riga).string <> "") riga = riga + 1 Loop PrimaRigaDisponibile=riga End Function Public Function StampaSchedaStudente(N, SCalcSheet) WScript.Echo chr(10) & Chr(13) & string(34,"-") WScript.Echo "SCHEDA STUDENTE" WScript.Echo string(34,"-") WScript.StdOut.WriteLine "Matricola: " & SCalcSheet.getCellByPosition(ColonnaMatricola, N).string WScript.StdOut.WriteLine "Cognome : " & SCalcSheet.getCellByPosition(ColonnaCognome, N).string WScript.StdOut.WriteLine "Nome : " & SCalcSheet.getCellByPosition(ColonnaNome, N).string WScript.StdOut.WriteLine "Classe : " & SCalcSheet.getCellByPosition(ColonnaClasse, N).string WScript.Echo string(34,"-") & chr(10) & Chr(13) End Function Public Function StampaIntestazioni() WScript.Echo chr(10) & Chr(13) & string(34,"-") WScript.Echo "ELENCO STUDENTI" WScript.Echo string(34,"-") WScript.Echo CompletaConSpazi("Matr.",4,"destra"), _ CompletaConSpazi("Cognome",10,"sinistra"), _ CompletaConSpazi("Nome" ,10,"sinistra"), _ CompletaConSpazi("Classe",10,"sinistra") WScript.Echo string(34,"-") End Function Public Function StampaRigaStudente(Riga, SCalcSheet) WScript.Echo CompletaConSpazi(SCalcSheet.getCellByPosition(ColonnaMatricola, riga).string,4,"destra"), _ CompletaConSpazi(SCalcSheet.getCellByPosition(ColonnaCognome, riga).string,10,"sinistra"), _ CompletaConSpazi(SCalcSheet.getCellByPosition(ColonnaNome, riga).string ,10,"sinistra"), _ CompletaConSpazi(SCalcSheet.getCellByPosition(ColonnaClasse, riga).string,10,"sinistra") End Function Function CompletaConSpazi(s,n, direzione) s=cstr(s) sp=n-len(s) if sp>0 then if direzione="sinistra" then CompletaConSpazi = s & space(sp) else CompletaConSpazi = space(sp) & s end if else CompletaConSpazi = left(s,n) end if End Function ' ------------------------------------------------------------- ' PROCEDURE GENERALI USABILI IN WSF ' ------------------------------------------------------------- Function IsProcessRunning( strProcess ) Dim Process, strObject IsProcessRunning = False strObject = "winmgmts://localhost" ' In alternativa: For Each obj In GetObject("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE Name='soffice.bin'") For Each Process in GetObject( strObject ).InstancesOf("win32_process" ) If UCase( Process.name ) = UCase( strProcess ) Then IsProcessRunning = True Exit Function End If Next End Function Function CreaDirectory(NomeFolder, fso) On Error resume next If Not fso.FolderExists(NomeFolder) Then fso.CreateFolder(NomeFolder) If Not fso.FolderExists(NomeFolder) Then WScript.echo "Errore! La cartella " +NomeFolder + " non è stata creata. Backup annullato" CreaDirectory=false Exit Function end if End If CreaDirectory=true End function Function ApriFinestraFileSystem(Cartella) Set CrlScrn = WScript.CreateObject("WScript.Shell") CrlScrn.Run Cartella Set CrlScrn = Nothing End Function Function GeneraEstensioneBckFile() Dim tmp Dim Ora tmp=FormatDateTime(Now,2) tmp=right(tmp,4)+mid(tmp,4,2)+Left(tmp,2) Ora=FormatDateTime(Now,3) if Len(Ora)<>8 then Ora="0"+Ora end if GeneraEstensioneBckFile=tmp+Left(ora,2)+Mid(Ora,4,2)+Right(Ora,2) end Function ' ------------------------------------------------------------- ' PROCEDURE GENERALI USABILI CON OPEN OFFICE ' ------------------------------------------------------------- Public Function MakePropertyValue(cName, uValue) Dim oStruct, oServiceManager Set oServiceManager = CreateObject("com.sun.star.ServiceManager") Set oStruct = oServiceManager.Bridge_GetStruct("com.sun.star.beans.PropertyValue") oStruct.Name = cName oStruct.Value = uValue Set MakePropertyValue = oStruct End Function Function ConvertToUrl(strFile) strFile = Replace(strFile, "\", "/") strFile = Replace(strFile, ":", "|") strFile = Replace(strFile, " ", "%20") strFile = "file:///" + strFile ConvertToUrl = strFile End Function </script> </job> </package>
ESEMPIO ESECUZIONE |
Il secondo esempio mostra l'utilizzo dei metodi relativi
all'input/output tipici dei files WSF che sono raffigurati nel sottostante
schema:
Il file di esempio di OpenCalc contiene lo stesso foglio dell'esempio
precedente:
Eseguendo lo script OLE_OpenCalc.wsf appare il menu testuale in figura:
Nelle immagini seguenti è mostrato il risultato delle singole voci del menu
Menu 1 - Aggiungi
nuovo studente:
Consente di aggiungere un nuovo
nominativo nell'elenco gestito con il foglio di OpenCalc.
Menu 2 - Ricerca
Matricola in Elenco:
Consente di ricercare uno
studente in elenco tramite la sua matricola.
Menu 3 - Stampa Elenco Studenti:
Stampo in una finestra DOS l'elenco completo degli studenti presenti sul foglio "Studenti" di
Sample.ods
Menu V - Visualizza OpenCalc
Menu N - Nascondi OpenCalc:
Consente di visualizzare
l'oggetto OLE oppure di nasconderlo
Menu B -
Backup del file di OpenCalc:
Crea nella cartella C:\Backup
una copia di backup del file sample.ods (nominando il file prodotto in
questo modo: bck_AAAAMMGGHHNNSS.ods dove AAAA è l'anno, MM
il nr mese, GG il giorno del mese HH l'ora, NN i Minuti e
SS i secondi) e visualizza la cartella in una finestra di explorer.
Menu S - Salva il file di
OpenCalc:
Registra su disco le
modifiche apportate al file sample.ods