Avatar billede thepsypher Nybegynder
04. september 2008 - 01:42 Der er 8 kommentarer og
1 løsning

word2007 og excel2007 "automatisering" vha. C#

Hej Eksperter.

For at gøre en lang historie kort, så skal jeg vha. C# kunne oprette et word2007 dokument og smide forskellig data ind i og derefter smide et diagram/graf (excel2007) ind i det word dokument.

I word2003 kunne man jo lave en makro og se et OLE metodekald:

Application.Selection.InlineShapes.AddOLEObject("MSGraph.Chart.8", ref missing, ref LinkToFile, ref DisplayAsIcon, ref missing, ref missing, ref missing, ref missing);

Men Word2007 kan ikke optage makro når man indsætter et diagram (ihvertfald ikke her).

Er det en total retarderet måde jeg gør det på? Er der en nemmere/bedre? Hvordan gør man i Office2007? HELP ME!

Hilsen Psypher
Avatar billede bvli Praktikant
04. september 2008 - 14:33 #1
Hej.

Hvis det kun er OOXml dokumenter du skal lege med, så vil jeg helt sikkert foreslå dig, at glemme alt om Word automation og så bruge den managed DocumentFormat.OpenXml komponent. Måske tager det lidt tid at komme ind i selve api'et, men når først du er i gang, så kan du trylle og det er på en tiendedel af tiden, i forhold til automation.

/B :)

Check: http://msdn.microsoft.com/en-us/library/bb456488.aspx
Avatar billede thepsypher Nybegynder
09. september 2008 - 08:02 #2
tak bvli, du har hjulpet mig på rette spor, men har aldrig sat mig ind i OOXml strukturen og er heller ikke den mest erfarne med Xml.

Jeg har dog læst op på nogle artikler og begyndt at få mere styr på syntaksen og selve strukturen.

meeeeen, nu har jeg et 2 siders word-dokument, som ligesom skal være en form for template for de rapporter systemet skal generere.

Mit spørgsmål er så, hvordan laver jeg "reference-punkter" i mit Word dokument, som jeg så nemt kan erstatte med tekst fra min C# applikation.

Har prøvet med noget søg/erstat, hvor jeg simpelthen smed nogle referencer-tekster ind i Word-dokumentet:

"##Fornavn## ##Efternavn##", som jeg så bagefter kunne erstatte med mine variabler, men det er måske den nemmeste metode, men bestemt ikke den smukkeste (da den jo er lidt grim og efter nogle redigeringer af "templaten" har word smidt så mange fyld Xml-tags ind imellem at ordene ikke længere er et ord!! heh)?

<w:r w:rsidR="00B54072">
- <w:rPr>
  <w:sz w:val="24" />
  <w:szCs w:val="24" />
  </w:rPr>
  <w:t>##</w:t>
  </w:r>
- <w:r w:rsidRPr="00AF27A4">
- <w:rPr>
  <w:sz w:val="24" />
  <w:szCs w:val="24" />
  </w:rPr>
  <w:t>Efternavn</w:t>
  </w:r>
- <w:r w:rsidR="00B54072">
- <w:rPr>
  <w:sz w:val="24" />
  <w:szCs w:val="24" />
  </w:rPr>
  <w:t>##</w:t>
  </w:r>
  </w:p>

Og hvis svaret er at jeg skal bruge Xmlreaderen og lege med tagsne, hvordan finder jeg så frem til de rette linjer / tags?
Avatar billede thepsypher Nybegynder
15. september 2008 - 17:31 #3
Nu er det jo så nærmere blevet et XML spørgsmål istedetfor....Eller Word/C#/XML....
Avatar billede bvli Praktikant
16. september 2008 - 07:31 #4
Hej igen.

Den letteste måde at gøre det på, er at indsætte et "custom xml" tag i din skabelon. Derefter søger du på den og smækker dine <r> og dine <t> (runnings og text) ind i dem.

En anden måde er at bruge almindelige flettefelter, check hvordan disse ser ud, og så lave en replace på disse.

Jeg har eksempler på begge dele, men desværre ikke lige her. Sig gerne til, hvis det er.

/B
Avatar billede thepsypher Nybegynder
24. september 2008 - 08:04 #5
Hej igen igen....
Har lavet en test hvor jeg først tager min "template" og kopierer den til en ny fil og vil derefter ændre den. Udfra min sparsomme viden (tager jo tid at læse og forstå alt om XML i alle sammenhæng), så burde dette virke.
Jeg får dog en fejl der siger "Namespace Manager or XsltContext needed. This query has a prefix, variable, or user-defined function.", men kan mærke at jeg er MEGET tæt på, eftersom at XMLSpy rent faktisk kan hive det ud, som jeg vil....
Ved godt at din løsning er lidt anderledes, men prøvede denne, også bare for at opnå større forståelse for OOXML og XML. Dette er dog et meget banalt eksempelt, men alle kommentarer til koden er velkommen :-)

private void button2_Click(object sender, EventArgs e)
        {
            File.Copy("C:\\template.docx", "C:\\Afstemning12345.docx", true);
            WordprocessingDocument wordDoc = WordprocessingDocument.Open("C:\\Afstemning12345.docx", true);
            XmlDocument document = new XmlDocument();
            document.Load(wordDoc.MainDocumentPart.GetStream());
            //richTextBox1.Text = document.SelectSingleNode("/w:document/w:body/w:p [@w:rsidR = '00AF27A4']/w:r [@w:rsidRPr = '00AF27A4']/w:t").ToString();
            richTextBox1.Text = document.SelectSingleNode("/w:document").ToString();
            document.Save(wordDoc.MainDocumentPart.GetStream());
            wordDoc.Close();
        }
Avatar billede thepsypher Nybegynder
25. september 2008 - 07:15 #6
nå, jeg lavede selvhjælp og fandt ud af det efter at have sovet på det. Tror jeg lukker denne og opretter mine OOXML spørgsmål i XML forummet.

Men bvli, du har hjulpet mig RIGTIG godt på vej i den rette retning, så kast et svar :-)
Avatar billede thepsypher Nybegynder
25. september 2008 - 08:14 #7
Du må forresten MEGET gerne smide dine eksempler på brug af "custom XML" tags.
Avatar billede bvli Praktikant
25. september 2008 - 14:17 #8
Jeg vil meget gerne smide et eksempel. Men det må blive efter min ferie (om 14 dage). Så smider jeg også et svar på det tidspunkt.

/B :)
Avatar billede thepsypher Nybegynder
15. juni 2010 - 11:48 #9
lukket
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