freshman2017
Goto Top

OpenOffice-LibreOffice Tabellenblatt umbenennen (Batch?)

Guten Tag,

ich stehe gerade vor einem Sachverhalt, bei dem ich einmal Eure Hilfe benötige.
Ich habe eine Open-Office - Liste mit nur einem Tabellen-Blatt (Sheet 1) - ich würde gerne über eine Batch das Tabellen-Blatt in Standard umbenennen. Ist das möglich?
Ich freue mich auf eine Rückmeldung.

Content-ID: 2371027184

Url: https://administrator.de/contentid/2371027184

Ausgedruckt am: 24.11.2024 um 15:11 Uhr

rubberman
rubberman 01.04.2022 um 16:44:27 Uhr
Goto Top
Ich habe eine Open-Office - Liste mit nur einem Tabellen-Blatt (Sheet 1)
Dort war es noch Libre Office und eine .xls Datei.
Über was reden wir nun genau?

ich würde gerne über eine Batch das Tabellen-Blatt in Standard umbenennen. Ist das möglich?
Nein mit Batch ist so etwas nicht möglich. Libre-/OpenOffice lassen sich nur sehr umständlich automatisieren. Hier, um mal eine "Idee" davon zu bekommen, ein Beispiel mit VBScript.

Ich hab aktuell aber weder Libre- noch OpenOffice um irgendetwas testen zu können.

Steffen
1915348599
1915348599 01.04.2022 aktualisiert um 18:25:37 Uhr
Goto Top
Mal mit VBS geschrieben, tut hier im Test das was es soll
dim args(), objServiceManager, objDesktop, doc, file
file = "file:///c:/users/maxmuster/desktop/test.ods"  
Set objServiceManager = CreateObject("com.sun.star.ServiceManager")  
Set objDesktop = objServiceManager.createInstance("com.sun.star.frame.Desktop")  
Set doc = objDesktop.loadComponentFromURL(pfad, "_blank", 0, args)  
doc.sheets.getByIndex(0).Name = "Standard"  
doc.storeAsURL pfad,Array()
doc.close true
rubberman
rubberman 01.04.2022 um 21:46:06 Uhr
Goto Top
@1915348599
Aus meiner Erinnerung heraus, hinterlässt das so zumindest einen Geisterprozess, oder? (soffice.exe und/oder soffice.bin)
Ich vermute mindestens ein objDesktop.Terminate() fehlt am Ende.

Steffen
1915348599
1915348599 02.04.2022 aktualisiert um 07:38:49 Uhr
Goto Top
Hab ich jetzt nicht geprüft, mache das zum ersten mal mit OpenOffice. Kann also gut sein, muss der TO dann halt mal selbst ausprobieren.
Die Doku ist ja ehrlich gesagt ein Graus im Vergleich zu Office da sucht man sich oft nen Wolf ...
rubberman
rubberman 02.04.2022 um 12:15:32 Uhr
Goto Top
Die Doku ist ja ehrlich gesagt ein Graus im Vergleich zu Office da sucht man sich oft nen Wolf ...
Ich weiß. Und wenn man dann noch mit Windows Pfadangaben statt File URLs arbeiten will, muss man selbst was zusammenbauen, wobei OO/LO auch nur ein spezifisches URL Encoding versteht. Und wer so eine Automation wirklich sicher im Hintergrund ausführen will, muss noch mal 50 Zeilen Workaround basteln. Aber das hatte ich ja verlinkt ...

Steffen
rubberman
Lösung rubberman 03.04.2022 aktualisiert um 14:20:13 Uhr
Goto Top
Ich hab die Kiste mit meinem LibreOffice mal angeworfen und kurz ein paar unterschiedliche Scripte geschrieben. Voraussetzung für Automation ist, dass bei der Installation von Open-/LibreOffice die ActiveX Komponenten mit installiert wurden.

  • Batch mit eingebettetem JScript:
*.bat
@if (0)==(0) echo off
:: ^^^^ Batch/JScript Hybridzeile, muss immer die erste Zeile im Script sein


:: Codepage updaten, damit wenigstens Umlaute unterstützt werden.
>nul chcp 1252

:: Macrodefinition, verbessert später etwas die Lesbarkeit.
set ^"rename_sheet=cscript //nologo //e:jscript "%~fs0" ^"  

:: Aufruf des JScript Codes. Es werden 3 Argumente übergeben:
::
::                Arbeits-  |    Dateiname oder     |  neuer Name
::              verzeichnis | relativer / absoluter |  der ersten
::                          |         Pfad          |   Tabelle
::
%rename_sheet%     "%cd%"          "test.ods"          "Standard"  

pause


:: die nachfolgenden Zeilen müssen immer am Ende des gesamten Scripts stehen
goto :eof @end
new ActiveXObject('WScript.Shell').CurrentDirectory = WScript.Arguments(0);  
var objSrvMgr = new ActiveXObject('com.sun.star.ServiceManager'),  
    objDesktop = objSrvMgr.createInstance('com.sun.star.frame.Desktop');  
try {
  var objTransl = objSrvMgr.createInstance('com.sun.star.uri.ExternalUriReferenceTranslator'),  
      props  = [objSrvMgr.Bridge_GetStruct('com.sun.star.beans.PropertyValue')],  
      url = new ActiveXObject('Scripting.FileSystemObject').GetAbsolutePathName(WScript.Arguments(1)).replace(/\\/g, '/');  
  url = objTransl.translateToInternal((url.substr(0, 2) == '//' ? 'file:' : 'file:///') + url);  
  props.Name = 'Hidden';  
  props.Value = true;
  var objDoc = objDesktop.loadComponentFromURL(url, '_blank', 0, props);  
  try {
    objDoc.sheets.getByIndex(0).Name = WScript.Arguments(2);
    objDoc.storeAsURL(url, new Array());
  } catch(e) {
    WScript.Echo('failed to update the document');  
  }
  objDoc.close(true);
} catch(e) {
  WScript.Echo('failed to open the document');  
}
objDesktop.terminate();

  • JScript
*.js
var file = 'test.ods',  
    sheetName = 'Standard';  

var objSrvMgr = new ActiveXObject('com.sun.star.ServiceManager'),  
    objDesktop = objSrvMgr.createInstance('com.sun.star.frame.Desktop');  
try {
  var objTransl = objSrvMgr.createInstance('com.sun.star.uri.ExternalUriReferenceTranslator'),  
      props  = [objSrvMgr.Bridge_GetStruct('com.sun.star.beans.PropertyValue')],  
      url = new ActiveXObject('Scripting.FileSystemObject').GetAbsolutePathName(file).replace(/\\/g, '/');  
  url = objTransl.translateToInternal((url.substr(0, 2) == '//' ? 'file:' : 'file:///') + url);  
  props.Name = 'Hidden';  
  props.Value = true;
  var objDoc = objDesktop.loadComponentFromURL(url, '_blank', 0, props);  
  try {
    objDoc.sheets.getByIndex(0).Name = sheetName;
    objDoc.storeAsURL(url, new Array());
  } catch(e) {
    WScript.Echo('failed to update the document');  
  }
  objDoc.close(true);
} catch(e) {
  WScript.Echo('failed to open the document');  
}
objDesktop.terminate();

  • VBScript
*.vbs
Option Explicit
Const file = "test.ods"  
Const sheetName = "Standard"  

Dim objSrvMgr, objDesktop, objDoc, objTransl, url, props(1)
Set objSrvMgr = CreateObject("com.sun.star.ServiceManager")  
Set objDesktop = objSrvMgr.createInstance("com.sun.star.frame.Desktop")  
Set objDoc = Nothing
Err.Clear
On Error Resume Next
  Set objTransl = objSrvMgr.createInstance("com.sun.star.uri.ExternalUriReferenceTranslator")  
  url = Replace(CreateObject("Scripting.FileSystemObject").GetAbsolutePathName(file), "\", "/")  
  IF Left(url, 2) = "//" Then : url = "file:" & url : Else : url = "file:///" & url : End If  
  url = objTransl.translateToInternal(url)
  Set props(0) = objSrvMgr.Bridge_GetStruct("com.sun.star.beans.PropertyValue")  
  props.Name = "Hidden"  
  props.Value = True
  Set objDoc = objDesktop.loadComponentFromURL(url, "_blank", 0, props)  
On Error Goto 0
If objDoc Is Nothing Then
  objDesktop.terminate
  WScript.Echo "failed to open the document"  
  WScript.Quit
End If
Err.Clear
On Error Resume Next
  objDoc.sheets.getByIndex(0).Name = sheetName
  objDoc.storeAsURL url, Array()
  If Err.Number Then
    objDoc.close True
    objDesktop.terminate
    WScript.Echo "failed to update the document"  
    WScript.Quit
  End If
  objDoc.close True
On Error Goto 0
objDesktop.terminate

  • PowerShell
*.ps1
using namespace System.Reflection
[Assembly]::LoadWithPartialName('cli_cppuhelper') | Out-Null  
[Assembly]::LoadWithPartialName('cli_oootypes') | Out-Null  
[Assembly]::LoadWithPartialName('cli_ure') | Out-Null  
[Assembly]::LoadWithPartialName('cli_uretypes') | Out-Null  

$file = 'test.ods'  
$sheetName = 'Standard'  

$objContext = [uno.util.Bootstrap]::bootstrap()
$objSrvMgr = [unoidl.com.sun.star.uno.XComponentContext].getMethod('getServiceManager').invoke($objContext, @())  
$objDesktop = [unoidl.com.sun.star.lang.XMultiComponentFactory].getMethod('createInstanceWithContext').invoke($objSrvMgr, @('com.sun.star.frame.Desktop', $objContext))  
try {
  $objTransl = [unoidl.com.sun.star.lang.XMultiComponentFactory].getMethod('createInstanceWithContext').invoke($objSrvMgr, @('com.sun.star.uri.ExternalUriReferenceTranslator', $objContext))  
  $url = Get-Item $file | select -Expand FullName | %{$_ -replace '\\', '/'}  
  $url = [unoidl.com.sun.star.uri.XExternalUriReferenceTranslator].getMethod('translateToInternal').invoke($objTransl, @($(if ($url.SubString(0, 2) -eq '//') {'file:'} else {'file:///'}) + $url))  
  $props = [unoidl.com.sun.star.beans.PropertyValue[]] @([unoidl.com.sun.star.beans.PropertyValue]::new())
  $props.Name = "Hidden"  
  $props.Value = $true
  $objDoc = [unoidl.com.sun.star.frame.XComponentLoader].getMethod('loadComponentFromURL').invoke($objDesktop, @($url, '_blank', 0, $props))  
  try {
    $objSheets = [unoidl.com.sun.star.sheet.XSpreadsheetDocument].getMethod('getSheets').invoke($objDoc, @())  
    $objSheet = [unoidl.com.sun.star.container.XIndexAccess].getMethod('getByIndex').invoke($objSheets, @(0))  
    [unoidl.com.sun.star.container.XNamed].getMethod('setName').invoke($objSheet.Value, @($sheetName))  
    [unoidl.com.sun.star.frame.XStorable].GetMethod('storeAsURL').Invoke($objDoc, @($url, [unoidl.com.sun.star.beans.PropertyValue[]] @()));  
  } catch {
    'failed to update the document'  
  }
  [unoidl.com.sun.star.util.XCloseable].GetMethod('close').Invoke($objDoc, @($true))  
} catch {
  'failed to open the document'  
}
[unoidl.com.sun.star.frame.XDesktop].GetMethod('terminate').Invoke($objDesktop, @()) | Out-Null  

Steffen