Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] Word-sjabloon en C#

Pagina: 1
Acties:

Verwijderd

Topicstarter
Gegroet,

Ik ben met een klein database-projectje bezig in Visual C#. Gaat allemaal prima...Er is echter 1 probleem.

De gegevens uit de database moeten worden geladen in een MS Word-sjabloon. De sjablonen bestonden al, en werden vroeger handmatig gevuld. In MS Access kan dit m.b.v. Visual Basic, heel erg makkelijk. Echter, ondanks een hele zoektocht over het internet of dit ook kan met C#, ben ik nog niets wijzer geworden. Wellicht ook wegens een gebrek aan goede zoektermen.

Nou verwacht ik dus niet dat iemand hier dit helemaal gaat zitten voorkouwen voor me, maar kan me iemand wel op de goede weg zetten?

  • lier
  • Registratie: Januari 2004
  • Laatst online: 15:17

lier

MikroTik nerd

De oplossing is sterk afhankelijk van de versie van Office die je gebruikt.

Zoek eens op Office automation c#, dat moet iets opleveren (overigens blijft het een beetje behelpen, in tegenstelling tot VBA).

Eerst het probleem, dan de oplossing


Verwijderd

Topicstarter
Het moet eigenlijk werken met alle recente versies van Word, dus van 2000 tot de 2007 versie.. Ik ga me daar eens in verdiepen..

Aangezien ik net begonnen ben met het project, zou het makkelijker zijn het project te bouwen in VB.NET?

[ Voor 29% gewijzigd door Verwijderd op 25-01-2007 14:37 ]


  • Cyphax
  • Registratie: November 2000
  • Laatst online: 16:45

Cyphax

Moderator LNX
Je kunt gebruik maken van System.Runtime.InteropServices als Word staat geïnstalleerd op de bak waar het programma moet draaien. Krijg je zoiets:
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
private Word.Document Document;
private object confirmConversions = Type.Missing;
...
private object RouteDocument;

Document = WordApp.Documents.Open(  ref TemplateFilename, 
                                ref confirmConversions, // missing
                                ref readOnly,  //true
                                ref addToRecentFiles, // missing
                                ref passwordDoc, // missing
                                ref passwordTemplate, // missing
                                ref revert, // missing
                                ref writepwdoc, // missing
                                ref writepwTemplate, // missing
                                ref format, // missing
                                ref encoding, // missing
                                ref visible, // missing
                                ref openRepair, // missing
                                ref docDirection, // missing
                                ref notEncoding, // missing
                                ref xmlTransform // missing
);

Object BookmarkName = bookmarkname;
try
{
    if (Document.Bookmarks.Exists(bookmarkname))
    {
        Word.Range BookmarkRange = Document.Bookmarks.get_Item(ref BookmarkName).Range;
        try
        {
            
            BookmarkRange.Text = newvalue;
        }
        catch
        {
            //
        }

...

Niet om vrolijk van te worden. Ik heb nooit iets minder irritants kunnen vinden. Maargoed wij doen dat hier ook zo: bookmarks worden gereplaced met een waarde.
Het werkt wel op zich.

[ Voor 8% gewijzigd door Cyphax op 25-01-2007 14:40 ]

Saved by the buoyancy of citrus


  • __fred__
  • Registratie: November 2001
  • Laatst online: 29-11 20:34
Ik heb een gezonde voorkeur voor C# boven VB.NET, maar in het geval van Office automation, zeker met versies 2000,XP en 2003, loont het de moeite om een aparte DLL in VB te schrijven die uitgebreid gebruik maakt van late binding. Die VB DLL kun je dan natuurlijk weer wel benaderen vanuit C#

Verwijderd

Topicstarter
Even een flinke kick...project heeft wegens verschillende omstandigheden een half jaar stil gelegen.

Ik ben hier nu weer aan begonnen, m'n code is denk ik goed, alleen hij vindt word niet. Uiteraard heb ik het bijbehorende Word-comobject toegevoegd, maar dessalniettemin wil hij word niet vinden. Krijg gewoon een error dat dat type of namespace niet gevonden kan worden. Een zoektocht op internet levert me 0 op, weet iemand hier waar dat aan kan liggen misschien?

Voor de zekerheid..even m'n code:

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.Office;

namespace WindowsApplication5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Object oMissing = System.Reflection.Missing.Value;
            Object oTrue = true;
            Object oFalse = false;
            Word.Application oWord = new Word.Application();
            Word.Document oWordDoc = new Word.Document();
            oWord.Visible = true;
            oWordDoc = oWord.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref oMissing);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int iTotalFields = 0;
            Object oMissing = System.Reflection.Missing.Value;
            Object oTrue = true;
            Object oFalse = false;
            Word.Application oWord = new Word.Application();
            Word.Document oWordDoc = new Word.Document();
            oWord.Visible = true;
            Object oTemplatePath = "C:\\Cijfers 2007.dot";

            oWordDoc = oWord.Documents.Add(ref oTemplatePath, ref oMissing, ref oMissing, ref oMissing);
            foreach (Word.Field myMergeField in oWordDoc.Fields)
            {
                iTotalFields++;
                Word.Range rngFieldCode = myMergeField.Code;
                String fieldText = rngFieldCode.Text;
                if (fieldText.StartsWith(" MERGEFIELD"))
                {
                    Int32 endMerge = fieldText.IndexOf("\\");
                    Int32 fieldNameLength = fieldText.Length - endMerge;
                    String fieldName = fieldText.Substring(11, endMerge - 11);
                    fieldName = fieldName.Trim();
                    if (fieldName == "opsteken")
                    {
                        myMergeField.Select();
                        oWord.Selection.TypeText("bla");
                    }
                }
            } 
        }
    }
}

  • __fred__
  • Registratie: November 2001
  • Laatst online: 29-11 20:34
Welke Office versie gebruik je? 2003 en 2007 hebben de (primary) interop assemblies bij Office in zitten. Voor office XP moet je ze zelf downloaden bij microsoft. (OfficeXPPia geloof ik ofzo)
Als je het com object toevoegt zonder de interop assemblies geinstalleerd te hebben, probeert VS ze zelf te genereren, en dat lukt niet 100% correct. Onder andere komen de namespaces niet overeen met de door microsoft gedefinieerde.

http://www.microsoft.com/...FEBA508E52&displaylang=en

[ Voor 17% gewijzigd door __fred__ op 24-07-2007 17:14 ]


Verwijderd

Topicstarter
Ik gebruik Office 2003. Dus zou ik deze niet nodig moeten hebben, dessalniettemin had ik dit zelf ook al gevonden, en voor de zekerheid ook maar even gedownload en geïnstalleerd. Het mocht echter niet baten.

Hopenlijk iemand anders nog ideeën?

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 10-11 17:17
Hoe ver kom je in de code? Wat is de exception?
Heb je overigens aan een ODBC naar word gedacht? Op die manier los ik al mijn .NET -> Excel problemen op :).
Edit: Bijvoorbeeld een dergelijk iets http://www.codeproject.co...7902&exp=0&select=1819968

[ Voor 31% gewijzigd door Alex op 25-07-2007 09:25 ]

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart

Pagina: 1