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?
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 🙁
Hallo zusammen,
nein, optinale Parameter müssen bei Reflection nicht angegeben werden, wenn man zusätzlich System.Reflection.BindingFlags.OptionalParameterBinding angibt.
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