Toon posts:

[.NET] Ik wordt gek van die objecten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi!,

Ik probeer met C# .NET momenteel wat met Excel Automation te doen. Ik voeg leuk een Microsoft Excel 9.0 referentie toe, pak een nieuw Application object, en wil bijvoorbeeld een excel spreadsheet openen:

code:
1
2
Excel.ApplicationClass MyExcel = new Excel.ApplicationClass();
MyExcel.Workbooks.Open(AAAAARGH)


Goed, waar nu AARGH staat is mijn probleem. Dat open geval vraagt allemaal objecten, bijvoorbeeld object UpdateLinks, object Origin, object Converter, etc .

Nou zoek ik me rot om uit te vinden wat ie nou eigenlijk voor een objecten van mij verwacht, omdat ik ze dus allemaal op moet geven. Van die grap wordt ik dus niet vrolijk.

Het is niet alleen met Excel zo, maar met al die COM- wrappers die .NET leuk voor me aanmaakt. Je ( tenminste ik ) hebt geen idee meer wat voor een parameters je aan de methods door dient te geven.

Heeft iemand al een makkelijke oplossing voor dit probleem gevonden?

Verwijderd

Dit is inderdaad nogal irritant aan dat COM geneuzel. Vrijwel alles wordt naar object vertaald, en optionele parameters worden niet echt ondersteund...
Meestal kan je .NET wel 'foppen' door iets te doen als:
object niks = null;
Excel.Wb.Open(val niks);
Ofzoiets... dan moet je ff in de documentatie kijken welke parameters je echt moet setten, en anders geef je gewoon allemaal 'niksen' mee. De zelfde truck gaat op voor int's:
object nul = 0;
beetje irritant, maar het werkt wel :).

Verwijderd

Topicstarter
Verwijderd schreef op 02 maart 2003 @ 14:22:
Dit is inderdaad nogal irritant aan dat COM geneuzel. Vrijwel alles wordt naar object vertaald, en optionele parameters worden niet echt ondersteund...
Meestal kan je .NET wel 'foppen' door iets te doen als:
object niks = null;
Excel.Wb.Open(val niks);
Ofzoiets... dan moet je ff in de documentatie kijken welke parameters je echt moet setten, en anders geef je gewoon allemaal 'niksen' mee. De zelfde truck gaat op voor int's:
object nul = 0;
beetje irritant, maar het werkt wel :).
Bedankt voor je reactie! Ik ben blij dat ik dus niet de enige ben die hiermee aan het :X en is. Die truuk van empty variabele meegeven is inderdaad wel redelijk, maar het blijft een zoektocht. Toch wel wat minder aan het .NET COM verhaal.

  • EfBe
  • Registratie: Januari 2000
  • Niet online
Veelal zijn dat objects die je verkrijgt door andere calls naar de API's. Ik heb zo de docs niet bij de hand, maar het zal me niets verbazen als de documentatie van de method die je aanhaalt ook links heeft naar de beschrijving van bv UpdateLinks, of iig wat daarmee bedoeld wordt. Maar echt duidelijk is het niet, zeker de Office applicaties zijn erg ontoegankelijk.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Voorbeeld van hoe slecht het in .NET werkt, of hoe weinig ik er nog maar van af weet:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
    public class ExcelToHTML
    {
        public ExcelToHTML(string ExcelFile , string HTMLFile )
        {
            Excel.ApplicationClass MyExcel = new Excel.ApplicationClass();
            Excel.Workbook MyWorkBook;

            MyWorkBook = MyExcel.Workbooks.Open(
                ExcelFile,
                0,
                false,
                5,
                "",
                "",
                true,
                Excel.XlPlatform.xlWindows,
                "",
                false,
                true,
                0,
                false);

            MyWorkBook.SaveAs( HTMLFile,  
                Excel.XlHtmlType.xlHtmlStatic, 
                "", 
                "" , 
                false, 
                false, 
                Excel.XlSaveAsAccessMode.xlNoChange , 
                Excel.XlSaveConflictResolution.xlLocalSessionChanges, 
                false,
                false,
                false);
            
            MyWorkBook.Close( false, "", false);

            MyExcel.Quit();

        }
    }
}


Dit ZOU na mijn mening een EXCEL sheet moeten opslaan als HTML pagina. Het openen gaat nu wel goed, maar bij het opslaan waarbij ik de parameters helemaal uit de MSDN heb gehaald geeft ie de volgende melding:

code:
1
2
3
An unhandled exception of type 'System.Runtime.InteropServices.COMException' occurred in ConvertExcelToHTML.exe

Additional information: Exception from HRESULT: 0x800A03EC.


Nou is het op deze manier voor mij toch echt niet meer leuk om in .NET aan office automation te doen. Van mij mogen ze het houden. De oplossing die ik nu heb bedacht is in VB6 een DLL maken die het wel kan, en die dan gebruiken in mijn .NET applicatie. Wel erg deprimerend.

Verwijderd

Heb je een volledige stacktrace?

Verwijderd

Topicstarter
JOEPIE,

Ik heb eindelijk wat gevonden. Je hoeft niet verplicht alle objecten mee te geven. Met het fantastische System.Reflection.Missing.Value kan je gewoon "lege" parameters meegeven. Hier even een voorbeeldje van C# Corner:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private void button1_Click(object sender, System.EventArgs e)
{ 
// Use the open file dialog to choose a word document
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{ 
// set the file name from the open file dialog
object fileName = openFileDialog1.FileName;
object readOnly = false; 
object isVisible = true; 

// Here is the way to handle parameters you don't care about in .NET
object missing = System.Reflection.Missing.Value; 

// Make word visible, so you can see what's happening 
WordApp.Visible = true; 
// Open the document that was chosen by the dialog
Word.Document aDoc = WordApp.Documents.Open(ref fileName, ref missing,ref readOnly, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref isVisible);

// Activate the document so it shows up in front 
aDoc.Activate(); 
// Add the copyright text and a line break
WordApp.Selection.TypeText("Copyright C# Corner");
WordApp.Selection.TypeParagraph();
} 
}


Ben ik toch weer helemaal :) met .NET!

  • EfBe
  • Registratie: Januari 2000
  • Niet online
oh darn, dat had ik geweten voor je, ik dacht dat je dat niet zocht...

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • whoami
  • Registratie: December 2000
  • Laatst online: 23-08 23:02
Hmm, dat wist ik niet. Dat is wel cool.

Maar wat gebeurt er eigenlijk als je ipv die 'missing value', null doorgeeft aan die functie?

[ Voor 55% gewijzigd door whoami op 04-03-2003 08:02 ]

https://fgheysels.github.io/


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
jesus een hele wordperfect in 15 lines :)...

Verwijderd

Topicstarter
whoami schreef op 03 March 2003 @ 21:44:
Hmm, dat wist ik niet. Dat is wel cool.

Maar wat gebeurt er eigenlijk als je ipv die 'missing value', null doorgeeft aan die functie?
Dat pikt ie niet. De System.Reflection.Missing value is volgens mij te vergelijken met wat varianten als waarde konden hebben in VB. Dit kon je daar dan ook met de functie IsMissing weer uitvragen.

Je kon in VB ( na mijn weten ) alleen nooit zelf zo'n waarde toekennen ( okee, een ongedefineerde variant dan... ). In .NET is dit nu dus mooi object georienteerd. De NULL is toch weer wat anders. Daar klapt ie echt op.

Verwijderd

Topicstarter
EfBe schreef op 03 maart 2003 @ 20:58:
oh darn, dat had ik geweten voor je, ik dacht dat je dat niet zocht...
Ik zocht ook eigenlijk een manier om makkelijker met de COM structuur om te gaan in .NET. Nu ik met de missing gewoon vrijwel geen van de parameters verplicht hoef op te geven kom ik er wel weer uit.
Pagina: 1