03. januar 2012 - 10:54Der 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.
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.
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.
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?
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.
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;
// 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
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.