تحميل مستند على OpenOffice باستخدام برنامج Python خارجي

StackOverflow https://stackoverflow.com/questions/2153843

  •  23-09-2019
  •  | 
  •  

سؤال

أحاول إنشاء برنامج Python (باستخدام Pyuno) لإجراء بعض التغييرات على ورقة حساب OpenOffice.

لقد أطلقت مسبقًا OpenOffice على وضع "قبول" لتتمكن من الاتصال من برنامج خارجي. على ما يبدو ، يجب أن تكون سهلة مثل:

import uno
# get the uno component context from the PyUNO runtime
localContext = uno.getComponentContext()

# create the UnoUrlResolver
resolver = localContext.ServiceManager.createInstanceWithContext(
                            "com.sun.star.bridge.UnoUrlResolver", localContext)

# connect to the running office
ctx = resolver.resolve("uno:socket,host=localhost,port=2002;"
                       "urp;StarOffice.ComponentContext")
smgr = ctx.ServiceManager

# get the central desktop object
DESKTOP =smgr.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)

#The calling it's not exactly this way, just to simplify the code
DESKTOP.loadComponentFromURL('file.ods') 

لكني أحصل على AttributeError عندما أحاول الوصول loadComponentFromURL. إذا قمت بعمل ملف dir(DESKTOP), ، لقد رأيت فقط السمات/الطرق التالية:

['ActiveFrame', 'DispatchRecorderSupplier', 'ImplementationId', 'ImplementationName',
'IsPlugged', 'PropertySetInfo', 'SupportedServiceNames', 'SuspendQuickstartVeto', 
'Title', 'Types', 'addEventListener', 'addPropertyChangeListener', 
'addVetoableChangeListener', 'dispose', 'disposing', 'getImplementationId', 
'getImplementationName', 'getPropertySetInfo', 'getPropertyValue', 
'getSupportedServiceNames', 'getTypes', 'handle', 'queryInterface', 
'removeEventListener', 'removePropertyChangeListener', 'removeVetoableChangeListener', 
'setPropertyValue', 'supportsService']

لقد قرأت أن هناك خطأ يفعل نفس الشيء ، ولكن على OpenOffice 3.0 (أنا أستخدم OpenOffice 3.1 على Red Hat5.3). لقد حاولت استخدام الحل البديل المعلن هنا, ، لكن يبدو أنهم لا يعملون.

أيه أفكار؟

هل كانت مفيدة؟

نصائح أخرى

لقد مر وقت طويل منذ أن فعلت أي شيء مع Pyuno ، لكن النظر إلى الكود الذي عمل في المرة الأخيرة التي قمت فيها بتشغيله في عام 2006 ، قمت بالتحميل على هذا النحو:

def urlify(path):
     return uno.systemPathToFileUrl(os.path.realpath(path))

desktop.loadComponentFromURL(
        urlify(tempfilename), "_blank", 0, ())

مثالك هو إصدار مبسط ، ولست متأكدًا مما إذا كنت قد قمت بإزالة الوسائط الإضافية عن قصد أو غير عمد.

إذا لم يكن LoadComponentFromurl موجودًا ، فقد تغيرت واجهة برمجة التطبيقات أو هناك شيء آخر خاطئ ، لقد قرأت من خلال الكود الخاص بك ويبدو أنك تفعل كل الأشياء التي لدي.

لا أعتقد أن dir () للطرق الموجودة على كائن سطح المكتب ستكون مفيدة ، حيث أعتقد أن هناك أ __getattr__ الطريقة التي يتم استخدامها للوكالة من خلال الطلبات ، وجميع الأساليب التي قمت طباعتها هي طرق الأداة المساعدة المستخدمة للكائن الاحتياطي ل com.sun.star.frame.Desktop.

أعتقد أنه ربما يكون الفشل أنه لا توجد طريقة تسمى LoadComponentFromurl التي لديها وسيطة واحدة بالضبط. ربما يؤدي إعطاء إصدار الوسيطة الأربعة إلى العثور على الطريقة التي يتم العثور عليها واستخدامها. يمكن أن يكون هذا ببساطة عدم تطابق معاوقة بين Python و Java ، حيث لدى Java طريقة توقيع المكالمات الزائدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top