بو - التفوق الأتمتة، مشكلة اختيار النطاقات

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

  •  11-09-2019
  •  | 
  •  

سؤال

أقوم بتحقيق في بوو واعتقدت أنه سيكون تمرينا مفيدا لمحاولة تحويل زوجين من البرامج النصية VB المنجزة التي تضم Excel (2007، في هذه الحالة). يبدو أن الكثير من الأشياء تترجم بسهولة شديدة، ومع ذلك، فأنا أمتلك كمية كبيرة من المتاعب التي تختار النطاقات - كلما حاولت الحصول عليها أو ضبطها، فأنا لم يتم العثور على عضو في TargetINVocationException.

إليك مثال (خفض) لقد قمت بتشغيله في Booish:

def CreateInstance(progid):
    type = System.Type.GetTypeFromProgID(progid)    
    return type()   

xl as duck = CreateInstance("Excel.Application")
xl.Visible = true
xl.Workbooks.Add

sht as duck = xl.ActiveSheet
#Next line throws exception
rng as duck = sht.Range("A1")

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

هتافات،

ليني.

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

المحلول

النطاق هو في الواقع خاصية، وهي خاصية خاصة إلى حد ما تعمل كشركة مفهرسة، مما يعني أنه يحتوي على معلوم من الصفيف أو القاموس. في معظم اللغات، وهذا يعني أنك تستطيع الوصول إليها sht.Range["A1"]. وبعد هذا هو السكر النحوي، وحقا الوصول تماما مثل أي طريقة أخرى، وهي:

sht.get_Range("A1",System.Reflection.Missing.Method)

حاولت استخدام Boo و Ruby و Ironrouby لتكرار التعليمات البرمجية الخاصة بك، باستخدام كل من أسلوب السكر النحوي واستدعاء الطريقة الصريحة. في الحديد، يمكنني الحصول عليه للعمل بلا عيوب، ولكن فقط في مترجم 32 بت. وبعد في Ruby العادية، وهو تطبيق 32 بت على التكوين الخاص بي، فقد عملت أيضا بشكل جيد. في المترجم 64 بت، لم يتم حل العقار النطاق بشكل صحيح.

بحيث قادني إلى أن أشك في أن قذيفة بوو التفاعلية كانت تعمل في وضع 64 بت وأنه فشلت Interop بسبب ذلك. لسوء الحظ، فإن نفس القضايا المستنسخة بعد تعيين ثنائيات بوو المحلية لتشغيل وضع 32 بت باستخدام Corflags.exe، لذلك لا أعتقد أن هذه هي المشكلة الحقيقية.

ما الذي كان يعمل، على الرغم من أنه استيراد مكتبة Excel Dotnet Interop Interplicy بشكل صريح بشكل صريح، وكذلك أسماء أسماء خدمات Interop، مثل ذلك:

import Microsoft.Office.Interop.Excel
import System.Runtime.InteropServices

xl_type=typeof(Application).GetCustomAttributes(typeof(CoClassAttribute),true)[0].CoClass
xl=xl_type()
xl.Visible=true
xl.Workbooks.Add

ثم:

xl.Range["A1","A2"].Value=12
xl.Range["A1",System.Type.Missing].Value="Alpha"
(xl.ActiveSheet as Worksheet).Range["A1","A2"].Value2='Whatever'

كل هذه العمل، لكنهم يتطلبون منك أساسا التخلي عن "النصوص" الذي اعتدت عليه من الربط المتأخر (وهو ما يفعله بكتابة البط الخاصة بك).

فرق واحد من VB / VBScript صحيح بالنسبة لمعظم اللغات (بخلاف C # 4.0) هو أنه، بشكل عام، لا يتم التعامل مع المعلمات الاختيارية بشفافية، لذلك كنت بحاجة إلى إلقاء نظرة على API أكثر بعناية عند التعامل مع الأساليب التي تدعم اختياري المعلمات (استبدالها باستخدام system.type.shissing أو system.reflection ما يعادلها). تجد هذا من خلال مستندات Excel Interop، على الرغم من أنه من المحتمل أن تستخدم التفكير لتحديد المعلمات التي تحمل علامة اختيارية إذا وجدت أنه أسهل من البحث عنه.

نظرا لأن Ruby لديه حل معقول للتوجيه في وقت متأخر من هذه الكائنات، أظن أن هناك ميزة مفقودة (أو علة) في سيناريوهات Interop COM في بوو.

تم تحريره لإضافة: يكتب SAM NG عن دعم الممتلكات المفهرسة في C # 4.0; ؛ القضايا الموضحة في منصبه تنطبق على بوو، كذلك.

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