WSF/OPENCALC - MACRO
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:

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