Práce s dokumenty Microsoft Word z VB.NET

Tomáš Herceg       21.09.2007       VB.NET, Office       26772 zobrazení

Jelikož tady ve fóru padnul dotaz na vytvoření aplikace pro tisk faktur z VB.NET, rozhodl jsem se napsat na toto téma článek. Naučíme se, jak do předpřipraveného dokumentu aplikace Microsoft Word vyplňovat texty na požadovaná místa, a jak s dokumentem dále pracovat. Jednak je to jednodušší, než celý dokument vykreslovat od prvního do posledního písmenka přes GDI+, a navíc pak můžeme s dokumentem dále pracovat - nemusíme jej tisknout, ale třeba jej odešleme e-mailem.

Jelikož se zde ve fóru objevil zajímavý dotaz, jak udělat ve Visual Basic .NET program na tisk faktur, rozhodl jsem se, že tomuto tématu věnuji jeden článek.

Pokud chceme pracovat s dokumenty, máme v zásadě 2 možnosti. Buď si napíšeme všechno úplně sami, anebo použijeme částečně hotové řešení s drobným omezením. Tento článek řeší druhý případ - použijeme program Microsoft Word, ale budeme k němu přistupovat z Visual Basicu. Tím si ušetříme spoustu práce, protože šablonu si navrhneme přímo ve Wordu a dosadíme jen na příslušná místa příslušné údaje, ale plyne nám z toho omezení - musíme mít nainstalovaný Microsoft Word. Pokud bychom si celou fakturu vykreslovali sami, toto omezení by nebylo, ale měli bychom o mnoho více práce. Tím, že použijeme Word, navíc získáme ještě jednu výhodu - fakturu nemusíme tisknout, ale můžeme ji odeslat e-mailem.

Tvorba šablony

Jak jsem již naznačil, nejjednodušší bude vytvořit fakturu ve Wordu a následně dosadit na příslušná místa příslušné texty, konkrétně adresu odběratele, adresu dodavatele, všechny fakturované položky včetně množství a cen, podpis a kontakt na osobu, která fakturu vystavila, a datum vystavení. Nebudeme zde šablonu tvořit celou od začátku, jen naznačím, jak tvorba bude vypadat.

Microsoft Word je opravdu mocný nástroj - mnoho lidí se bude hádat, ale nevěřte jim. Hlavní problém Wordu je ten, že jej totiž dohromady nikdo pořádně neumí používat - velikost a barvu písma umí změnit každý, ale tím znalosti většiny lidí končí. O stylech, poznámkách pod čarou, křížových odkazech a podobných věcech už ani nemluvím, ty umí opravdu málokdo. Co jej ovšem výrazně povyšuje nad konkurenci je promyšlený objektový model, který je dostupný i navenek, takže můžeme prakticky veškeré funkce Wordu používat v našich aplikacích. Dost už ale teorie, jdeme na vytvoření šablony.

Navrhneme tedy základní strukturu celé faktury (já mám MS Office 2007, ale mělo by to jít i ve starších, používat budeme ještě starý formát DOC, o novém DOCX zase někdy příště).

Základní struktura faktury

Jen pro doplnění, část s adresami odběratele a dodavatele je jedna tabulka (1 řádek, 2 sloupce, v každém jedna adresa), dál následuje druhá tabulka s položkami a jejich cenami, a pod tím máme třetí tabulku (1 řádek, 2 sloupce). Místo textů nyní budeme chtít dosazovat vlastní hodnoty. Použijeme další funkci Wordu, a tou jsou záložky. Jsou to místa v dokumentu, která se nám budou snadno přístupná z objektového modelu.

Abychom mohli se záložkami pracovat, je třeba je zapnout v nastavení. Ve starších Office je to někde v menu Nástroje pod položkou Možnosti, v nových je to v hlavním menu - stačí kliknout dole na položku Nastavení a na kartě Pokročilé je možnost Zobrazit záložky. Nyní budou záložky viditelné a budeme s nimi moci pracovat. Na každé místo, kam budeme dosazovat, vložíme záložku, kterou pojmenujeme.

Záložky

Záložku přidáme jednoduše - označíme text, místo kterého budeme dosazovat, a pak v menu Vložit (v nových Office na kartě Vložení) vybereme možnost Záložky a v dialogu nastavíme název záložky a klikneme na tlačítko Přidat.

Přidání záložky

Správně vytvořenou záložku poznáme tak, že se kolem ní ukáží hranaté závorky (pokud jsme zobrazení záložek správně zapnuli, pokud ne, neuvidíme nic).

Text v záložce

Takto pojmenujeme a označíme všechna požadovaná místa v dokumentu, akorát prostřední tabulku položek necháme být, tu vyplníme bez záložek. Nezapomeneme ani nahradi záložku v záhlaví. Abyste tuto zdlouhavou činnost nemuseli dělat, vytvořil jsem dokument s fakturou se záložkami já, takže si jej můžete stáhnout. Je to uloženo jako obyčejný DOC dokument, takže jej otevřete i ve starých Office.

Návrh aplikace

Šablonu máme připravenou, zbývá nám navrhnout okno aplikace a napsat aplikační logiku. Abychom se něco naučili, ukážeme si také, jak používat tzv. Application Settings. Tato věc je nová v .NET Frameworku 2.0, jedná se o systém pro snadné ukládání nastavení aplikací. Vytvořte si tedy nový projekt (Windows Application) a rozmístěte obládací prvky třeba takto. Visual Studio nám umožňuje vytvářet opravdu pěkná rozhraní, vždycky jsem strašně naštvaný, když vidím ledabyle "naflákaná" tlačítka a textová pole.

Uživatelské rozhraní aplikace

Prostřední tabulka je komponenta DataGridView, pokud na ni klepnete pravým tlačítkem a vyberete možnost Edit columns, objeví se okno pro přidávání sloupců tabulky. Přidejte 4 sloupce, nastavte jim vlastnosti HeaderText na dané popisky a poslednímu sloupci nastavte ještě vlastnost ReadOnly na hodnotu True. Posledním dvou sloupcům nastavte vlastnosti Format na hodnotu C2, čímž zajistíme, že hodnota v těchto sloupcích se zformátuje jako měna. Ceny budeme uvádět vždy bez DPH a cena s DPH se dopočítá sama. Dolní šedé pole je obyčejný PictureBox, do kterého zobrazíme razítko, které pak vložíme do faktury na příslušné místo.

Dále si na formulář přidejte jednu komponentu OpenFileDialog pro výběr souboru obrázku s podpisem, a dále jednu komponentu SaveFileDialog pro výběr umístění hotové faktury.

Výběr obrázku ze souboru

Přidejte do projektu tuto proceduru, která se po kliknutí na pole pro podpis zeptá na soubor a pokud jej vybereme, zobrazí jej v PictureBoxu. Protože budeme potřebovat i cestu k tomuto souboru, uložíme ji do vlastnosti Tag. Tato vlastnost se dá využít jako poznámka, mohli bychom samozřejmě použít i nějakou proměnnou.

    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
        'vybrat obrázek a uložit cestu do Tagu
        OpenFileDialog1.InitialDirectory = My.Computer.FileSystem.SpecialDirectories.MyPictures
        If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
            'zobrazit obrázek a uložit cestu do Tagu, bude potřeba při generování dokumentu
            PictureBox1.Image = Image.FromFile(OpenFileDialog1.FileName)
            PictureBox1.Tag = OpenFileDialog1.FileName
        End If
    End Sub

Validace hodnot v tabulce

Nebudeme kontrolovat správnost všech údajů, to bychom se nikam nedostali, jediné, co si ukážeme, jsou sloupce s cenou. Zadáním ceny bez DPH se musí dopočítat cena s DPH. Dále ještě zkontrolujeme, jestli je množství číslo. Ostatní jistě zvládnete sami, takže to nebudu rozvádět. Do okna kódu vložte událost CellEndEdit, která nastane, jakmile dokončíme editaci buňky.

    Private Sub DataGridView1_CellEndEdit(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
        'tato událost se spustí bezprostředně po ukončení editace buňky
        With DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex)

            If e.ColumnIndex = 2 Then
                'zkontrolovat, jestli je vyplněná cena číslo
                Dim m As Double
                If Not Double.TryParse(.Value, m) Then   'pokud to není číslo, nastavíme nulu
                    m = 0
                End If
                .Value = m
                'dopočítat cenu s DPH 
                DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex + 1).Value = .Value * 1.19

            ElseIf e.ColumnIndex = 1 Then
                'zkontrolovat, jestli je množství číslo
                Dim i As Integer
                If Not Integer.TryParse(.Value, i) Then  'pokud to není číslo, nastavíme jedničku
                    .Value = 1
                End If

            End If
        End With
    End Sub

Automatické uložení nastavených hodnot

U bšech textových polí by se hodilo uložit naposledy zadané hodnoty a po opětnovné spuštění programu je zase načíst. Mohli bychom to napsat ručně (a jistě bychom to zvládli), ale proč psát něco celé o začátku, když už to za nás někdo udělal. Použijeme tzv. Application Settings, což je nová funkcionalita Visual Studia 2005. Označte první textové pole a v okně vlastností klikněte na tlačítko se třemi tečkami u vlastnosti PropertyBindings v položce ApplicationSettings. V dialogu, který se objeví, vybereme příslušnou vlastnost a rozablíme ji, čímž zobrazíme seznam všech dostupných položek nastavení. Odkazem New zobrazíme okno, ve kterém vytvoříme položku novou. Pak již stačí jen zadat název nastavení kliknout na OK.

Nastavení Application Settings  Výběr vlastnosti Vytvoření položky nastavení

Položky tabulky ukládat nebudeme, dost značně by to prodloužilo článek. I zde můžeme použít naše Application Settings, ale nepůjde to jednoduše naklikat, museli bychom načítat a ukládat z kódu. Vrhneme se tedy na generování dokumentu. Šablonu máme nachystanou, takže můžeme začít.

Přidání referencí na knihovnu Wordu

Abychom mohli využívat funkce aplikace Microsoft Word, musíme si do projektu přidat reference na jeho knihovnu. Otevřete si tedy vlastnosti projektu (dvojklik na položku My Project v podokně Solution Explorer) a na záložce References klikněte na tlačítko Add. V dialogu vyberte knihovnu s názvem Microsoft Word Object Library (na číslu verze nezáleží) a potvrďte tlačítkem OK. Nyní můžeme využívat funkce MS Wordu z naší aplikace. Pokud jste někdy dělali s VBA ve Wordu (Visual Basic For Applications), vězte, že VBA používá stejnou knihovnu, tím pádem bude kód prakticky stejný.

Přidání referencí na knihovnu Wordu

Další věc, kterou bychom měli udělat, je přidat soubor šablony do projektu. V podokně Solution Explorer tedy klikněte pravým tlačítkem a vyberte Add\Existing Item..., v okně vyberte vzorovou fakturu a potvrďte. Klikněte na soubor a vlastnost Copy To Output Directory nastavte na hodnotu Copy Always, aby se soubor zkopíroval do složky s výstupním EXE souborem. Nyní již můžeme začít programovat. Poklepejte tedy na tlačítko pro generování a po částech si projdeme celý proces generování.

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        'zakázat ovládací prvky v aplikaci
        Me.Enabled = False
        'spustit Word
        Dim w As New Microsoft.Office.Interop.Word.Application()
        'otevřít dokument Faktura.doc a aktivovat jej
        w.Documents.Open(IO.Path.Combine(Application.StartupPath, "Faktura.doc")).Activate()


 
        ...

Nejprve zakážeme všechny ovládací prvky na formuláři, aby uživatel nemohl během generování měnit hodnoty v polích a nenadělal nám v dokumentu "paseku". Další příkaz vytvoří novou instanci objektu Word.Application. De facto se na pozadí spustí program Word, který budeme pomocí kódu ovládat. Na dalším řádku zavoláme metodu Open a předáme jí cestu složenou z cesty k EXE souboru (Application.StartupPath) a názvu šablony. Ke spojování cest je dobré využít funkci IO.Path.Combine, nemusíme totiž kontrolovat, jestli první cesta končí lomítkem, aby se spojení provedlo správně. Na otevřený dokument zavoláme ještě funkci Activate, která jej nastaví jako aktivní dokument.

        ...
 
'provést náhrady textů With w.ActiveDocument.Bookmarks 'adresa odběratele .Item("odberatel_nazev").Range.Text = txbOdberatelJmeno.Text .Item("odberatel_ulice").Range.Text = txbOdberatelUlice.Text .Item("odberatel_mesto").Range.Text = txbOdberatelMesto.Text .Item("odberatel_psc").Range.Text = txbOdberatelPSC.Text .Item("odberatel_ic").Range.Text = txbOdberatelIC.Text .Item("odberatel_dic").Range.Text = txbOdberatelDIC.Text 'adresa dodavatele .Item("dodavatel_nazev").Range.Text = txbDodavatelJmeno.Text .Item("dodavatel_ulice").Range.Text = txbDodavatelUlice.Text .Item("dodavatel_mesto").Range.Text = txbDodavatelMesto.Text .Item("dodavatel_psc").Range.Text = txbDodavatelPSC.Text .Item("dodavatel_ic").Range.Text = txbDodavatelIC.Text .Item("dodavatel_dic").Range.Text = txbDodavatelDIC.Text 'údaje o vystaviteli .Item("vystavil_jmeno").Range.Text = txbVystavilJmeno.Text .Item("vystavil_email").Range.Text = txbVystavilEmail.Text .Item("vystavil_telefon").Range.Text = txbVystavilTelefon.Text .Item("datum").Range.Text = Now.ToString("d. MMMM yyyy") 'název firmy v záhlaví .Item("firma").Range.Text = txbDodavatelJmeno.Text 'razítko nebo podpis, pokud je vybráno If String.IsNullOrEmpty(PictureBox1.Tag) Then .Item("vystavil_razitko").Range.Text = "" Else .Item("vystavil_razitko").Range.InlineShapes.AddPicture(PictureBox1.Tag) End If End With

...

V tomto poměrně dlouhém bloku provádíme náhrady textu v záložkách. ActiveDocument je aktivní dokument a je to ten náš otevřený. Každý dokument má kolekci Bookmarks, která obsahuje všechny záložky. Protože s ní budeme pracovat často, použijeme With blok, který zajistí, že pokud uvnitř něco začíná tečkou, bude se pravocat s podvlastnostmi w.ActiveDocument.Bookmarks. V kolekci máme vlastnost Item, které jako parametr předáme název záložky, který jsme zadali v dokumentu. Podle názvu získáme celou záložku, a Range.Text nám umožní nastavit do této záložky text. Takto tedy vyplníme záložky hodnotami z textových polí, do záložky datum vložíme aktuální datum.

Jediné, co je jiné, je razítko. Do dokumentu potřebujeme vložit obrázek. Pomocí String.IsNullOrEmpty zjistíme, jestli je hodnota vlastnosti Tag v komponentě PictureBox1 prázdná. Pokud je, znamená to, že jsme obrázek neurčili. Pokud není, tak obsahuje cestu k souboru obrázku, který se má použít jako podpis. Pokud tedy je vybrán podpis, pomocí zavolání InlineShapes.AddPicture přidáme na místo záložky obrázek. Jako parametr se zadá cesta k souboru. Tím jsme tedy dosadili potřebné texty na potřebná místa. Nyní vyplníme položky faktury do tabulky.

        ...
 


'vygenerovat položky faktury do tabulky (pracujeme s 2. tabulkou) Dim suma As Double = 0 For i As Integer = 0 To DataGridView1.Rows.Count - 2 With w.ActiveDocument.Tables(2).Rows.Add() 'nastavi bílou barvu pozadí řádku .Shading.BackgroundPatternColor = Microsoft.Office.Interop.Word.WdColor.wdColorWhite 'nastavit normální řez písma (vypnout tučné) .Range.Font.Bold = 0 'vyplnit hodnoty buněk .Cells(1).Range.Text = DataGridView1.Rows(i).Cells(0).Value .Cells(2).Range.Text = DataGridView1.Rows(i).Cells(1).Value .Cells(3).Range.Text = String.Format("{0:c2}", DataGridView1.Rows(i).Cells(2).Value) .Cells(4).Range.Text = String.Format("{0:c2}", DataGridView1.Rows(i).Cells(3).Value) 'nastavit zarovnání buněk .Cells(1).Range.Paragraphs.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft .Cells(2).Range.Paragraphs.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight .Cells(3).Range.Paragraphs.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight .Cells(4).Range.Paragraphs.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight 'přičíst sumu ceny bez DPH vynásobenou množstvím suma += Double.Parse(DataGridView1.Rows(i).Cells(2).Value, Globalization.NumberStyles.Currency) * Integer.Parse(DataGridView1.Rows(i).Cells(1).Value) End With Next 
        ...

Nyní projdeme všechny řádky komponenty DataGridView, ve které máme zadány položky naší faktury. Všimněte si, že cyklus běží od 0 do DataGridView1.Rows.Count - 2, tedy do počtu řádků zmenšeného o 2. To proto, že poslední řádek je vždycky prázdný a je určen k vložení nového záznamu. Jakmile do něj začneme psát, ihned se přidá prázdný řádek další. Tento řádek tedy vynecháme.

Budeme pracovat s druhou tabulkou v dokumentu - jak už jsem psal dříve, adresy dodavatele a odběratele jsou v samostatné tabulce o dvou sloupcích a jednom řádku. Tabulka pro položky je tedy v ActiveDocument.Tables(2) - v této knihovně narozdíl od zbytku .NET frameworku číslujeme od jedničky. Do této tabulky přidáme zavoláním Rows.Add nový řádek a to celé dáme do With bloku. Cokoliv uvnitř začne tečkou, bude tedy pracovat s tímto nově přidaným řádkem.

Nejprve přes Shading.BackgroundPatternColor nastavíme barvu pozadí řádku na bílou - nový řádek totiž vždy kopíruje styl toho předchozího, což je v našem případě světle modré záhlaví. Dále nastavíme Range.Font.Bold na hodnotu 0, čímž vypneme tučné písmo (záhlaví totiž tučné je). Pak již jen vypisujeme hodnoty buněk - kolekce Cells přistupuje k jednotlivým buňkám a opět pomocí Range.Text nastavíme jejich hodnoty. Aby se čísla a ceny zarovnaly správně, nastavíme jim vlastnost Range.Paragraphs.Alignment na příslušné hodnoty,; název položky zarovnáváme doleva, množství a ceny doprava.

Nakonec ještě do proměnné suma přičteme celkovou cenu za položku, tedy množství vynásobené jednotkovou cenou. Protože cena v tabulce je již formátovaná jako měna (např. 13,25 Kč), pomocí Double.Parse z tohoto řetězce získáme původní desetinné číslo. Sumu počítáme proto, že chceme pod položky přidat ještě jeden řádek s celkovou cenou bez DPH i včetně.

        ...
 
'přidat řádek se spočítanou celkovou cenou With w.ActiveDocument.Tables(2).Rows.Add() 'nastavi bílou barvu pozadí řádku .Shading.BackgroundPatternColor = Microsoft.Office.Interop.Word.WdColor.wdColorGray10 'nastavit tučné písmo .Range.Font.Bold = 1 'vyplnit hodnoty buněk .Cells(1).Range.Text = "CELKEM" .Cells(2).Range.Text = "" .Cells(3).Range.Text = String.Format("{0:c2}", suma) .Cells(4).Range.Text = String.Format("{0:c2}", suma * 1.19) 'nastavit zarovnání buněk .Cells(1).Range.Paragraphs.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphLeft .Cells(3).Range.Paragraphs.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight .Cells(4).Range.Paragraphs.Alignment = Microsoft.Office.Interop.Word.WdParagraphAlignment.wdAlignParagraphRight End With

...

Tento blok je velmi podobný - přidá do druhé tabulky další řádek, nastaví mu tentokrát pozadí na 15% šedou, zapne tučné písmo, a vyplní celkové ceny bez DPH i s DPH. Provede i zarovnání. Tím je dokument hotov, tedy až na poslední věc - uložení a zobrazení výsledku.

        ...
 
'povolit prvky na formuláři Me.Enabled = True 'uložit dokument SaveFileDialog1.FileName = IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "Faktura_" & Now.ToString("yyyy-MM-dd") & ".doc") 'pokud uživatel vybral soubor, zobrazit fakturu If SaveFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then 'uložit dokument w.ActiveDocument.SaveAs(SaveFileDialog1.FileName) 'schovat toto okno a zobrazit Word Me.WindowState = FormWindowState.Minimized w.Visible = True Else 'ukončit Word, neukládat změny w.Quit(False) End If
End Sub

Generování je hotovo, takže již můžeme povolit ovládací prvky na formuláři. Dále do dialogu pro uložení souboru vygenerujeme nějaký název souboru - Faktura_Datum.doc a umístíme jej do složky Dokumenty (nebudeme rozhodně vypisovat cestu do dokumentů natvrdo, v každé verzi Windows je totiž trochu někde jinde, místo toho použijeme My.Computer.FileSystem.SpecialDirectories.MyDocuments; zde máme i další cesty, použili jsme už cestu do složky Obrázky).

Cestu už máme, zobrazíme tedy dialog pro uložení souboru. Pokud uživatel kliknul na OK, dokument tam metodou Save uložíme, pak zminimalizujeme okno naší aplikace a objektu aplikace Word nastavíme hodnotu Visible na True, čímž aplikaci Word normálně zobrazíme. Pokud uživatel kliknul při uložení na tlačítko Storno, zavoláme Quit, abychom Word ukončili. Jako parametr předáme False, aby se Word neptal na uložení změn v dokumentu. To je celé, výsledek vypadá asi takto:

Data zadaná v aplikaci

Vygenerovaná faktura

Fakturu můžeme snadno vytisknout, uložit nebo odeslat e-mailem. Toto řešení samozřejmě vyžaduje nainstalovanou aplikaci Microsoft Word. Základním využitým principem je vkládání textů, případně obrázků, na místa předem určených záložkami, a dále přidání řádků do tabulky a vyplnění jejích buněk. To vše díky promyšlenému objektovému modelu aplikace Microsoft Word. Podobným způsobem lze generovat tabulky v aplikaci Microsoft Excel, opět stačí přidat jedinou knihovnu. Možnosti jsou opravdu veliké. Celá aplikace pro vytváření faktur je ke stažení, jen upozorňuji, že udaje o firmách jsou smyšlené a odráží mé momentální psychické rozpoložení.

Kompatibilita jednotlivých verzí

Dokud aplikaci používáte jen pro vlastní účely, je vše v pořádku. Potíž ale je, pokud chcete aplikaci nasadit na počítače s jinými verzemi Office. Ty si již rozumět nemusí. Obecně se doporučuje přidat do projektu knihovny té nejstarší verze Office, která je k dispozici. Další verze by totiž měly být zpětně kompatibilní. Pokud ale mám pouze Office 2007, pak pravděpodobně aplikace spustit na starších nepůjde, selže totiž kontrola verzí knihoven. Takže lepší je vyvíjet pro verze starší.

Pokud Vám aplikace spustit nepůjde, otevřete projekt ve Visual Studiu, ve vlastnostech projektu odeberte reference na knihovny Wordu, a přidejte je znovu. Je to tou kontrolou verzí knihoven, starší Office bohužel nemám.

 

hodnocení článku

1 bodů / 1 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Mohlo by vás také zajímat

Řešené příklady v ASP.NET - díl 1.: Aplikace pro zamlouvání sedadel (část 1)

V této části vytvoříme databázi, napíšeme základní infrastrukturu a nakonfigurujeme přihlašování uživatelů pomocí knihovny Altairis Web Security.

Windows Presentation Foundation (WPF) - díl 4.: Architektura a objektový model WPF

Na jaké kompromisy museli architekti WPF frameworku přistoupit, aby nabídli vývojářům pohodlný vývoj ve vyšších programovacích jazycích a zároveň odpovídající výkon výsledného uživatelského prostředí? Tento článek se věnuje architektuře WPF frameworku.

Práce s časovými pásmy a letním časem v aplikaci a databázi - díl 2.: DateTime v .NET Frameworku

Práce se strukturou DateTime v .NET Frameworku lze využívat pro práci s lokálním časem i časem v jiných časových pásmech. Tento díl se věnuje základnímu popisu a konverzím mezi lokálním a UTC časovým údajem.

 

 

Nový příspěvek

 

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Pěkný článek.

Ještě k doplnění. Pokud budete chtít změnu velikosti písma, nebo barvu písma, použijte

tohle. Nikde jsem to nemohl najít, tak jsem trošičku experimentoval. V dalším řádku tabulky je nutné vrátit vše zpět.

 .Range.Font.Size = 12  'velikost písma
 .Range.Font.Italic = True  'nakloněné písmo
 .Range.Font.ColorIndex = Microsoft.Office.Interop.Word.WdColorIndex.wdRed  'vytvoří červenou barvu písma
nahlásit spamnahlásit spam 0 odpovědětodpovědět

jak vyplnit dokument

Dobrý den,z e-mailu jsem si stáhla dokument ve wordu,dokument se zobrazil ale nejde do něho z klávesnice psát.V čem je moje chyba? Děkuji.Dana

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Jsem nyní trochu nejistý v účelnosti takové práce. Budu-li mít Word, potřebu a chuť dělat v něm faktury, nebudu si kombinovat život s VB a odbudu vše ve Wordu.

Kdyby měl být tisk faktur součastí většího projektu tvořeného ve VB a zejména měl-li být pogram šířeji použitelný, pak použití Wordu vidím jako nevhodné a musel bych si dát tu práci a napsat všechno sám.

Proto si myslím, že článek pro možnost bez Wordu by byl užitečnější.

nahlásit spamnahlásit spam -2 / 2 odpovědětodpovědět

Obávám se že jste nepochopil účel článku. Pokud budu tisknout jednu fakturu, rychleji si to opravdu udělám ručně. Pokud budu mít databázi a budu potřebovat faktur sto, asi by se mi to ručně vypisovat nechtělo.

Možná by bylo zřejmější, kdybych jako příklad udělal program, který vyplní faktur víc, a to nějakými daty z databáze, ale nechtěl jsem to zbytečně komplikovat. Koneckonců tento článek měl ukázat obecný princip, je jasné, že moji aplikaci na faktury nikdo používat nebude, ani já sám.

Již několikrát jsem sem psal, že pokud bychom chtěli celou fakturu generovat ručně ve Visual Basicu .NET, není s tím problém, až na to, že to je nesrovnatelně pracnější, aby to nějak vypadalo (zarovnání na střed, doprava a podobně, to není jen tak). Ve většině případů je lepší použít něco, co už máme.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Byl jste o chviličku rychlejší. Ve chvíli, kdy jste svůj příspěvek vystavil, jsem šel změnit poslední větu mého příspěvku:

"Proto si myslím, že článek pro možnost bez Wordu by byl užitečnější."

na znění

Proto si myslím, že článek pro možnost bez Wordu by byl TAKÉ UŽITEČNÝ.

Neměl jsem v úmyslu kritizovat ani článek, ani Váš postup výkladu. A v používání Wordu do aplikací mám velmi špatné zkušenosti jako uživatel a jsem jistě jimi ovlivněn. Ale zas nemám tolik zkušeností, abych rozhodl, zda vinu má samotné použití Wordu anebo tvůrce aplikace.

Omlouvám se.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Není za co se omlouvat, já to vůbec neberu jako kritiku. Je pravda, že většina aplikací spolupracujících s Wordem není napsaná úplně ideálně, ale osobně se mi řešení tohoto druhu líbí víc než když každý píše všechno úplně od začátku a díky tomu je pak nekompatibilní se zbytkem světa.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Máme opačné zkušenosti a polemika na téma použití Wordu obecně by patřila jinam. Asi proto se nemohu smířit s názorem, že Word do profesionální aplikace patří (dle mého nepatří a do aplikace vyvíjené bez prostředků MS tuplem ne - to je ten případ mých špatných zkušeností). Stejně nesouhlasím s názorem, že aplikace bez Wordu je nekompatibilní se zbytkem světa. Vidím to úplně naopak.

Navrhuji však otázku více nerozvádět a ponechat si každý svůj názor.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Ale tahle aplikace je vyvíjená s prostředky Microsoftu, celý .NET Framework je od Microsoftu. A dále se chci zeptat - ukažte mi formát, který otevřete na minimálně stejném množství počítačů a který bude snadno upravovatelný a tisknutelný, což je naším cílem. I když zde jsou jisté rezervy, DOC otevřete jak v MS Office, tak v OpenOffice, ať se vám to líbí nebo ne. A drtivá většina firem Office má. Dále to již rozvádět nehodlám, pokud se vám to nelíbí, napište to bez Wordu a třeba se domluvíme, že byste zde svůj článek mohl publikovat.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak to ne, článek ode mne, od začátečníka, nemůžete čekat. Programátor ze mne již nebude. Moje programy jsou splácaná amatérská "udělátka", s jejich kódem bych se nechlubil, Vaše znalosti nikdy mít nebudu, neberte mne za sobě rovného ani za soupeře, vzdávám se předem.

Oba to nechceme rozvádět, nechci Vás na nic přesvědčovat, tak odpuste, že na položený dotaz neodpovím. Opravdu to není problém, který bych chtěl řešit. Kdybych musel udělat fakturaci s Wordem, zůstal bych v něm, jak jsem napsal. Pro více faktur bych použil hromadnou korespondenci. A nevěřte, že situace s přenositelností DOC formátu je tak světlá, nemusíte ani opouštět půdu MS, stačí rozdíly i v sousedních verzích.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

OK, ale přesto je to nejkompatibilnější formát. Ať se nám to líbí nebo ne, používá se opradvu všude.

Jinak hromadná korespondence je fajn, ale nenapojíte ji na všechny datové zdroje.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Nerad bych tady rozpoutal flame, ale můj názor na uživatele, kteří se neumí "domluvit" s wordem a následně ho nepovažují za profesionální produkt, je vyhraněný.

Problém je to, že zatímco Word je profesionální produkt, jeho uživatelé ne. Proto, pokud se snaží dosáhnout jisté funkčnosti halabala (bez zachování pravidel formátování dokumentu), pak se například nemohou divit, že jiné verze wordu nezobrazují dokument stejně.

V tomto případě nemusí jít ani o jiné verze Wordu. Dokonce stejná verze s jiným přednastavením zobrazí špatně naformátovaný dokument odlišně. Ale to není potíž s Wordem, nýbrž s uživatelem.

Když jsem psal svou diplomovou práci, formátoval jsem jednotlivé odstavce znovu a znovu, protože jsem se s Wordem nemohl domluvit. Pokaždé, když jsem aktualizoval obsah, rozhodilo se veškeré formátování. Umíte si představit, že tehdy jsem proklel MS do posledního muže. Ale byla chyba ve Wordu?

Nikoliv, chyba byla ve mně, protože jsem svou diplomku formátoval s prominutím blbě. Čili pokud chcete soudit odlišnosti v zobrazení různých verzí Wordu, nepoužívejte prosím dokument, který naformátoval běžný Franta uživatel. Pokud použijete korektně zformátovaný dokument s nadefinovanými styly, výsledek by měl být stejný.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

No, zase na druhou stranu Word by si měl poradit i s "blbě" naformátovanými dokumenty, pokud jde o samotný formát DOC, není příliš šťastně navržen. Tím spíš je to problém, že vždycky bude počítače ovládat 95% běžných uživatelů a jen hrstka lidí, kteří tomu rozumí.

Ale je jasné, že většina lidí na Word nadává, protože jej neumí používat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přátelé, když už se tady rozproudila takto živá diskuse nedá mi to, abych se nepřipojil i se svým názorem a abych se tak trochu nezastal pana Rennera.

Nejsem totiž až natolik přesvědčen (alespoň já to v jeho příspěvcích otevřeně nezaznamenal), že by pan Renner jakkoliv haněl profesionální kvality Wordu.

Já alespoň cítil podstatu jeho sdělení v pochybnosti o míře účelnosti propojení aplikace ve VB s Wordem, že ne vždy je tato cesta ideální. A já s ním nemohu než souhlasit ač předesílám, že Word považuji za velice kvalitní nástroj, ale...

Osobně celou záležitost hodnotím následovně:

Pokud beru předložený článek jako příklad možností propojení a způsobu práce aplikací VB s produkty MS Office (obecně), pak není o čem polemizovat, opět velká jednička panu Hercegovi.

Pokud bych ale uvedené téma hodnotil skutečně z hlediska praktického přínosu (a myslím, že panu Rennerovi šlo právě o tento aspekt), pak bych na věc pohlížel ze dvou různých úhlů. Buď potřebuji rozšířit funkcionalitu svého Wordu o možnost automatizace tisku faktur, pak ANO (otázka zdali by pro tento účel člověk sáhnul po VB nebo to spíchnul přímo ve VBA).

Pokud chci aplikaci, která je zaměřena na tvorbu podkladů pro další zpracování ve Wordu (díky skutečně široké míře přenostitelnosti), pak opět ANO.

Pokud chci ale vyprodukovat plnohodnotnou aplikaci, u které mám v úmyslu umožnit tisk výsledků, pak si nedovedu dost dobře představit situaci, že bych distribuoval svou aplikaci (třeba jako freeware) s tím, že si k ní uživatel musí dokoupit Office.

Ano, je možno si nainstalovat i levnější řešení dalších producentů, kteří alespoň na úrovni čtení podporují .doc formát (ale sám asi víte, že i tato podpora má své hranice a jedná-li se o propracovanější stránku tak výsledek málokdy (po grafické stránce) odpovídá původnímu zdroji, stejně tak nevím, v kolika z těchto "jiných" řešení by šlo připravit tu šablonu, kterou v aplikaci modifikujeme.

Proto si myslím, že pan Renner podotkl, že článek na téma plnohodnotný tisk by byl minimálně stejně přínosným.

Jsem si vědom, že toto téma je dost náročné, ale pokud jsem to dobře pochopil, tak hlavně "na otročinu", protože musím vše do poslední mrtě na tiskárnu "vykreslit" sám.

Ale přesto by i dle mého názoru nebylo od věci (a neslo by se to plně v duchu tohoto webu - vždyť se snažíme porozumět nástrojům VB a používat je), kdybyste se někdy do budoucna mohli zamyslet nad možností alespoň letmého seznámení s možnostmi jmenného prostoru System.Drawing.Printing, resp. se specifiky použití v něm obsažených objektů, protože vlastní (otrocký) tisk by měl být dost podobný tomu, co právě probíráme v seriálu o grafice - s tím už si my, Vaši žáčci, můžeme pohrát sami.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za tento příspěvek. Neděkuji za podporu v mých názorech, neboť neberu zdejší polemiku jako spor, ale jako prezentaci osobních zkušeností a znalostí a jiné názory či zkušenosti respektuji, i když sám mám rozdílné. Děkuji za to, že jste popsal mé názory tak, jak jsem nedokázal.

Výměny názorů si cením právě pro jejich odlišnost. Nikdy není pozdě, aby se člověk poučil.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přesně tak. Nešlo vůbec o vlastní faktury, ale o obecnou záležitost ve Wordu.

ten článek je naopak velmi vhodný. A dělat si v něm faktury přitom rozhodně nebudu.

Saša

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Jsem úplný začátečník, takže VB.NET téměř neovládám. Promiňte mi proto možná hloupý dotaz. Velmi se mi líbil tento příspěvek a protože potřebuji něco podobného vyřešit, rozhodl jsem si program vyzkoušet. Narazil jsem tam ale na problém s knihovnou Wordu. Zkoušel jsem Word2003 a WordXP a po nainstalování knihovny mi to za slovem Office nabízelo pouze toto a nic jiného:

'spustit Word

Dim w As New Microsoft.Office.Core.

Když jsem ale nainstaloval zkušební verzi Wordu 2007 a stejným způsobem zaregistroval knihovnu, nabídka byla mnohem širší, mimo jiné o kýžené Interop.Interop.Word.Application()

Nevím tedy, jestli někde dělám chybu já nebo se Word v předchozích verzích otvíral nějakým jiným způsobem. Psal jste, že to nemáte možnost vyzkoušet na jiné verzi Wordu, přesto by mě ale zajímalo, jak by to ve staré verzi mělo být, nebo kde dělám chybu.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

zdravím,

mám dotaz pro použití když má někdo instalovano jen Office START 2010 verzi jestli se dá tento příklad práce s wordem/excelem nějak použít. Proč se na to ptám. Zjistil jsem že start verze office asi neobsahuje knihovnu microsoft.office.interop.word.dll (i excel) a tím pádem nefunguje použití podle této kuchařky. Dá se to nějak řešit? Existuje nějaký jiný způsob jak s pomocí VB doplňovat věci do wordu/excelu když se jedná o START office verzi.děkuji

Choze

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Nemůžu nikde najít vlastnost format v DataGridViewu

když si dám Edit columns... a vyberu Cena s DPH tak tam nikde nevidím možnost zadat hodnotu vlastnosti format

Microsoft Visual Studio 2010 Professional

Verze 10.0.40219.1 SP1Rel

Microsoft .NET Framework

Verze 4.0.30319 SP1Rel

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Pokud bych chtěl, aby součást řádku faktury byl i čárový kód. Máte nápad, jak to udělat?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to je uplna brnkacka, existuje font (resp. fonty), ktere misto cisel (pismen) jsou tvoreny carovym kodem. proste napisete retezec, nastavite prislusny font a je to

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Pri generovaní položiek do tabuľky 2 vidím veľkú záhadu:

        For i As Integer = 0 To DataGridView1.Rows.Count - 2 
            With w.ActiveDocument.Tables(2).Rows.Add() 
                .Shading.BackgroundPatternColor = Microsoft.Office.Interop.Word.WdColor.wdColorWhite
                .Range.Font.Bold = 0
                .Cells(1).Range.Text = DataGridView1.Rows(i).Cells(0).Value
...
            End With
        Next

Tu vidím, že počas behu jednej "otáčky" cyklu je vlastne pomocou "With" volaná metóda "...).Rows.Add(). ..." niekoľkoráz, hoci by mala byť pri každom prechode cyklu zavolaná len raz a potom už jednotlivé vlastnosti v riadku len nastavované (".Cells(<číslo>)." aj pridáva nové stĺpce, ako som zistil). Napriek tomuto nelogickému kódu je výsledný dokument vytvorený správne !

Ale keď som to isté vyskúšal v C#, tak tam to skutočne pre každý ".Rows.Add()." vytvorilo nový riadok (C# nemá príkaz "With"). Musel som po prvom ".Rows.Add()." už ďalej používať len ".Rows[<číslo_riadku>]. ...", tak, ako by to zdravý rozum napovedal.

Rozumiem snáď nejako nesprávne príkazu "With" vo VB.NET, alebo je to vo VB.NET nejaká chyba ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ta záhada nebude asi tak velká.

Sice k dané metodě v objectbrowseru se toho moc nedočtete (a na MSDN se mi teď nechce lézt, ale hlavní je, že se jedná o funkci s návratovou hodnotou typu Microsoft.Office.Interop.Word.Row , jinak řečeno, konstrukce With ve VB evidentně nepracuje systémem, že by pouze opsala ten text, který programátor zadal všude tam, kde v těle nalezne výraz začínající tečkou, ale ten výraz provede a dále dosazuje jeho výsledek.

Takže tady evidentně dochází k tomu, že se v řádku s With provede přidání nové řádky do tabulky, vrátí se odkaz na tuto novou řádku a dále se již pracuje pouze s tím odkazem.

Takže se to, myslím, chová docela logicky.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ach tak, tak to som nerozumel celkom tomu "With". To ale znamena, ze za "With" mozem napisat len nieco, co bude volanim metody, vracajucej adresu (odkaz). Znie to logicky, to by take chovanie naozaj vysvetlovalo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ne tak docela. Funguje to i s typy hodnotovymi, napr se strukturami. Ono si to tu referenci vytvori vnitrne.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

To Automatické uložení nastavených hodnot funguje akosi podivne.

Keď ho prepnem na "Application Scope", tak nefunguje, a keď ho vrátim na "User Scope", otáva už stále nefunkčné.

Pokým to funguje, tak vytvára podadresáre a v nich *.config záznamy v adresári "C:\Documents and Settings\<meno_uzivatela>\Local Settings\Application Data\..."

Ale v C# to nefunguje vôbec, hoci kompilátor to bez problémov zožerie.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Som zaciatocnik, skusal som experimentovať.

Podklady z tejto diskusii uvedeneho kodu z clanku od Tomáš Herceg .

Original funguje, moj vytvor nie.Zalozky vo fakture a nacitanie faktura.docx podla autora.

Public Class Form1
    Dim faktura As Integer
    Dim objednavka As Integer

    Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles Button1.Click
        'zakázat ovládací prvky v aplikaci
        Me.Enabled = False
        'spustit Word
        Dim w As New Microsoft.Office.Interop.Word.Application()
        'otevřít dokument Faktura.doc a aktivovat jej
        w.Documents.Open(IO.Path.Combine(Application.StartupPath, "Faktura.docx")).Activate()

        faktura = 124567
        objednavka = 1245


        'provést náhrady textů
        With w.ActiveDocument.Bookmarks
            'adresa odběratele
            .Item("faktura_cislo").Range.Text = faktura
            .Item("objednavka_cislo").Range.Text = objednavka
        End With
    End Sub
End Class

hlasi chybu:

Error 1 Unable to copy file "E:\Moj e-Schop\Faktury\Faktura.docx" to "bin\Debug\Faktura.docx". The process cannot access the file 'bin\Debug\Faktura.docx' because it is being used by another process.WindowsApplication1

Fakturu.docx otvori, ale hodnoty faktura,objednavka nezapise + vyssie uvedena chyba.

Uz to funguje > z textbox nacitam do premennych a potom sa objavi zmena vo word.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Zdravím pana Hercega, myslím, že MS Word je fajn, ale lepší aplikace by byla v Excelu, protože většina z nás faktury dává do Excelu, protože je snadnější a lepší práce s tímto souborem.

Přeji pěkný den.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Mohol by som Vas poprosit o radu, ako zobrazeny dokumet zabespecit proti prepisaniu? Teda že dokumet sa zobrazi, ale uzivatel nebude moct menit jeho obsah, resp. bude moct obsah iba vytlacit?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Pri vykonani kroku :

w.Documents.Open("D:\VB_dot_NET_pokusy\Pokus_011\Faktura.doc").Activate()

mi to ohlasi chybu:

"The server threw an exception. (Exception from HRESULT: 0x80010105 (RPC_E_SERVERFAULT))".

Taku istu chybu aj pri pouziti suboru "Faktura.dot" - teda "Wordovskej" sablony.

(Podotykam: subor sa na uvedenom mieste naozaj nachadza ...)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Prosím o radu, jak mohu zjistit, zda je Word (nebo jiná aplkace spuštěna). Jak vytvořit dokument nebo spustit Word je hračka, ale zjistit jejich existenci je pro mne zatím neznámo.

Děkuji za odpověď

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Je ve stručnosti pomocí API (jen jsem to psal ještě ve VB 6)

Dim NajdiOkno As Long

Dim Messages As Long

'Namísto "Microsoft Visual Basic" použij název okna např. "Microsoft Word"

NajdiOkno = FindWindow(vbNullString, "Microsoft Visual Basic")

If NajdiOkno <> 0 Then

'je spuštěnej

else

'tak není spuštěnej :)

end if

Zdravim Radim K.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Já testuji, jestli je přítomna instance takto :

<summary>

</summary>

<returns></returns>

<remarks></remarks>

Private Function testWRDRunning() As Boolean

On Error Resume Next

' GetObject volana bez parametru cesty na dokument

' vraci referenci na instanci aplikace. pokud instance

' aplikace neběží,vrací chybu.

Dim WRDObj As Object = GetObject(, "Word.Application")

If Err.Number = 0 Then

Err.Clear()

WRDObj = Nothing

Return True

Else

Err.Clear()

WRDObj = Nothing

Return False

End If

WRDObj = Nothing

End Function

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Dobrý den,

měl bych dotaz. Potřebuji se navázat na běžící proces.

Jednoduše je spuštěna aplikace Word a já do ní chci vstoupit a pokračovat.

Nebo-li naplnit s ní objekt Microsoft.Office.Interop.Word.Application. Je na

to možné nějaké řešení? Víte?

Dík moc.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Zkuste třeba:

Public Class Form1
    Private w As Microsoft.Office.Interop.Word.Application
    Private docu As Microsoft.Office.Interop.Word.Document



    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        w = GetObject(, "Word.Application")
        docu = w.ActiveDocument
        docu.Save()


    End Sub
End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A odkud je metoda GetObject

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

koukněte do objectbrowseru:

Public Function GetObject(Optional ByVal PathName As String = Nothing, Optional ByVal Class As String = Nothing) As Object

Member of: Microsoft.VisualBasic.Interaction

Summary:

Returns a reference to an object provided by a COM component.

Parameters:

PathName: Optional. String. The full path and name of the file containing the object to retrieve. If PathName is omitted, Class is required.

Class: Required if PathName is not supplied. String. A string representing the class of the object. The Class argument has the following syntax and parts:appname.objecttypeParameterDescriptionappnameRequired. String. The name of the application providing the object.objecttypeRequired. String. The type or class of object to create.

Return Values:

Returns a reference to an object provided by a COM component.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

No dík. Od začátku se snažím na to přijít, ale vytvářím to v C#, takže taková fce tam není. Proto se ptám. Ale dík. Pokud nevíte jak jinak, nebo jak to přepsat do Céčka, tak dík moc.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

V C-čku Vám, bohužel, neporadím, ale zkuste se poohlédnout, jestli tam nemáte něco jako ve VB knihovnu system.runtime.interopServices a pokud jo, koukněte, nemáte-li v ní metodu podobnou tomu, co je ve VB, tedy Marshal.GetActiveObject("....")

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Taky jsem to řešil a nakonec jsem na to použil Marshal.GetActiveObject("<jmeno_com_objektu>") (je potřeba namespace System.Runtime.InteropServices)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Dobrý den,

nevíte jak ovládat Word 2007 i 2003 ? (pro různé PC)

Private w As Microsoft.Office.Interop.Word.Application

Private docu As Microsoft.Office.Interop.Word.Document

toto funguje pouze pro 2007.

díky.

D.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Především chci poděkovat za super "kuchařku", která mi pomohla při tvorbě jednduchého prográmku pro vyplňování hlaviček firemních formulářů. Protože jsem ale ryzí amatér, mám problémy se stejným úkolem, ovšem v Excelu. Předpokládám, že postup je v podstatě stejný, a že se nějakým způsobem při vyplňování buněk proměnným z VB odvoláváme přímo na danné buňky (místo záložek).

Analogií s uvedeným příkladem faktur jsem vytvořil:

'spustit Excel

Dim ex As New Microsoft.Office.Interop.Excel.Application()

'otevřít dokument pokus.xlsx a aktivovat jej

ex.Workbooks.Open("D:\pokus.xlsx").Activate()

To snad funguje, chyby nastaly dál. Zkoušel jsem např:

With ex.ActiveCell.Cells()

With ex.ActiveSheet.bookmarks

.Item("A2").Range.Text = TextBox1.Text

.Item("A2") = TextBox1.Text

.Cells("A2") = TextBox1.Text

Moc Vás proto prosím o radu, jak postupovat dál. Děkuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Děkuji za Váš článek. Narozdíl od jiných se domnívám, že článek je velice užitečný, neboť možnosti snadné komunikace s prostředky MS office jsou málokdy a málokde řešeny. Podrobný příklad se tedy vždy hodí. Ostatně nemusí se vždy jednat o fakturu, ale může to být objednávka, nabídka katalogu a pod. Jako příklad je to určitě dobrý.

otázka 1. jak vybrat šablonu Word nebo, jak přiřadit šablonu nějakému přihlášenému uživateli (atributu z databáze).

otázka 2:

Chtěl bych si podobnou jednoduchou aplikaci vyzkoušet ve VS projektu pro WEB. Nyní jsem si stahnul WS 2008. Ale nepřišel jsem na to, jak zde připojit tu knihovnu MS Word a případně jaké další odlišnosti zde jsou.

Za případnou odpověď děkuji.

Škeřík

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Toto řešení je bohužel pro použití na webu naprosto nevhodné - instalovat Office na server rozhodně nedoporučuji a na žádném webhostingu vám to neudělají. V nejbližší době napíšu jiný článek, jak generovat dokumenty ve Wordu v novém formátu Office Open XML, který je pro tento účel lépe připraven. Pro generování těchto dokumentů není třeba mít nainstalovaný office na serveru nebo na počítači, kde se generování provádí. Navíc nové formáty fungují již od verze 2000 díky compatibility packu, který je zdarma ke stažení.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Diskuse: Práce s dokumenty Microsoft Word z VB.NET

Zdravim, ako ukazka automatizacie Wordu pekny clanok, samy ste ale uznali (a potvrdzuju to aj moje skusenosti), ze je to problematicka technika, mohli by ste skusit spravit ukazkovy program s pouzitim Crystal Reportu (tlac cez Crystal Report)?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkusím zjistit, jak to funguje, a pakliže budu mít čas, určitě o tom něco napíšu. Chystám se na to již delší dobu, ale stále jsem se k tomu ještě nedostal.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Je tu jeden zásadní rozdíl

MS Word šablonu vytvoří každý a snadno - každý to umí - a pokud použije nějaké smluvené záložky (názvy) pro přebírání datových položek z apikace, pak máme univerzální projekt s možností uživatelské tvorby tiskových sestav, přímo ve Wordu, teda s přívlastkem EASY.

To se rozhodně o Crystal reportu říci nedá. Uživatel si neupraví nic, takže tu bude jeden vzhled faktury/objednávky/čehokolivu, který musí předem připravit programátor. Takovou aplikaci nikdo nechce, a když zjistí, že musí ještě ten CR instalovat, tak to ten MS Word má dnes skoro každý už nainstalovanej.

A mezi námi Ten CR toho umí sice docela dost, ale pracovat s ním, je docela humus. Zatím je to jeden z nejhorších tiskových generátorů, co jsem kdy viděl.

Škeřík

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback