10. november 2000 - 17:34Der er
24 kommentarer og 1 løsning
Vb-Word eksempel søges..
Hejsa..
Jeg har ledt med lys og lygt efter et eksempel i vb, hvor der bliver genere et Word dolument, ud fra hvad der står i db..
Det skal bruges til at lave en kompunent med. Så jeg fra en ASP side sender en \"request\" med eks. bruger id med, så slår dll\'en op i en db, og henter alle data på den bruger, og derefter generers et Word doc ud fra en template.
db eks.
user: UserID, Name, ect. Link, UserID, link, ect.
Templaten skal eks. indeholde Navn og andre ops i det toppen til venstre. Og der under i en tabel skal link og andre være..
Når du gemmer teksten, gemmes det i en .txt fil. Du kan sagtens ændre det, så du indlæser det ind i en database, da det er en streng der indlæses i .txt dokumentet.
Der er ikke et af de eksempler på microsofts side der kan bruges.
Det som jeg søgere en et eksembel der laver en word-fil (.doc) ud fra en template (.dot) med en tabel i.
Og jeg vil ikke indlæse noget i en db. men hente nogle data ud som skal fyldes ind i en tabel som findes i templaten.. Hvor lang tabelen er vides ikke for det kommer an på det udtræk som man laver fra db\'en.
.doc er en del af RTF formatet.. (Rich Text Format), og den er en VB-komponent til den, Microsoft RichText Box (5.0,6.0)
Når du gemmer RTF, kan word sagtens åbne dem, og når du gemmer i Word (.doc), kan RTF boxen sagtens åbne dem (dog uden extra feat. som Skygge på teksterne osv. Men Fed, Kursiv, Centrer tekst kan den godt åbne...
Et RTF temp. her kan du oprette tabeller, text, farve, skrift type... og hvis du kopiere denne tekst, indsætter den i notepad, og gemmer den som .doc, kan word sagtens læse den.
{\\rtf1\\ansi\\ansicpg1252\\deff0\\deftab720{\\fonttbl{\\f0\\fswiss MS Sans Serif;}{\\f1\\froman\\fcharset2 Symbol;}{\\f2\\fswiss MS Sans Serif;}} {\\colortbl\\red0\\green0\\blue0;} \\deflang1030\\pard\\plain\\f2\\fs17 Hej... \\par }
Hej igen,, Og det er en udemærket ide med et RTF document, Men det er heller ikke lige det som jeg søger.
Jeg vil gerne se et eksempel med en access db. en word template. Templaten skal have en tabel hvor et recordset bliver indsat.
hvis det er nemmere at lave med en RTF template,er det helt ok..
I det eksempel som jeg fandt i ASP, kan jeg ikke få til at virke. Og men det skulle kunne næsten det som jeg søger. Det bygger godt nok ikke på en db, men en form som man udfylder, og sender afsted.
Jeg har søgt en masse forskellige steder men har ikke fundet noget som kan bruges.
Det som det hele skal ende med er at jeg vil laver en dll, som jeg kan bruge i APS. Dll\'en skal lave et word.doc udfra en templete, og det som der ligger i db\'en på den enkelte bruger, og udfylde en tabel ud fra et recordset.
Hvis det er fulstendigt umuligt eller urimeligt det som jeg søger, så sig lige til, og jeg vil lukke spørgsmålet..(Håber IKKE at det kommer der til).
Jeg vil meget gerne se et eksempel som indeholder: En access database. En word template (indeholdene en tabel) Tabellen ud fyldes med et udtræk fra databasen.
PainZ, kan dette bruges?? /Dan ---------------------- Option Explicit
Private objWord As Word.Application
Private Sub Command1_Click()
Dim strConn As String Dim conn As ADODB.Connection Set conn = New ADODB.Connection
Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset
strConn = \"TestDB\"
conn.Open strConn
rs.Open \"SELECT * FROM Pri_Artikler\", conn, adOpenKeyset, adLockOptimistic If Not rs.BOF Or rs.EOF Then rs.MoveFirst
Dim tabRow As Integer Dim j As Integer Dim objDocument As Word.Document Dim objWord As Word.Application
Set objWord = New Word.Application objWord.Visible = True
\' Fejlen lå her, hvor du først fik Add\'et et ekstra dokument, og til dets aplikation (Word) fik tilføjet et ekstra dokument (ud fra templaten) som du ingen reference havde til efterfølgende Set objDocument = objWord.Documents.Add(\"E:\\VB Files\\Henrik\\worddoc\\Fax.dot\", False, , True) \' sidste True er for at dokumentet skal være synligt
tabRow = 2 With objDocument.Tables(1) .Rows(tabRow - 1).Borders.Enable = False
For j = 1 To rs.RecordCount .Rows.Add .Rows(tabRow).Borders.Enable = False .Rows(tabRow).Cells(1).Range.InsertAfter rs(\"Art_nr\") .Rows(tabRow).Cells(2).Range.InsertAfter rs(\"Overskrift\") .Rows(tabRow).Cells(3).Range.InsertAfter rs(\"Colli\") .Rows(tabRow).Cells(4).Range.InsertAfter rs(\"Pris\") tabRow = tabRow + 1 rs.MoveNext Next End With
\' Test evt. for at se om der er andre dokumenter åbne i dette Word instance og luk så Word hvis antallet er 0 If objWord.Documents.Count = 0 Then objWord.Quit False \' Hvis der alligevel skulle være nogen dokumenter (!??), så ignorer dem og luk Set objWord = Nothing \' så kan objWord sættes til Nothing (lukker man ikke først vil der være en amsse Winword.exe instanser i hukommelsen) End If rs.Close conn.Close Set rs = Nothing Set conn = Nothing End Sub
hvorfor skal alting være så \"komponent agtigt??\"...
Et Word-document er opbyggget efter et RFT document (og opbyggelsen er sku ikke svært at oversætte).
DVS.: Du kan lave et .doc document med kode, uden at åbne word, eller andre ting... fks. kan du sagtens lave en tabel i tekst (rtf-kode tekst), og en skabelon, hvor du derefter med kode udfylder og gemmer den doc fil.
Det er RFT (doc) kode som sagtens kan åbnes fra Word: {\\rtf1\\ansi\\ansicpg1252\\deff0\\deftab720{\\fonttbl{\\f0\\fswiss MS Sans Serif;}{\\f1\\froman\\fcharset2 Symbol;}{\\f2\\fswiss MS Sans Serif;}} {\\colortbl\\red0\\green0\\blue0;} \\deflang1030\\pard\\plain\\f2\\fs17 Hej... \\par }
Det der \"Hej...\" kan du sagtes skifte ud, så der kommer et værdi fra DB databasen (fks. et navn), sådan kan du også finde ud af hvordan Word opretter tabeller, lave en skabelon og udfylde den med diverse værdier... Det er der usmart at bruge system kræfter på at indlæse et Word-komponent eller at åbne word, når man kan lave det smartere.
Men valget er jo dit, som sagt: Hvis du skal lave en visuelt HTML editor: Kan du bruge 2 ting: En hvor du laver din egn tekstboks, eller at bruge RFT eller andres tekstbokse... de andres vil altid være dårligere end din egn, siden du slev bestemmer hvad du vil proppe i den, og i de andres mangler der altid et eller andet...
vbghost, jeg forstår udemærket at du synes det er kedeligt med alle de komponenter - og jeg kan da kun give dig ret i, at det bliver en smule tungt. Jeg ville da også hellere kunne lave tingene lette og kompakte, men der forventes altså noget andet idag. Det skal være letlæseligt og kunne læses af andre som en dag skal kunne overtage ens kode. Idag kodeer man ikke så langt nede som jeg gjorde engang og som du tilsyneladende også gerne vil, men jeg tror at man må se i øjnene, at man får meget mere ved at bruge komponenterne end man vinder i (eksekverings)tid ved at kode tingene lidt mere \'low-level\'. En af de ting jeg vil påpege her kunne være danske tegn og andre tegn, som du i din programmering måske ikke har mulighed for at tage højde for som det ser ud nu, for slet ikke at tænke på portabiliteten fremover. Lige bortset fra det, så skal Word forbi en lille konverteringsindlæsning for at åbne et TF dokument, men skrevet rigtigt, så fylder det naturligvis noget mindre end et klodset Word-dokument... det medgi\'r jeg... *S*
Dan, i denne linje får denne fejl: Wrong number of arguments or invalid property assignment
Set objDocument = objWord.Documents.Add(\"E:\\VB Files\\Henrik\\worddoc\\Fax.dot\", False, , True)
vbghost.. Jeg giver dig også ret i at det egentlig er en dårlig løsning med et word doc. Men det var jo det som jeg søgte.. Jeg er meget grøn inden for VB, og kender ikke ret meget til det at udvikle apps, Jeg koder i asp til hverdag, og suntes at det ville være rart hvis jeg kunnne udvikle nogle kompunenter, som jeg kunne bruge sammen med asp.
Jeg vil blive meget glad hvis du gider at lave et eksempel med en tabel i et RTF dokument som udfyldes med et recordset..
Og min lille word løsning er meget langsom, selv på min pc, som jeg ikke selv syntes er langsom.. (Athlon Thunderbird 800 MHz, 256MB)..
Og hvis i begge (vbghost & Dan) gider at sende et \"svar\", så vil jeg bele sol og vind lige mellem jer. (point mæssigt).
OK, jeg kunne godt selv se fejlen - selvom jeg antog at du brugte Office 2000, for der *mener* jeg dette burde kunne lade sig gøre. I Office 97 findes 3. og 4. parameter ikke, og for at være sikker på hvilke parametre man sigter på kan man jo endda angive dem (Template:=\"...\"), sådan:
Set objDocument = objWord.Documents.Add(Template:=(\"E:\\VB Files\\Henrik\\worddoc\\Fax.dot\")
Hvis dette er noget du looper med, altså skal udføre en masse gange, så undlad at Quit\'e Word og oprette en ny instans hele tiden (Set objWord = New Word.Application), men genbrug den eksisterende instans.
Hmmm... måske Type Library\'et fra Word.8 (97) bliver brugt i stedet for det nye fra Word.9 (2000) - det kunne være grunden. Nå men det er vel ikke det store problem... Fik du det til at virke?
painz, jeg kunne godt lave et eksempel, men jeg skrev faktiskt at det er lidt low-levet netop fordi løsningen bliver meget specifik, når man bruger RTF - medmindre man opbygger et helt lille funktionsbibliotek af formatteringsfunktioner til RTF, for det så absolut det pæneste. Som du nok kan forstå, så laver jeg ikke sådant et funktionsbibliotek til dig - jeg har andet at bruge min tid til *S*.
hvorfor lukker i spørgsmålet...?? hvad er meningen!
men eller Painz jeg gider godt vise dig ind i Verden af RTF, istedet for at åbne word for at lave tabeller... det er da tåbeligt, og et word doc. fylder sku 30 kb..??
men ellers syntes jeg det er sku synd at du har allerede afsat dit svar ;(
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.