Laden...

Excel Export nach PDF mit Late Binding TypeMissmatch Fehler

Erstellt von godlie vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.682 Views
G
godlie Themenstarter:in
39 Beiträge seit 2008
vor 13 Jahren
Excel Export nach PDF mit Late Binding TypeMissmatch Fehler

Hallo
ich knabere gerade an einer harten nuss und zwar gehts darum
mithilfe des PDF Plugins für Excel 2007 eine xlsx nach pdf zu konvertieren.

Leider scheitere ich derzeit an einem TYPE Missmatch Konflikt in der Invokemethode ExportAsFixedFileFormat


oExcel = Type.GetTypeFromProgID("Excel.Application");
            excelObject = Activator.CreateInstance(oExcel);
            try
            {
                object[] oArgs = new object[1];
                oArgs[0] = 1;
                excelObject.GetType().InvokeMember("Visible", System.Reflection.BindingFlags.SetProperty, null, excelObject, oArgs);
                Books = excelObject.GetType().InvokeMember("Workbooks", System.Reflection.BindingFlags.GetProperty, null, excelObject, null);
                
                object[] oArgs2 = new object[1];
                oArgs2[0] = FileName;
                System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
                Books.GetType().InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, Books, oArgs2);
                oArgs[0] = 1;
                Book = Books.GetType().InvokeMember("Item", System.Reflection.BindingFlags.GetProperty, null, Books, oArgs);
                Sheets = Book.GetType().InvokeMember("Worksheets", System.Reflection.BindingFlags.GetProperty, null, Book, null);
                oArgs2[0] = WorksheetName;
                Sheet = Sheets.GetType().InvokeMember("Item", System.Reflection.BindingFlags.GetProperty, null, Sheets, oArgs2);

 Parameters = new Object[1];
                Parameters[0] = saveName;
                saveName = saveName.Replace(@"\", @"\\");
                Book.GetType().InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, null, Book, Parameters);
                Object[] Paramaters2 = new Object[1];
                Paramaters2[0] = GetEnumValue("XlFixedFormatType", "xlTypePDF");
                //Paramaters2[1] = saveName;
                Book.GetType().InvokeMember("ExportAsFixedFormat", System.Reflection.BindingFlags.InvokeMethod, null, Book, Paramaters2);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(Sheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(Sheets);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(Book);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(Books);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excelObject);

                System.Threading.Thread.CurrentThread.CurrentCulture = ci;
                            
            }
            catch (System.Exception ex)
            {
                string ErrMsg = "";
                ErrMsg = String.Concat(ErrMsg, ex.Message);
                ErrMsg = String.Concat(ErrMsg, " Line: ");
                ErrMsg = String.Concat(ErrMsg, ex.Source);
                ErrMsg = String.Concat(ErrMsg, " Inner: ");
                ErrMsg = String.Concat(ErrMsg, ex.InnerException);
                ErrMsg = String.Concat(ErrMsg, " Stacktrace: ");
                ErrMsg = String.Concat(ErrMsg, ex.StackTrace);

                MessageBox.Show(ErrMsg);
            }
            finally
            {
            }

private object GetEnumValue(string enumName, string enumValName)
        {
            string aBase = oExcel.Assembly.FullName.Split(',')[0];
            Type t = oExcel.Assembly.GetType(aBase + "." + enumName);
            return t.GetField(enumValName).GetValue(oExcel);
        }

Da die Exportasfixed.... ja als 1. Parameter ein XlFixedFormatType erwartet, kann ich mir den Typemissmatch schon erklären nur die Frage ist nun wie bring ich das dem Ding bei das es sich als solches verhalten soll?

1.820 Beiträge seit 2005
vor 13 Jahren

Hallo!

Ich weis nicht, ob es wirklich daran liegt, aber laut http://msdn.microsoft.com/en-us/library/bb238907(office.12).aspx bietet die Methode noch einige optionale Parameter, welche zumindest beim Aufruf über InvokeMethod alle angegeben werden sollten. D.h. du müsstest dein Array erweitern und die nicht benötigten Felder mit Type.MissingType belegen.

Edit: Spellcheck

Nobody is perfect. I'm sad, i'm not nobody 🙁

3.728 Beiträge seit 2005
vor 13 Jahren
Optinale Paramater über Reflection

Hallo zusammen,

nein, optinale Parameter müssen bei Reflection nicht angegeben werden, wenn man zusätzlich System.Reflection.BindingFlags.OptionalParameterBinding angibt.

G
godlie Themenstarter:in
39 Beiträge seit 2008
vor 13 Jahren

Sodala
bin dahintergestiegen wies funktioniert.
Hinter dem Enum XlFixedFormatType stecken ja ganz normale Werte, welche man mit dem Objektkatalog in Excel herausfinden kann.


Object[] Paramaters2 = new Object[3];
Paramaters2[0] = 0;
Paramaters2[1] = savNamPdf;
Paramaters2[2] = 0;
Book.GetType().InvokeMember("ExportAsFixedFormat", System.Reflection.BindingFlags.InvokeMethod, null, Book, Paramaters2);
Book.GetType().InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod, null, Book, null);

Die Paramater wie folgt:
1.Paramater (xlFixedFormatType):
xlTypePDF = 0
XlTypeXPS = 1
2.Parameter (Filename):
Dateiname
3.Parameter (xlFixedFormatQuality):
xlQualityStandart = 0
xlQualityMinimum = 1

Achja noch ein Nachtrag:
Wenn man mal etwas Links ausrichten will


argums[0] = -4131;
rangeObject.GetType().InvokeMember("HorizontalAlignment", System.Reflection.BindingFlags.SetProperty, null, rng, argums);

Sodala weiter gehts vielleicht kanns ja mal wer brauchen.

grüße