DocX

DocX

Avtor: Sabina Oražem

Uvodne besede

Kaj je to DocX?

To je .NET knjižnica, ki dopušča delo s tekstovnimi datotekami. Za uporabo ne potrebujemo nameščenega Microsoft Word-a ali Office-a.

Zakaj DocX?

Pred knjižnico DocX sta obstajali dve metodi preko keterih smo lahko programsko urejali (ustvarili) .docx datoteko:

  • Office Interop (referenca na Microsoft.Office.Interop.Word)
  • OOXML SDK (referenci na DocumentFormat.OpenXml in WindowsBase)

Ob primerjavi vseh treh je najpreprostejša uporaba DocX knjižnice.

Kaj potrebujem?

S spleta si lahko brezplačno naložite vse potrebno. Potrebujemo (zadnjo) različico DocX-a (DocX.dll), naložiti pa je potrebno še .NET framework in seveda Visual Studio 2010.

Kakšne so glavne zančilnosti DocX-a?

Preko programa v Visual Studio lahko vstavimo, odstranimo ali zamenjamo besedilo v tekstovni datoteki.

Na voljo je standardno oblikovanje teksta (Font (Bold, Italic, Underline,...), Family, Size, Color, Script).

Preprost primer zamenjave besedila (v angleščini)

DocX omogoča tudi delo z slikami, povezavami na spletno stran, tabelami, označevanjem strani in še kaj.

Nekaj osnovnih metod

Odprimo .docx datoteko:

  • DocX datoteka = DocX.Load("Input.docx")

Ustvarimo novo .docx datoteko:

  • DocX datoteka = DocX.Create(@"Test.docx")

Koliko slik vsebuje .docx datoteka?

  • -  document.Images.Count()

V .docx datoteko dodamo nov odstavek:

  • Paragraph odstavek = datoteka.InsertParagraph("Besedilo v odstavku...")

Odstavku določimo stil pisave:

  • odstavek.Bold();
  • odstavek.Italic();

Odstavku določimo velikost pisave:

  • odstavek.FontSize(velikost pisave);

V besedilu zamenjamo del besedila:

  • datoteka.ReplaceText("Trenutno besedilo", "Novo besedilo");

Odstavku dojamo besedilo:

  • odstavek.Append("Dodano besedilo.");

Nekaj osnovnih metod

Besedilu dodajmo povezavo na spletno stran:

  • Hyperlink spletna_povezava = datoteka.AddHyperlink("Ključna beseda", new Uri(povezava_na_stran));
  • odstavek.AppendHyperlink(spletna_povezava);

Tekstovni .docx datoteki dodajmo sliko:

  • Novacode.Image slika = datoteka.AddImage(ime_slike);
  • Picture s = slika.CreatePicture();
  • odstavek.AppendPicture(s);

Izberimo prvo sliko v datoteki in jo shranimo v spremenjivko 'img':

  • Novacode.Image img = document.Images[0];

Shranimo spremembe (ali na novo ustvarjeno) na .docx datoteki:

  • dokument.Save();

Dodajmo datoteki glavo in nogo:

  • datoteka.AddHeaders();
  • Header glava_dokumenta = datoteka.Headers.odd; --> sode strani
  • datoteka.AddFooters();
  • Footer noga_dokumenta = datoteka.Footers.odd;

Tudi:

  • Footer noga_dokumenta = datoteka.Footers.even; --> lihe strani
  • Footer noga_dokumenta = datoteka.Footers.first; --> le prva stran

Določimo »kot kaj« bi radi .docx datoteko shranili ( podamo ime datoteke):

  • document.SaveAs("ime_datoteke.docx");

Kako besedilo zamenjamo, dodamo, poravnamo levo/desno, zamaknemo in določimo velikost pisave?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Drawing;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
using Novacode;
using System.Drawing.Imaging;


namespace vajaDocX1
{
    class Program
    {
        static void pisi_na_datoteko(string ime_datoteke)
        {
            // odpremo .docx datoteko
            using (DocX datoteka = DocX.Load(ime_datoteke))
            {
                // dodamo nov odstavek
                Paragraph odstavek = datoteka.InsertParagraph("Levo poravnan odstavek").FontSize(18);
                // odstavek naj bo levo poravnan
                odstavek.Direction = Direction.RightToLeft; // obratno = Direction.LeftToRight

                // v besedilu zamenjamo niz "Spletna stran" z nizom "bla-bla"
                datoteka.ReplaceText("Spletni naslov", "Zamenjano besedilo");

                // dodamo nov odstavek
                Paragraph odstavek1 = datoteka.InsertParagraph("FMF\n Fmf\n fmf").FontSize(18); // določimo velikost pisave
                // zamaknemo prvo vrstico odstavka
                odstavek1.IndentationFirstLine = 1.0f;
                // spremembe shranimo
                datoteka.Save();
            }
        }
    }
}

Kako besedilo zamenjamo, dodamo, poravnamo levo/desno, zamaknemo in določimo velikost pisave?

(slika1.png)
Tekstovna datoteka pred zagonom programa, torej pred urejanjem
(slika2.png)
Tekstovna datoteka po zagonu programa

Kako tekstovni datoteki dodamo sliko?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Drawing;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
using Novacode;
using System.Drawing.Imaging;


namespace vajaDocX1
{
    class Program
    {
        static void dodaj_sliko(string ime_datoteke, string ime_slike)
        {
            using (DocX datoteka = DocX.Create(ime_datoteke))
            {
                // tekstovni datoteki dodaj sliko
                Novacode.Image slika = datoteka.AddImage(ime_slike);

                // Create a picture i.e. (A custom view of an image)
                Picture s = slika.CreatePicture();
                s.FlipHorizontal = true;
                s.Rotation = 10;

                // nov odstavek
                Paragraph odstavek = datoteka.InsertParagraph();

                // odstavku dodamo sliko
                odstavek.Append("Tekstovni datoteki smo dodali simpatično slikico." + "\n")
                   .AppendPicture(s)
                   .Append("\n" + "Dodali smo jo v nov odstavek in poševno obrnili.");

                // Save all changes made to this document.
                datoteka.Save();
            }
        }
    }
}

Kako tekstovni datoteki dodamo sliko?

(slika7.png)
Tekstovna datoteka z dodano sliko

Kako dodamo besedilo na sliko v tekstovni datoteki?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Drawing;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
using Novacode;
using System.Drawing.Imaging;


namespace vajaDocX1
{
    class Program
    {
        static void pisi_na_sliko(string ime_datoteke_odpri, string ime_datoteke_pisi, string niz_zapisi)
        {
            // odpremo .docx dokument
            using (DocX datoteka = DocX.Load(ime_datoteke_odpri))
            {
                // preverimo, da dokument vsebuje vsaj eno sliko
                if (datoteka.Images.Count() > 0) // preštejemo slike, ki jih vsebuje dokument
                {
                    Novacode.Image slika = datoteka.Images[0]; // izberemo prvo sliko v dokumentu
                    // zapišimo dani niz na sliko v datoteki
                    Bitmap bitmap = new Bitmap(slika.GetStream(FileMode.Open, FileAccess.ReadWrite));
                    // uvozimo objekt Graphics, ki vsebuje metodo za risanje
                    Graphics grafika = Graphics.FromImage(bitmap);
                    // narišemo dani niz
                    // določimo stil, velikost in barvo pisave
                    // določimo zgornji levi koordinati napisa
                    grafika.DrawString(niz_zapisi, new Font("Tahoma", 20), Brushes.Brown, new PointF(0, 0));
                    // shranimo Bitmap
                    bitmap.Save(slika.GetStream(FileMode.Create, FileAccess.Write), ImageFormat.Png);
                }

                else
                    Console.WriteLine("Datoteka ne vsebuje slik.");

                // shranimo dokument pod drugim imenom
                datoteka.SaveAs(ime_datoteke_pisi);
            }
        }
    }
}

Kako dodamo besedilo na sliko v tekstovni datoteki?

(slika3.png)
Tekstovna datoteka pred dodajanjem besedila na sliko
(slika4.png)
Izhodna tekstovna datoteka z dodanim besedilom na sliko

Kako tekstovni datoteki določimo glavo in nogo?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Drawing;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
using Novacode;
using System.Drawing.Imaging;


namespace vajaDocX1
{
    class Program
    {
        static void nastavi_stran()
        {
            using (DocX datoteka = DocX.Create(@"GlavaInNoga.docx"))
            {
                // dodamo podporo za označitve strani
                datoteka.AddHeaders();
                datoteka.AddFooters();

                // določimo glavo in nogo tekstovne datoteke
                Header glava_dokumenta = datoteka.Headers.odd; // .odd --> glavo in nogo določimo le za sode strani
                Footer noga_dokumenta = datoteka.Footers.odd;
                // .even --> glavo in nogo določimo le za lihe strani

                // vstavimo odstavek v glavo tekstovne datoteke
                Paragraph odstavek_1 = glava_dokumenta.InsertParagraph();
                odstavek_1.Append("To je glava dokumenta!!!").Bold();

                // vstavimo odstavek v tekstovno datotekeo
                Paragraph odstavek_2 = datoteka.InsertParagraph();
                odstavek_2.AppendLine("To je besedilo dokumenta.").Bold();

                // vstavimo odstavek v nogo tekstovne datoteke
                Paragraph odstavek_3 = noga_dokumenta.InsertParagraph();
                odstavek_3.Append("To je noga dokumenta!!!").Bold();

                // shranimo datoteko
                datoteka.Save();
                // šele sedaj se datoteka zares ustvari in pojavi v imeniku
            }
        }
    }
}

Kako tekstovni datoteki določimo glavo in nogo?

(slika5.png)
Izhodna tekstovna datoteka z glavo in nogo dokumenta

Kako določimo povezavo na spletno stran (Hyperlink)?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Drawing;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
using Novacode;
using System.Drawing.Imaging;


namespace vajaDocX1
{
    class Program
    {
        static void povezava(string ime_datoteke, string povezava_na_stran)
        {
            using (DocX document = DocX.Create(ime_datoteke))
            {
                // dokumentu dodamo spletno povezavo
                Hyperlink spletna_povezava = document.AddHyperlink("naslovu", new Uri(povezava_na_stran));

                // dokumentu dodamo odstavek
                Paragraph odstavek = document.InsertParagraph();
                odstavek.Append("Spletna stran Fakultete za matematiko in fiziko je na ").FontSize(18);
                odstavek.AppendHyperlink(spletna_povezava).FontSize(18);
                odstavek.Append(". Tukaj najdete tudi povezavo do spletne učilnice.").FontSize(18);

                // shranimo datoteko
                document.Save();
                // šele sedaj se datoteka zares ustvari in pojavi v imeniku
            }
        }
    }
}

Kako določimo povezavo na spletno stran (Hyperlink)?

(slika6.png)
Tekstovna datoteka z povezavo na spletno stran

Kviz- 1. vprašanje

Ali potrebujemo za delo z DocX nameščen Microsoft Word?

Da
Ne

Odgovor je napačen! Ponovno

Odgovor je pravilen! Naprej

Kviz- 2. vprašanje

Katere stile pisav pozna DocX?

Naprej

Odgovor je pravilen! Naprej

Odgovor je napačen! Ponovno

Kviz- 3. vprašanje

Katera je referenca do DocX knjižnice?

Naprej

Odgovor je pravilen! Naprej

Odgovor je napačen! Ponovno

Kviz- 4. vprašanje

Kateri ukaz bo poravnal odstavek desno?

Naprej

Odgovor je pravilen! Naprej

Odgovor je napačen! Ponovno

Kviz- 5. vprašanje

Za katerim ukazom bo dodana slika vidna v tekstovni datoteki? Zaporedje ukazov:

Novacode.Image slika = datoteka.AddImage(ime_slike);
Picture s = slika.CreatePicture();
Paragraph odstavek = datoteka.InsertParagraph();
odstavek.AppendPicture(s);

Izberi eno možnost!

Picture s = slika.CreatePicture();
odstavek.AppendPicture(s);
Picture s = slika.CreatePicture();
Novacode.Image slika = datoteka.AddImage(ime_slike);

Odgovor je napačen! Ponovno

Odgovor je pravilen! Naprej

1. naloga- V igralnici- Vprašanje

Naloga se navezuje na prosojnice Uporabniški vmesnik za delo z nagradami in nagrajenci v igralnici , kjer si lahko problem ogledate bolj podrobno.

V igralnici kjer vsak dan potekajo nagradne igre, imajo opravka z izpolnjevanjem obrazcev za podelitev nagrade.

Obrazec mora vsebovati vse osebne podatke nagrajenca, podatke o nagradi, ki jo je gost prejel ter datum podelitve. Igralnica si je zamislila naslednjo obliko obrazca:

(obrazec_neizpolnjen.png)
Primer praznega obrazca

1. naloga- V igralnici- Vprašanje

Kako bi obrazec izpolnili s pomočjo DocX knjižnice, če imamo že dane vse podatke o nagrajenc in prejeti nagradi.

Pozor: prvotni obrazec mora ostati nespremenjen, saj ga bomo ponovno "uporabili"

(Pomoč: nizi, ki bi jih radi zamenjali, naj bodo zaradi ločljivosti obdani z nekim posebnim znakom, na primer '_')

(obrazec_izpolnjen.png)
Primer izpolnjenega obrazca

1. naloga- V igralnici- Odgovor

Pozorni moramo biti na to, da ne spremenimo prvotnega (neizpolnjenega) obrazca (originala), saj bi s tem pobrisali nize na katere se sklicujemo pri menjavi besedila.

Ideja je takšna, da naj bi v besedilu sicer zamenjali vse potrebne nize, a nato, izpolnjen obrazec shranili kot datoteko z drugim imenom.

To ime naj bo vedno isto, če ne želimo, da se nam izpolnjeni obrazci kupičijo, torej, če jih ne potrebujemo v elektronski obliki.

Algoritem:

  • z metodo

    DocX datoteka = DocX.Load("obrazec_podelitev.docx")

    odpremo še neizpolnjen obrazec

  • z metodo

    datoteka.ReplaceText("_ime_", napis_ime.Text)

    zamenjamo vse nize, ki so namenjeni menjavi, torej se na njihovem mestu pričakuje nek konkreten podatek

  • z metodo

    datoteka.SaveAs("obrazec_podelitev_natisni.docx")

    shranimo obrazec v datoteko z drugim imenom

  • z metodo

    if (File.Exists("obrazec_podelitev_natisni.docx") == false)

    prevrimo ali datoteka morda že obstaja, da se izpolnjeni obrazci ne kupičijo

  • če datoteka še ne obstaja jo ustvarimo z metodo

    DocX datoteka1 = DocX.Create("obrazec_podelitev_natisni.docx")

1. naloga- V igralnici- Odgovor

                DocX datoteka = DocX.Load("obrazec_podelitev.docx"); // odpremo vzorčni obrazec
                // v orazec vpišemo podatke o nagrejencu
                datoteka.ReplaceText("_ime_", napis_ime.Text);
                datoteka.ReplaceText("_priimek_", napis_priimek.Text);
                string[] tabela_naslov = napis_naslov.Text.Split(','); // naslov ločimo po vejici
                datoteka.ReplaceText("_naslov_", tabela_naslov[0]);
                datoteka.ReplaceText("_pošta in mesto_", tabela_naslov[1]);
                datoteka.ReplaceText("_država_", napis_drzava.Text);
                datoteka.ReplaceText("_datum roj._", napis_datum_roj.Text);
                datoteka.ReplaceText("_davčna št._", napis_davcna.Text);
                datoteka.ReplaceText("_emšo_", napis_emso.Text);
                datoteka.ReplaceText("_rez. status_", napis_status.Text);

                // o nagradi
                datoteka.ReplaceText("_nagradna igra_", combo_nagradne_igre.Text);
                datoteka.ReplaceText("_nagrada_", combo_dobitki.Text);
                datoteka.ReplaceText("_znesek bruto_", napis_bruto.Text);
                datoteka.ReplaceText("_znesek neto_", napis_neto.Text);
                datoteka.ReplaceText("_datum podelitve_", vnos_danasnji_datum.Text);
                datoteka.ReplaceText("_način izplačila_", napis_nacin_izp.Text);

                datoteka.SaveAs("obrazec_podelitev_natisni.docx");
                if (File.Exists("obrazec_podelitev_natisni.docx") == false)
                {
                    DocX datoteka1 = DocX.Create("obrazec_podelitev_natisni.docx"); // če morda nimamo datoteke, ki je namenjena

natisu obrazca
                }
                datoteka.SaveAs("obrazec_podelitev_natisni.docx"); // vedno shranimo v pomožno datoteko, tako prvotni obrazec
 ostaja nespremenjen

1. naloga- V igralnici- Filmček

Viri

0%
0%