Avatar billede the_julle Praktikant
03. januar 2012 - 10:54 Der er 11 kommentarer og
1 løsning

Oversæt Visual Basic til C# (gennemlæs word-tabeller)

Hej alle.

Jeg har lavet en macro i Excel (2007), som gennemlæser en word-fil (2003). Den finder nogle bestemte tabeller og udløser nogle bestemte celler fra disse tabeller.

Nu vil jeg gerne lave denne funktion i C#. De to sprog minder meget om hinanden, synes jeg, så mon ikke jeg kan genbruge de tanker jeg allerede har gjort i forbindelse med kodningen af Visual Basic...

Her er en lille stump af min Visual Basic kode, som jeg ønsker konverteret til C#. Det ville hjælpe enormt meget at få hjælp til dette, da resten af min kode er nogenlunde samme smøre.

[IMG]http://i162.photobucket.com/albums/t244/the_julle/VBA-kode.png[/IMG]

Altså hovedsageligt hvordan jeg få indlæst alle tabellerne fra word, så jeg kan søge efter det jeg skal bruge.

Facts:
- Jeg bruger Office 2007, men den word-fil der skal gennemlæses er en 2003-fil.
- I C# bruger jeg referencen Microsoft Excel 12.0 Object Library.


Håber i vil hjælpe. Tak.
Avatar billede niklask Nybegynder
03. januar 2012 - 11:23 #1
Avatar billede bvli Praktikant
03. januar 2012 - 12:09 #2
Hvis du vælger at lave en direkte konvertering af din eksisterende kode og vil fortsætte med at bruge Word2003 formatet, tror jeg faktisk ikke du vinder særligt meget. Du vil være nødt til at bruge referencer til Word og lave "gammeldags" interop.

Har du evt. mulighed for at bruge ooxml (docx/docm) formatet i stedet på det word dokument du skal parse? I så fald vil det helt sikkert kunne betale sig at gå direkte på filen vha. OpenXML sdk'et i stedet for at bruge COM interop mod office.

Vælger du OpenXMl så skriv gerne igen, så vil jeg kunne finde et eksempel frem hvor i man kan søge tabeller frem.

Hvis det lidet usandsynlige skulle forekomme, at du bruger Word2003 XML (WordML), så vil du kunne arbejde direkte på filerne vha. XML. Men det var de færreste der gjorde det dengang det var "hot", så det tror jeg næsten ikke du gør.
Avatar billede the_julle Praktikant
03. januar 2012 - 12:09 #3
Jeg kan ikke rigtig få den til at virke. Den smidder hele tiden fejlen "EOF expected"?
Avatar billede the_julle Praktikant
03. januar 2012 - 12:14 #4
@bvli: Tak for dit svar.

Jeg gør det mest for at få øvelse med C#, og ikke så meget for at skulle vinde noget overfor min VBA-kode.

Word-filen er en jeg får eksternt, og den vil være meget usandsynligt, at jeg kan trumfe igennem med, at de skal bruge et andet format.

Så formattet er desværre en .doc-fil. Er det en mulighed at få C# til at åbne dokumentet, gennem det som en .docx-fil og herefter arbejde videre med denne?
Avatar billede bvli Praktikant
03. januar 2012 - 12:15 #5
Du kan ikke bruge en VB.NET -> C# converter til at konvertere VBA til C#.
Avatar billede bvli Praktikant
03. januar 2012 - 12:19 #6
ja - det kan du godt, men så går det sjove lidt af, da du så skal have en instans af Word i luften alligevel for at konvertere til docx. Desuden vil du alligevel skulle lave noget interop i word instansen for at finde ud af om der er makroer eller ej i dokumentet og derefter gemme som henholdsvis docx eller docm.
Avatar billede the_julle Praktikant
03. januar 2012 - 12:27 #7
Bom bom. Det var da lidt mere besværligt end først antaget.

Jeg har fået åbnet dokumentet på denne måde:
// Opretter en word-applikation, samt en tabel.
Microsoft.Office.Interop.Word.Application wApp = new Microsoft.Office.Interop.Word.Application();
Microsoft.Office.Interop.Word.Table tb;

// Åbner det angivne dokument (chosenFile er defineret andetsteds)
Document wd = wApp.Documents.Open(chosenFile);
wApp.Visible = true;

Herefter havde jeg håbet på, at jeg kunne bruge min variabel tb til at gennemsøge efter tabeller, ligesom jeg har gjort det i VBA.

Er det helt umuligt?

Jeg anvender disse referencer:
using Microsoft.Office.Interop.Excel;
using Microsoft.Office.Interop.Word;
Avatar billede the_julle Praktikant
03. januar 2012 - 13:45 #8
Jeg tror nu faktisk det her virker.

// Opretter en word-applikation, samt en tabel.
Microsoft.Office.Interop.Word.Application wApp = new Microsoft.Office.Interop.Word.Application();

// Åbner det angivne dokument (chosenFile er defineret andetsteds)
Document wd = wApp.Documents.Open(chosenFile);
wApp.Visible = true;

// Gennemsøg tabel
foreach (Table tb in wd.Tables)
{
  for (int i = 0; i < tb.Range.Cells.Count; i++)
  {
     
  }
}


Ved hjælp af debugging kan jeg se, at jeg kommer ind i en tabel og undersøger hver celle.

Er det en forkert måde at gøre det på, eller?


Hernæst har jeg så lige et regulært C# problem. Lad os antage at der står TEST123 i en celle. Jeg vil gerne undersøge om dette rent faktisk er tilfældet. Jeg tænkte jeg kunne bruge substring således:

if (tb.Range.Cells[1].Range.Text.Substring(0,7) == "TEST123")

Men dette giver følgende fejl, i tilfælde af at cellen er tom eller at teksten i cellen er under 7 karaktere lang:
Index and length must refer to a location within the string.
Parameter name: length

Hvordan løser man det problem?
Avatar billede platik Nybegynder
03. januar 2012 - 14:26 #9
if (tb.Range.Cells[1].Range.Text.Length >= 7)

eller:

if (tb.Range.Cells[1].Range.Text.StartsWith("TEST123")) som også erstatter
if (tb.Range.Cells[1].Range.Text.Substring(0,7) == "TEST123")

Kunne også bare skrive:

if (tb.Range.Cells[1].Range.Text == "TEST123")
Hvis der ikke skal stå andet. De andre tilfælde skal teksten bare starte med TEST123 for det er sandt.
Avatar billede the_julle Praktikant
03. januar 2012 - 14:56 #10
HA! StartsWith gør lige præcis hvad jeg havde i tankerne. Tak for tippet.

Hvad siger i til min løsníng til at åbne Word-dokumentet og søge efter tabeller. Det virker umiddelbart, men er det den kønneste / bedste løsning?
Avatar billede the_julle Praktikant
04. januar 2012 - 08:12 #11
@bvli. Selvom jeg ikke benytter ooxml (docx/docm) formatet, vil jeg meget gerne se eksempler på hvordan man så havde gjort.
Avatar billede bvli Praktikant
16. januar 2012 - 12:41 #12
Og et svar :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester