[C# / Excel] Hoe data van sheet lezen

Pagina: 1
Acties:
  • 566 views sinds 30-01-2008
  • Reageer

  • storeman
  • Registratie: April 2004
  • Laatst online: 01-12 09:22
Middag!

Ik zit me al de hele dag op het volgende probleem te verbijten. Ik vind het vreselijk frusterend en ik hoop dat jullie mij hierbij kunnen helpen.

Ik wil, zoals de titel al zegt, graag data vanaf een excel sheet in mijn C# Programma krijgen. Dat lijkt allemaal niet zo moeilijk, maar ik vind het geheel gewoon vreselijk eigenwijs.

Ik heb het eindelijk voor elkaar gekregen om Excel te starten na een hele zoektocht op GoT en google. Wat ik hier al niet snap, in veel voorbeelden wordt er gebruik gemaakt van het Excel object (of is het namespace). Ik krijg dit maar niet werkend.

Eerst voeg ik de references toe:
References: Microsoft Excel v11.0; Microsoft Office v11.0

Waarna ik aangeef wat ik wil gebruiken:
C#:
1
using Microsoft.Office.Interop.Excel;


Terwijl de meeste voorbeelden gebruik maken van dit:
C#:
1
using Excel;


Dat is al mijn eerste frustratie.

Met de bovenste namespace verwijzing krijg ik het wel voor elkaar om Excel te starten. Nu wil ik een Workbook openen. Dat is ook wel gelukt, maar het frustrerende is het aantal argumenten dat je mee moet geven en een gebrek aan documentatie waarvoor te gebruiken:

C#:
1
2
Open(string Filename, object UpdateLinks, object ReadOnly, object Format, object Password, object WriteResPassword, object IgnoreReadOnlyRecommended, object Origin, object Delimiter, object Editable, object Notify, object Converter, object AddToMru, object Local, object CorruptLoad)
    Member of Microsoft.Office.Interop.Excel.Workbooks


Met van verschillende sites iets copy pasten heb ik uiteindelijk wel iets werkends gevonden. Echter bij de meeste voorbeelden wordt gebruik gemaakt van:
C#:
1
Excel.XlPlatform.xlWindows

Terwijl ik gebruik:
C#:
1
XlPlatform.xlWindows


Nu heeft het workbook dat ik wil openen een macro die runt bij het opstarten, dat is in mijn geval niet gewenst, dus ik denk, security, zo werkte dat in VB6, dus nu zal dat ook wel, helaas, weer niet:

C#:
1
this.appExcel.AutomationSecurity = Microsoft.Office.Core.MsoAutomationSecurity.msoAutomationSecurityForceDisable;


Hier heeft ie een of andere wazige foutmelding:
code:
1
The type 'Microsoft.Office.Core.MsoAutomationSecurity' is defined in an assembly that is not referenced. You must add a reference to assembly 'office, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'.


Die reference zit erin, dus wat doe ik fout, deze slaat overigens op de eerste this

Vervolgens zegt ie ook nog:
code:
1
Cannot implicitly convert type 'Microsoft.Office.Core.MsoAutomationSecurity [c:\Projects\RecipeProgram\RecipeProgram\obj\Debug\Interop.Microsoft.Office.Core.dll]' to 'Microsoft.Office.Core.MsoAutomationSecurity []'


Wat ik ook niet begrijp.


Los van deze frustrerende zaken staat er bij de msdn ook nog vaak:
Kan het nu even niet vinden, iets met niet gebruikt in code ofzo... belletje, iemand?

"Chaos kan niet uit de hand lopen"


  • whoami
  • Registratie: December 2000
  • Laatst online: 18:04
Waarom doe je het niet via ADO.NET ?

klik
klik
klik

:Y)

https://fgheysels.github.io/


  • Jay-P
  • Registratie: Oktober 2003
  • Laatst online: 04-06 00:39
Ik doe het op de volgende manier:

code:
1
2
3
4
5
6
7
8
9
10
Imports Microsoft.Office.Interop

            Dim ExcelApp As Microsoft.Office.Interop.Excel.Application
            ExcelApp = New Microsoft.Office.Interop.Excel.Application

            ExcelApp.Workbooks.Open([bestandsnaam])
            ExcelApp.Visible = False

wSheet.Cells.Item(i + 1, 3).Text 
etc. etc.


Maar er schijnt een bug te zijn waardoor je errors krijgt als je excel aanroept en je hebt je regionale settings anders staan de EN-US, om dat te verhelpen zou je zoiets moeten gebruiken:

code:
1
2
3
4
5
6
7
8
Dim oldCI As System.Globalization.CultureInfo = _
                System.Threading.Thread.CurrentThread.CurrentCulture
            System.Threading.Thread.CurrentThread.CurrentCulture = _
                New System.Globalization.CultureInfo("en-US")

[Doe iets met excel.................]

 System.Threading.Thread.CurrentThread.CurrentCulture = oldCI

Verwijderd

Zie: http://www.c-sharpcorner.com/winforms/ExcelReadMG.asp

Daar staat exact hoe je sheets kunt uitlezen. Overigens heb ik vaak genoeg gewerkt met Excel en NL settings. Dat is geen enkel probleem.

[ Voor 29% gewijzigd door Verwijderd op 20-12-2006 18:34 ]


  • Jay-P
  • Registratie: Oktober 2003
  • Laatst online: 04-06 00:39
Vergeten bij te vermelden maar dat gaat ook alleen op als je engelse versie van excel gebruikt maar niet engelse localisatie settings. Zie http://support.microsoft.com/kb/320369.

  • storeman
  • Registratie: April 2004
  • Laatst online: 01-12 09:22
Verwijderd schreef op woensdag 20 december 2006 @ 18:33:
Zie: http://www.c-sharpcorner.com/winforms/ExcelReadMG.asp

Daar staat exact hoe je sheets kunt uitlezen. Overigens heb ik vaak genoeg gewerkt met Excel en NL settings. Dat is geen enkel probleem.
Die tutorial had ik al gevonden, maar die gebruikt de Excel namespace, waar die vandaan komt weet ik dus ook niet.
whoami schreef op woensdag 20 december 2006 @ 16:40:
Waarom doe je het niet via ADO.NET ?

klik
klik
klik

:Y)
Yes, thnx! Ik heb er even naar gekeken, dit ziet er veelbelovend uit. Ik ga hier even mee experimenteren! :)

"Chaos kan niet uit de hand lopen"


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
storeman schreef op woensdag 20 december 2006 @ 16:37:
Waarna ik aangeef wat ik wil gebruiken:
C#:
1
using Microsoft.Office.Interop.Excel;


Terwijl de meeste voorbeelden gebruik maken van dit:
C#:
1
using Excel;
Hmm.. ik heb zelf beide varianten op enig moment gebruikt, en er staat me bij dat ik over moest schakelen op de eerste variant vanaf het moment dat ik het project in Visual Studio 2005 deed (variant 2 is voor VS2003 / .Net 1.1). Kan het kloppen dat jij ook VS2005 gebruikt?
Echter bij de meeste voorbeelden wordt gebruik gemaakt van:
C#:
1
Excel.XlPlatform.xlWindows

Terwijl ik gebruik:
C#:
1
XlPlatform.xlWindows
Dat ligt natuurlijk aan diezelfde namespaces he. Blijkbaar zit de enumeratie XlPlatform in de namespace Excel (VS2003) of Microsoft.Office.Interop.Excel (VS2005).
Uitgaande van VS2003 kan je die enumeratie gebruiken via "Excel.XlPlatform", of als je "using Excel;" opneemt, via "XlPlatform".
Uitgaande van VS2005 kan je die enumeratie gebruiken via "Microsoft.Office.Interop.Excel.XlPlatform", of als je "using Microsoft.Office.Interop.Excel;" opneemt, weer via "XlPlatform".
Hier heeft ie een of andere wazige foutmelding:
code:
1
The type 'Microsoft.Office.Core.MsoAutomationSecurity' is defined in an assembly that is not referenced. You must add a reference to assembly 'office, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'.
Heeft misschien met je regional settings te maken, zie de opmerkingen hierover een paar posts terug.
Vervolgens zegt ie ook nog:
code:
1
Cannot implicitly convert type 'Microsoft.Office.Core.MsoAutomationSecurity [c:\Projects\RecipeProgram\RecipeProgram\obj\Debug\Interop.Microsoft.Office.Core.dll]' to 'Microsoft.Office.Core.MsoAutomationSecurity []'
Blijkaar moet je een array van MsoAutomationSecurity constanten meegeven? Ik zou trouwens proberen eerst het vorige punt op te lossen (die "defined in an assembly that is not referenced"), goeie kans dat dat dit ook verhelpt.

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
storeman schreef op donderdag 21 december 2006 @ 09:57:
<ADO.NET>
Yes, thnx! Ik heb er even naar gekeken, dit ziet er veelbelovend uit. Ik ga hier even mee experimenteren! :)
Deze optie zou ik je afraden.

Met deze methode benader je je Excel-bestand als ware het een database, met elk werkblad uit dit bestand als een tabel van die database, met alle database-achtige restricties die erbij horen. Bijvoorbeeld, je schijnt problemen te krijgen wanneer je meerdere soorten datatypen in dezelfde kolom gebruikt (Excel gaat dan onderuit).

Zelf heb ik dit niet meegemaakt, maar wel dat sommige cellen uit een werkblad als zijnde leeg werden teruggegeven terwijl er gewoon informatie in stond. Daarnaast kan je Excel blijkbaar niet wijsmaken dat hij de eerste rij van een werkblad *nooit* voor de kolomnamen moet gebruiken; bij het ene werkblad doet hij dit wel (en komt de eerste regel dus niet terug in je dataset), bij de volgende doet hij dit niet en heb je die regel wel.
Ook bij het opvragen van de tabelnamen (lees: werkbladnamen) krijg je af en toe niet-bestaande werkbladen terug.

En dan hebben we het alleen nog maar over lezen van informatie, wat er moet gebeuren om informatie te wijzigen wil ik niet eens weten...

[ Voor 10% gewijzigd door MrBucket op 21-12-2006 18:52 ]

Pagina: 1