You are on page 1of 58

Knyvtrszerkezet listzsa Excel

munkafzetbe
Cikknkben elksztnk egy komponenst, mely tetszleges kiindulsi mapptl kezdden a
knyvtrszerkezetet egy Microsoft Excel munkafzetbe listzza ki, a hierarchinak megfelelen. A
mappk s llomnyok feltrkpezsekor megadhatjuk, hogy trtnjen-e keress az
alknyvtrakban is, illetve a tallati listban csak milyen kiterjeszts llomnyok szerepeljenek.
Komponens elksztse
A komponenst elegend feldobnunk a Form-ra, s belltani a megfelel property-ket. A property-k
megadsa utn meg kell hvnunk az Execute metdust, s a knyvtrszerkezet listzsra kerl a
megadott elrsi tvonalon bell. A komponens property-jeinek listja a kvetkez:

Active: megadhat, hogy a keress folytatdjon-e vagy sem abban az esetben, ha az


ppen zajlik. Inaktv llapotban ez a tulajdonsg nem szignifikns. Amennyiben a keress
folyamn ennek rtkt FALSE-ra lltjuk, akkor a keress a legrvidebb idn bell
megszakad, s az addig feldertett tvonal elemei kerlnek listzsra.
ScanPath: megadhat az a mappa-elrsi tvonal, melynek tartalma listzsra, majd
megjelentsre kerl. Ha a megadott mappa nem ltezik, akkor a legels fix meghajt
gykere lesz a kiindulsi mappa.
SearchSub: megadhat, hogy a megadott elrsi tvonal almappiban is trtnjen keress.
Amennyiben rtke FALSE, akkor csak a mappa gykerben tallhat elemek listzdnak
ki.
Extensions: egy tmbben megadhatk azok a kiterjesztsek, melyekre szkts trtnik,
vagyis csak a megadott kiterjesztssel rendelkez llomnyok listzsa trtnik meg a
mappkon bell.

A komponens egy esemnyt definil az rkltteken tl. Ennek neve ScanEvent, mely akkor zajlik
le, ha egy mappa, vagy egy fjl kirsa megtrtnik. Ennek segtsgvel a hvalkalmazsban
folyamatjelzst is tudunk alkalmazni.
A komponens metdusai a kvetkezk:

GetFirstFixed: amikor a megadott elrsi tvonal nem ltezik, a metdus keresi meg a
legels elrhet merevlemez betjelt. A visszatrsi rtke egy karakterlnc, pldul
C:\.
IsExists: a metdusban vizsgljuk a megadott elrsi tvonal ltezst.
Execute: a metdus hvsakor trtnik meg a listzs s a kirs egy Excel munkafzetbe.
ScanDirectory: a mvelet oroszlnrszt vgzi ez a metdus. A vgrehajts tulajdonkppen
egy rekurzv keress a megadott elrsi tvonalon, mely llandan ellenrzi, hogy az
Active property rtke igaz vagy sem. Hamis rtk esetn a listzs megszakad.

Az Execute metdusban a kvetkez lpseket tesszk: els lpsben ltrehozzuk a kapcsolatot az


Excel alkalmazssal, valamint ltrehozunk egy WorkBook s egy WorkSheet objektumot.

ea = new Excel.ApplicationClass();
Excel.Workbook ew = ea.Workbooks.Add(m);
ws = (Excel.Worksheet)ea.Worksheets[1];
Kirjuk a megadott elrsi tvonalat a munkafzet els celljba, majd elindtjuk a listzst.

ws.Cells[1,1] = path;
...
ScanDirectory(path,1);
A ScanDirectory metdus els paramtere a megadott elrsi t, mg a msodik paramter az
aktulis oszlopszm, ahov a bejegyzs kerl a munkafzetben. A hierarchikus elrendezs
rdekben a knyvtrak, s az abban tallhat elemek neveit mindig egy oszloppal htrbb
kezdjk kirni.
A ScanDirectory metdus elejn lekrdezzk a megadott mappa alknyvtrait, majd a fjlok neveit
attl fggen, hogy adtunk-e meg szkt kritriumokat (kiterjesztseket).
A kvetkez lpsben vgigmegynk a mappk nevein, s minden mappa nevt kirjuk vastag
betkkel egy-egy cellba, majd lptetnk egyet a sorszmon.

foreach (DirectoryInfo dinfo in directoryList)


{
if (dinfo.Name[0].ToString() != ".")

{
ws.Cells[row,column] =
dinfo.Name;
Excel.Range er =
(Excel.Range)ws.Cells[row,colum
n];
er.Font.Bold = true;
row++;
...
Amennyiben igazra lltottuk a SearchSub
property rtkt, akkor hvjuk meg
rekurzv mdon a fggvnyt jra.

if (searchsub)
{
ScanDirectory(dinfo.FullName,co
lumn+1);
}
}
A fjlok
mkdik.

listzsa

is

azonos

elven

foreach (object finfo in files)


{
FileInfo fi =
(FileInfo)finfo;
ws.Cells[row,column] =
fi.Name;
row++;
...
Kliensalkalmazs elksztse
A hvalkalmazsban elegend a szvegmezben megadni a keressi tvonalat, bejellni, hogy
trtnjen-e keress az almappkban is vagy sem, illetve amennyiben szksges, megadni a
szksges kiterjesztseket.

etComponent1.ScanPath = textBox1.Text;
etComponent1.SearchSub = checkBox1.Checked;
etComponent1.Execute();
A mvelet a LISTZS felirat gombra kattintva indthat. A LELLTS felirat gombra
kattintskor a mvelet megszakad, s az addig kirt informci megjelenik a munkafzetben.

Adatok importlsa tbblapos Excel


munkafzetbl
E pldnkban egy olyan alkalmazst ksztnk, mely egy Excel munkafzetet hasznl arra, hogy konfigurcis adatait
beolvassa, s ennek megfelelen lltsa be a Form tulajdonsgait, mint a mret, httrszn, vagy az aktulis pozci. Az
Excel munkafzetnek egy msik lapjn tetszleges szm elnevezs-URL rtkprt trolunk, melyek szintn
megjelentsre kerlnek a Form-on.

A mellkelt Munkafzet1.xls-ben kt munkalapon trolunk adatokat. Az elsre kerlt a Form-unk


nhny property-je s azok belltand rtke(i). A pldnkban a property-ket nv alapjn
azonostjuk, gy az Excel cellkba egyszeren csak be kell rnunk j property-ket s hozzjuk az j
rtket, vagy rtkeket. A pldaprogram ezt kiolvassa, s az ott lert property-nek rtkl adja az
Excel tblban szerepl rtket.
A msodik lapon az els oszlopban webhelyek megnevezseit soroltuk fel, mg mellettk a
hozzjuk tartoz URL-t. Ksztettnk az els sorban egy szmllt is, mely megmondja, hogy hny
webhelyet rtunk mr be az Excel tblba.
Nv szerint azonostott tulajdons gok
Az alkalmazs indulsakor hvjuk meg a LoadWorkSheet01 metdust, melyben felvesszk a
kapcsolatot az Excel alkalmazssal, megnyitjuk a Munkafzet1.xls llomnyt, majd ltrehozzuk a
Worksheet objektumot.
A property-k nevei a msodik, mg azok rtkei a harmadik oszlopban vannak elhelyezve. A
System.Reflection nvtr osztlyainak segtsgvel kpesek vagyunk a property-ket nv szerint
elrni, s rtkeket adni nekik. Els lpsknt ltre kell hoznunk egy tpust a Form1 osztlybl.

Type t = typeof(Form1);
A sorokon vgighaladva olvassuk be a property-k neveit, s ltrehozunk egy-egy pldnyt a
PropertyInfo osztlybl.

...
string property = ((Excel.Range)ws.Cells[row,2]).Text.ToString();
...
pi = t.GetProperty(property);
A beolvasott rtkeket attl fggen, hogy az adott property milyen tpus a megfelel tpusra
konvertljuk, s a SetValue metdussal rtkl adjuk.

pi.SetValue(this,new
Point(Convert.ToInt32(values[0]),Convert.ToInt32(values[1])),null);
A Location property esetn pldul a cellban megadott szmprt kt szmm konvertljuk, s egy
Point struktrba rjuk, majd ezt adjuk rtkl a property-nek.
Weblapok elrse
A msik munkalap webhelyek neveit s URL-eket tartalmaz. A neveket kirjuk a Form felletre,
majd gondoskodunk arrl, hogy a nevek fltt kattintva a megfelel URL tltdjn be a megnyl
Internet Explorer bngszbe.
A LoadWorkSheet02 metdusban a neveket, a linkeket, valamint a nevek befoglal tglalapjnak
adatait egy-egy tmbbe tltjk.

texts = new string[count];


rects = new Rectangle[count];
links = new string[count];
for(int i=0;i<count;i++)
{
texts[i] = ((Excel.Range)ws.Cells[i+4,1]).Text.ToString();
links[i] = ((Excel.Range)ws.Cells[i+4,2]).Text.ToString();
SizeF s = this.CreateGraphics().MeasureString(texts[i],this.Font);
rects[i] = new Rectangle(left,top,(int)s.Width,(int)s.Height);
top = top + (int)s.Height + 5;
}
Az OnPaint metdusban jelentjk meg a szvegeket gy, hogy kiolvassuk az aktulis tmbelemet.

for(int i=0;i<count;i++)
{
SizeF s = e.Graphics.MeasureString(texts[i],this.Font);
e.Graphics.DrawRectangle(new Pen(new
SolidBrush(this.BackColor)),rects[i]);
e.Graphics.DrawString(texts[i],Font,new
SolidBrush(Color.Blue),rects[i].X+2,rects[i].Y + (rects[i].Heights.Height)/2);
}

A PointInRect metdusban ellenrizzk le, hogy az egrgomb lenyomsakor a pont koordinti


benne vannak-e a tglalapok valamelyikben. Ha a metdus igaz rtkkel tr vissza, akkor a
kurzor formja egy kzre vltozik (Cursors.Hand).
A feliratra kattintva elrhetjk, hogy a kapcsold URL-en tallhat webhely betltdik a megnyl
bngszben. Ehhez ltre kell hozni a bngsz objektumait.

private SHDocVw.InternetExplorer FIE = null;


private IWebBrowserApp FWebBrowser = null;
...
FIE = new SHDocVw.InternetExplorer();
FWebBrowser = (IWebBrowserApp) FIE;
Ezek elrshez a Microsoft Internet Controls COM komponenst, mint referencit a projekthez kell
adni.
Az egrgomb lenyomskor a bngszpldnyt lthatv tesszk, s a Navigate metdussal
megnyitjuk az URL-t.

FWebBrowser.Visible = true;
FWebBrowser.Navigate(links[num], ref o, ref o, ref o, ref o);

Microsoft Excel s Word tippek


Cikknkben egy gyjtemnyt adunk kzre a Microsoft Excel s Word alkalmazsokhoz kapcsold aprsgokbl.
Mutatunk egy pldt arra, hogyan vltoztathatjuk a megnyitott dokumentum nzeteinek tpust egy property
belltsval, illetve megismerhetjk, hogyan tudunk a vglap segtsgvel egy Excel tblzatot a Word egy j
dokumentumba msolni. Az utols aprsg annak megismersre irnyul, hogy miknt lehet a Microsoft Office
csomag teleptett sszetevit lekrdezni.

A mellkelt plda Form-jn egy hrom-fles TabControl-t tallunk, melynek minden egyes fle
alatt kiprblhatunk egy tippet. Lssuk ezeket sorban.
Excel tblzat msolsa
A feladatot hrom rszre bontottuk, ennek megfelelen hrom metdusban valstottuk meg a
mveleteket. Az els metdus neve CreateExcelData, melyben ltrehozunk egy Excel tblzatot.
Els lpsben ltrehozunk egy pldnyt az Excel alkalmazsbl, lthatv tesszk azt, majd
ltrehozunk egy WorkBook-ot.

ea = new Excel.Application();
ea.Visible = true;
Excel.Workbook ew = ea.Workbooks.Add(m);
Excel.Worksheet ws = (Excel.Worksheet)ea.Worksheets[1];
A kvetkez lpsben a hrom WorkSheet kzl az elsben ltrehozzuk a tblzatot.

for (int y=1;y<11;y++)


{
for (int x=1;x<11;x++)
{
ws.Cells[x,y] = x;
}
}
A mvelet msodik rsze, hogy a CopyData metdusban a vglapra msoljuk a tblzat egszt.
Ennek rdekben aktvv tesszk az els munkalapot, majd az A1 s J10 cellk kzz es rszt
kijelljk, s a Copy metdussal kimsoljuk.

Excel.Worksheet ws = (Excel.Worksheet)ea.Worksheets[1];
ws.Activate();
ws.get_Range("A1","J10").Select();
ws.UsedRange.Copy(m);
A Copy metdust a Missing.Value rtkkel hvjuk meg. Az utols lps, hogy a ltrehozott j
dokumentumba beillesztjk a vglapon tallhat tblzatot. Ennek mvelete az InsertWordData
metdusban tallhat.
Az els lps itt is a kapcsolatteremts a Word alkalmazssal, pldnyosts s megjelents.

wa = new Word.ApplicationClass();
wa.Visible = true;
A kvetkez lps egy j dokumentum ltrehozsa, majd aktivlsa.

Word.Document wd = wa.Documents.Add(ref m,ref m,ref m,ref m);


wd.Activate();
A dokumentum els rszbe berunk egy bevezet szveget, majd beillesztnk kt res
paragrafust.

Word.Range wr = wd.Range(ref m,ref m);


wr.Text = "Az albbi adatok kerltek tmsolsra az Excel dokumentumbl:";
wd.Paragraphs.Add(ref m);
wd.Paragraphs.Add(ref m);
A harmadik bekezdst kijellve meghvjuk az adott Range objektum Paste metdust, hogy a
tblzat beillesztdjn.

wr = wd.Paragraphs.Item(3).Range;
wr.Paste();
Dokumentum nzetek
Ha megnyitunk egy Word dokumentumot, akkor a Nzet men els ngy menpontjnak egyikt
kivlasztva klnbz formban jelenthetjk meg azt. Vlaszthatjuk a Norml, vagy akr a webes
megjelentst is.
rmteli hr lehet, hogy ezek a nzettpusok programbl is bellthatk, vagy adott esetben
lekrdezhetk. A mellkelt plda msodik fle
alatt
ezeket prblhatjuk ki. A nyomgomb
segtsgvel megnyithatjuk a mellkelt 1.doc
dokumentumot, majd a lista egy-egy elemt
kivlasztva
mdosthatjuk a nzet tpust.
Ezt
a
kvetkezkppen tehetjk meg. Amennyiben
kapcsolatot
teremtettnk
a
Word
alkalmazssal,
majd
ltrehoztuk
a
dokumentum
objektumt,
akkor
a

dokumentum adott ablaka rendelkezik egy View property-vel. Ekkor mr a nzet klnbz
tulajdonsgait rhetjk el.
A View objektum rendelkezik egy Type tulajdonsggal, melynek rtke hatfle lehet, attl fggen,
hogy milyen nzetben szeretnnk ltni az adott dokumentumot. A Type property rtke a
kvetkezk egyike lehet:

Word.WdViewType.wdMasterView
Word.WdViewType.wdNormalView
Word.WdViewType.wdOutlineView
Word.WdViewType.wdPrintPreview
Word.WdViewType.wdPrintView
Word.WdViewType.wdWebView

A lista egy elemt kivlasztva a fenti rtkek


egyikt rendeljk a property-hez.

switch(comboBox1.SelectedIndex)
{
case 0:
wd.Windows.Item(ref
index).View.Type =
Word.WdViewType.wdMasterView;
break;
...
Teleptett
Office
sszetevk
lekrdezse
A teleptskor megadhatjuk, hogy mely Office
sszetevket szeretnnk telepteni. A kivlasztott sszetevk teleptse utn mindegyik
sszetevvel
kapcsolatban
egy
kulcs
jn
ltre
a
Rendszerler
adatbzisban,
a
HKEY_CLASSES_ROOT fkulcs alatt.
Ezeknek a kulcsoknak a keresse s ltezsnek ellenrzse adja meg az eredmnyt. Amennyiben
ltezik az sszetev (pldul Excel.Application) kulcs, akkor az adott sszetev ltezik.
Els lpsben egy tmbben eltroltuk az sszetevk neveit.

private string[] apps = new string[]{"Word", "Excel", "Access",


"PowerPoint", "FrontPage", "Outlook"};
Ezt kveten egy ciklusban megvizsgljuk, hogy az adott kulcsot meg lehet-e nyitni. Amennyiben
nem lehet megnyitni, mert nem ltezik, akkor az OpenSubKey metdus visszatrsi rtke NULL
lesz. Ennek megfelelen jelentjk meg az eredmnyt a ListBox kontrolban.

for(int i=0;i<6;i++)
{
try
{
RegistryKey key = Registry.ClassesRoot.OpenSubKey(apps[i] +
".Application");
if (key != null)
{
listBox1.Items.Add("Az MS " + apps[i] + " teleptve van a gpre.");
}
else
{
listBox1.Items.Add("Az MS " + apps[i] + " nincs teleptve a gpre.");
}
...

Excel munkafzet kpleteinek kilistzsa


Ksztnk egy alkalmazst, amely segtsgvel egy megadott Microsoft Excel munkafzetben tallhat kpletekrl listt
kszthetnk. A program lehetsget biztost arra is, hogy a listba a kplet mell az t tartalmaz munkalap s cella
koordinti is bekerljenek.

Ha a munkalap mezben megadjuk egy munkalap nevt, akkor a keress csak azon trtnik. Ha a
mez rtkt resen hagyjuk, akkor a keress az sszes munkalapon megtrtnik.
Miutn ltrehoztunk egy j C# alkalmazst, fel kell vennnk egy hivatkozst az Excel programra.
Ehhez vlasszuk a Project Add Reference menpontot. A megjelen ablakban kattintsunk a COM
flre, a listban vlasszuk ki a Microsoft Excel 10.0 Object Library-t. Ezutn kattintsunk a Select,
majd az OK gombra.
Az Excel programot a httrben nyitjuk meg.

Excel.ApplicationClass excelApp

= new Excel.ApplicationClass();

A WorkBooks kollekci Open metdusval nyithatunk meg egy mr ltez llomnyt.

excelApp.Workbooks.Open(textBox1.Text, m, true, m, m, m, m, m, m, m, m, m,
m, m, m);
A munkalap mez rtknek megfelelen ktfle feldolgoz algoritmusra van szksgnk. Ha a
mez rtke res sztring, akkor az sszes munkalapot vgig kell nznnk, ellenkez esetben csak
azt, amelyiket a mez tartalmazza.
Az albbiakban az els esetet ismertetjk.
Egy for ciklus segtsgvel vgig kell mennnk a munkalapokon.

for (int k = 1; k <= excelApp.ActiveWorkbook.Sheets.Count; k++)


{
Excel.Range range =
((Excel.Worksheet)excelApp.ActiveWorkbook.Sheets[k]).UsedRange;
A UsedRange property-n keresztl egy olyan Range objektumot kapunk, amely az adott
munkafzetbl csak a hasznos tartomnyt tartalmazza.
Kt jabb, egymsba gyazott for ciklusra van szksgnk, hogy a cellatartomny sszes celljt
meg tudjuk vizsglni. A Range objektum Rows s Columns property-jeibl megtudhatjuk a sorok s
oszlopok szmt.
Azt, hogy az adott cella tartalmaz-e kpletet, a HasFormula property rtkbl tudhatjuk meg.

r = (Excel.Range)range.Columns.Cells[i, j];
if ((bool)r.HasFormula)
Magt a kpletet a FormulaLocal proeprty-bl olvashatjuk ki.

string s = r.FormulaLocal.ToString();
A
FormulaLocal
property-n
keresztl
az
Excel
program
nyelvnek
megfelel
fggvnyelnevezsekkel olvashatjuk ki. Amennyiben a fggvnyek angol nyelv megfeleljre van
szksgnk, a Formula property-t kell hasznlnunk.
Ha a koordintkat is el kell helyeznnk az eredmnylistban, a kvetkez utastsra van
szksgnk.

listBox1.Items.Add(((Excel._Worksheet)excelApp.ActiveWorkbook.Sheets[k]).Na
me + " [" + GetCoord(r.Column, r.Row) + "] : " + s);
A koordintkat szmok formjban kapjuk. Az oszlopok sokkal szebben mutatnak, ha azokat
betk formjban jelentjk meg. Ehhez elksztettk a GetCoord fggvnyt.

private string GetCoord(int column, int row)


A fggvny egy megadott oszlop s sor sorszmaibl a
cellakoordintt adja vissza.
Az Excel programot a Quit metdus meghvsval zrhatjuk be.

megszokott

A1

formtum

excelApp.Quit();

Intelligens cmke
hasznlata Excelben
Intelligens cmkk lehetsgei 8. rsz
Cikknkben bemutatjuk, hogy miknt hozhatunk ltre olyan intelligens
cmkt, mely csak az Excel alkalmazs celliban megadott adatokra
aktivizldik, mg a Word alkalmazsban megadott szvegre rzketlen. A mellkelt pldban egy olyan cmkt
ksztnk el, mely tetszleges megjegyzs-szveget tud ltrehozni az adott cellhoz, egy srga ablakban megjelentve
azt.
A plda fordtsa utn futtassa le a mellkelt AddRegistry.reg llomnyt a Rendszerler adatbzis bejegyzseinek
elksztshez.
A cmke kiprblshoz indtson el egy pldnyt az Excel alkalmazsbl, s egy tetszleges cellban gpeljen be adatot.

Ahogy a sorozat korbbi rszeiben megismerhettk, az Intelligens cmkben kt osztlyt kell


megvalstani. A RecognizerClass osztly Recognize metdusa vgzi a felismerst s megjellst,
mg az ActionClass InvokeVerb metdusban valstjuk meg a megjelen menpont mgtti
funkcit.
Az osztlyok mindegyikhez ltrehoztunk egy-egy GUID szmot, melyeket felhasznlunk a
regisztrciban. Az AddRegistry.reg llomny lefuttatsval helyezzk el a regisztrcis
bejegyzseket a Rendszerler adatbzisban, a RemRegistry.reg llomny futtatsval pedig
eltvolthatjuk a ltrehozott kulcsokat.
Az Intelligens cmknk mindegyikt COM komponensknt kell regisztrlnunk, gy a projekt
tulajdonsglapjn a megfelel paramtert igazra kell lltani.
Annak rdekben, hogy a cmke csak Excel alkalmazsban legyen hasznlhat, a Word alkalmazs
dokumentumaiban viszont hagyja figyelmen kvl a szveget, a RecognizeClass osztlyunk
Recognize metdusnak DataType nev paramtert kell csak lekrdeznnk. A paramter
SmartTagLib nvtr IF_TYPE felsorolt tpusnak egy eleme, melynek rtke IF_TYPE_PARA Word
alkalmazs esetn, s IF_TYPE_CELL Excel alkalmazs megnyitsakor.
Ekkor elegend csak lekrdezni a paramter aktulis rtkt, s mris meghatrozhatjuk, hogy
mely alkalmazs-tpus esetn legyen a cmke hasznlhat. Ha ezt nem tennnk meg, akkor Word
dokumentum esetn a begpelt teljes szveg kijellsre kerlne, s ezt nem szeretnnk.

if (DataType == SmartTagLib.IF_TYPE.IF_TYPE_CELL)
{
RecognizerSite.CommitSmartTag(smartTagName, 1, Text.Length,
RecognizerSite.GetNewPropertyBag());
}
Ha Excel alkalmazsban aktivizldik a cmke, akkor egy kis vrs hromszg jelenik meg a cella
jobb als sarkban, gy jelezve a felhasznlnak, hogy a kurzort a cella fl mozgatva lthatv
teheti a cmke menjt.
A megjelen menben jelen esetben a Szveg megadsa pontot vlasztva adhatunk meg egy
megjegyzs szveget a cellhoz.
Ezt gy rhetjk el, hogy a paramterknt kapott adatot, mely a cella terlete lesz, egy
Excel.Range objektumm konvertljuk.

Excel.Range er = (Excel.Range)Target;
Ltrehozunk egy pldnyt a SmartForm projektben deklarlt Form1 osztlyunkbl, mely egy
dialgusablakot takar, majd megjelentjk azt.

Form1 f = new Form1();


f.ShowDialog();
Amennyiben a szvegmezben megadtunk egy karakterlncot, vagyis a Form1 osztly NoteText
vltozja tartalmazza azt, akkor a szveget egy object tpus vltozban helyezzk el, s
meghvjuk az Excel.Range objektum NoteText metdust, annak els paramterben megadva a
megjelentend megjegyzs szveget.

object t = f.NoteText;
er.NoteText(t,1,5);

Grafikon olvassa Excel llomnybl


Cikknkben megvizsgljuk, hogyan jelenthetnk meg egy Excel alkalmazsban elksztett grafikont sajt Windows-os
alkalmazsunk felletn. Bemutatjuk, hogyan jellhetjk ki a megjelentend grafikai objektumot, s hogy milyen
mdszerrel konvertlhatjuk t egy Bitmap objektumba, mely mr a fellet PictureBox kontroljban megjelenthet.

A grafikonok az Excel osztlyhierarchijban tallhat Chart tpus objektumok, melyek


dinamikusan ltrehozhatak, melyeknek tulajdonsgai lekrdezhetek, ugyanakkor csak bizonyos
paramterekkel hvhatak meg azok a metdusok, melyekkel egy alkalmazs rlapjn
megjelenthetk.
A pldban a mellkelt MyTest.xls llomnyban tallhat grafikont s annak forrsadatait fogjuk
megjelenteni egy PictureBox kontrolban, illetve az adatokat egy tblzatban.
A mellkelt llomny elrshez szksges egy pldny az Excel alkalmazsbl, gy elszr azt
hozzuk ltre.

Excel.Application ea = new Excel.Application();


Szksgnk van egy Excel.Workbook objektumra is, mely tartalmazza a megnyitott llomnyt.

Excel.Workbook wb = null;
wb = ea.Workbooks.Open(Application.StartupPath + "\\MyTest.xls", m, m, m,
m, m, m, m, m, m, m, m, m, m, m);
Az Open metdus els paramtere tartalmazza az llomny elrsi tvonalt, a tbbi paramter
rtke Missing.Value.
A grafikon az llomny Munka1 nev munkafzetben van, gy azt kell betltennk egy Worksheet
objektumba.

Excel.Worksheet ws = (Excel.Worksheet)ea.Worksheets[1];
A grafikon alapadatait egy DataTable objektumban troljuk el, majd megjelentjk azokat egy
DataGrid kontrolban. Ekkor cellnknt kiolvassuk az adatokat gy, hogy minden cellt egy
Excel.Range objektumm konvertlunk, majd annak Text property-jt helyezzk el a DataTable
egyik mezjben.

DataRow dr = dt.NewRow();
dr[0] = ((Excel.Range)ws.Cells[3,1]).Text.ToString();
dr[1] = ((Excel.Range)ws.Cells[3,2]).Text.ToString();
dt.Rows.Add(dr);
...
A Munka1 munkafzet els grafikonja lesz a megjelentend grafikon, gy azt a ChartObjects
metdussal krdezhetjk le gy, hogy egy 1 rtk object tpus objektumot adunk t
paramterknt.

object index = 1;
Excel.ChartObject co = (Excel.ChartObject)ws.ChartObjects(index);
A grafikon objektumnak CopyPicture metdust hasznlhatjuk arra, hogy a grafikont a Vglapra
msoljuk specilis formtumban.

co.CopyPicture(Excel.XlPictureAppearance.xlScreen,Excel.XlCopyPictureFormat
.xlBitmap);
A paramterek felsorol tpusok, brmely ms rtket vlasztva meghisulhat a msols. Ezt
kveten bezrjuk az Excel munkalapot, s az alkalmazst.

wb.Close(m,m,m);
ea.Quit();
A Vglap tartalma egy IDataObject objektumba krdezhet le.

IDataObject obj = Clipboard.GetDataObject();


Ltrehozunk egy Bitmap objektumot, majd erre a formtumra konvertljuk a kapott binris
adathalmazt.

Bitmap bmp;
bmp = (Bitmap)obj.GetData("System.Drawing.Bitmap");
A GetData metdusban szveggel adhatjuk meg a tpust, amilyen formtumba kvnjuk menteni az
adathalmazt. Ezt kveten tadjuk a PictureBox kontrolnak megjelentsre.

pictureBox1.Image = bmp;

Word s Excel llomnyokat nyomtat


komponens ksztse
Bizonyos alkalmazsok esetn, melyek Microsoft Word vagy Excel llomnyokkal dolgoznak, kzponti krds lehet az
egyes fjlok nyomtatsa. Igen knyelmetlen azonban minden nyomtatand llomnyt egyenknt megnyitni, s
belltani az sszes nyomtatsi paramtert. Cikknkben elksztnk egy komponenst, melybe belegyrtuk a Word s
Excel llomnyok nyomtatsnak kpessgt. Elegend megadni az llomny nevt.

A komponenst elegend a felhasznl alkalmazs Form-jra dobni, s belltani az OfficeFileType


property rtkt, valamint megkeresni az llomny nevt a meghajtk valamelyikn.
A nyomtatand llomny-tpus egy felsorolt tpus egyik eleme.

public enum FileType : int


{
EXCEL = 0,
WORD = 1
}
A FileName property tartalmazza a nyomtatand llomny nevt. Ennek megadsban
segtsgnkre van a FileNameEditor osztly. Ez azt jelenti, hogy a nyomtatand llomny nevt a
felbukkan OpenFileDialog ablakban kereshetjk meg. Ehhez a kvetkezkppen kellett
megadnunk a fName vltozt llt FileName property rtkt:

[EditorAttribute(typeof(FileNameEditor), typeof(UITypeEditor))]
public string FileName
{
get
{
return fName;
}
set
{
if (!ControlFileName(value))
{
...
}
fName = value;
}
}
A property rtknek megadsakor vgznk egy ellenrzst a ControlFileName metdusban annak rdekben, hogy ne kerljn helytelen rtk a vltozba.
A nyomtatsi funkcit a Print metdusba gyaztuk. A metdus egy paramterrel rendelkezik, mely
tartalmazza a nyomtatand pldnyszmot. Miutn leellenriztk a megadott rtkeket,
megkezdjk az llomny megnyitst, majd nyomtatst.
Word dokumentum esetn egy Word alkalmazs-pldnyt hozunk ltre, de a httrben futtatjuk.

Word.Application wa = new Word.Application();


Az alkalmazs Documents objektumnak Open metdusa segtsgvel megnyitjuk a megadott
llomnyt. A metdus minden paramtere egy hivatkozs egy objektum tpus rtkre, melyek
rtke vagy szignifikns, s a metdus ltal rtelmezend, vagy Missing.Value.

Word.Document wd = wa.Documents.Open(ref fn,ref o,ref o,ref o,ref o,ref


o,ref o,ref o,ref o,ref o,ref o,ref o,ref o,ref o,ref o);
A nyomtats a dokumentum PrintOut metdusval trtnik, ahol a megadott paramtert
hasznljuk csak fel, a tbbi bemen paramter rtke Missing.Value.

wd.PrintOut(ref o,ref o,ref o,ref o,ref o,ref o,ref o,ref pn,ref o,ref
o,ref o,ref o,ref o,ref o,ref o,ref o,ref o,ref o);
Vgl bezrjuk az alkalmazst.

wa.Quit(ref o,ref o,ref o);


Excel llomny esetn egy Excel alkalmazs-pldnyt hozunk ltre.

Excel.Application ea = new Excel.Application();


Majd megnyitjuk a megadott munkafzetet.

Excel.Workbook wb = ea.Workbooks.Open(fName,o,o,o,o,o,o,o,o,o,o,o,o,o,o);
A metdus paramterei objektum tpusak. A legels munkalapot nyomtatjuk ki a PrintOut
metdussal. Itt mr lnyegesen kevesebb paramtert kell megadnunk.

Excel.Worksheet ws = (Excel.Worksheet)ea.Worksheets[1];
ws.PrintOut(o,o,pn,o,o,o,o,o);
Az alkalmazs bezrsa a Quit metdussal trtnik itt is.

ea.Quit();

10

A mellkelt FPClient alkalmazsban a Form NumericUpDown kontroljban lehet megadni a


pldnyszmot.

11

Cellamveletek Excel-ben
Windows Script Host lehetsgei 11. rsz
Cikknkben mg maradunk kicsit a Microsoft programcsomag Excel tagjhoz kapcsold mveleteknl.
Pldaprogramunkban tbb mveletet mutatunk be. Az els rszben bemutatjuk, hogy milyen mdon hvhatk meg egy
munkafzet celliban a szmtsokat vgz fggvnyek. A cikk msodik felben ismertetjk, hogyan rhetjk el a
munkafzetben ltrehozott grafikont, s ezt hogyan mozgathatjuk alkalmazsok kztt.

Cellamveletek
A Form SZMTS felirat fle alatt prblhatjuk ki azokat a funkcikat, melyek egy adott cellban
elrhet begyazott fggvnyekhez kapcsoldnak. A megfelel rdigomb kijellse utn a SUM,
illetve a MAX fggvnyeket hvhatjuk meg egy adott cellacsoportra.
A WSH11.wsf parancsllomny futtatsakor a CALCULATE nev szegmensben hvjunk meg ktfajta
mveletet.
A megadott rendszermeghajt gykerben ltrehozunk egy /test nev mappt, melyben az
llomnyokat ltrehozzuk, illetve ide msoljuk a felhasznland, a pldaalkalmazs mappjban
elhelyezett fjlokat.
A szoksos mdszerrel lekrdezzk a parancssori argumentumokat:

var args = WScript.Arguments;


var newFile;
var type;
try
{
newFile = args(0);
type = args(1);
}
...
Ltrehozzuk az Excel objektumot:

var excelApp = WScript.CreateObject("Excel.Application");


Ltrehozunk egy j Excel llomnyt:

var newWB = excelApp.Workbooks.Add();


Ltrehozunk egy objektumot az els munkafzethez:

var sheet1 = newWB.Worksheets("Munka1");


Ha nullt kap az llomny msodik paramterknt, akkor a B2 s a B12 cellk kztti
tartomnyban generlunk 10 darab vletlen szmot:

sheet1.Range("B2:B12").Formula = "=rand()";
A B13-as cellban pedig megjelentjk a 10 szm sszegt:

sheet1.Cells(13,1).Value = "sszesen:";
sheet1.Cells(13,2).Formula = "=SUM(B2:B12)";
Majd elmentjk az llomnyt a test mappba:

newWB.SaveAs(newFile + "Sum.xls");
A MAX fggvnyt hasonl mdon hvjuk meg.
Grafikon msolsa, kp beillesztse
A COPY job-ban elhelyezett funkcikkal a Chart.xls llomnyban tallhat llomnyt msolhatja t
egy Chart.doc nven ltrehozott dokumentumba, amennyiben nulla az tadott msodik parancssori
argumentum. Ekkor ltrehozunk egy Excel objektum-pldnyt.

var excelApp = WScript.CreateObject("Excel.Application");


Majd megnyitjuk a Chart.xls fjlt.

var newWB = excelApp.Workbooks.Open(newFile + "Chart.xls");


Kimsoljuk a vglapra a grafikon objektumt.

newWB.Worksheets(1).ChartObjects(1).CopyPicture();
Ltrehozzuk a Word objektum-pldnyt s egy j dokumentumot.

var wordApp = WScript.CreateObject("Word.Application");


var newDoc = wordApp.Documents.Add();
Beillesztjk a grafikont a vglaprl.

wordApp.Selection.Paste();
Majd elmentjk, illetve bezrjuk az llomnyokat.

newWB.Close();
newDoc.SaveAs(newFile + "Chart.doc");
newDoc.Close();
A kpllomny beillesztshez ltrehozunk egy Excel llomnyt.

var newWB = excelApp.Workbooks.Add();


var sheet1 = newWB.Worksheets("Munka1");

12

Az AddPicture metdus meghvsval a megadott kpet az adott pozciban elhelyezzk, mrett


150x150-esre vlasztva.

sheet1.Shapes.AddPicture(newFile + "1.gif", false, true, 10, 10, 150,150);


Az llomnyt Picture.xls nven elmentjk a /test mappban.

13

Mveletek Excel-llomnyokkal
Windows Script Host lehetsgei 10. rsz
A sorozat ezt megelz szmaiban mutattunk pldt olyan esetekre, amikor a Microsoft Office programcsomag Word
alkalmazst rtk el parancsllomnyunkbl. Cikksorozatunk mostani szmban megismerkedhetnk azzal, hogy
miknt rhetjk el a programcsomag Excel alkalmazst. A cikkben ltrehozunk egy llomnyt, s annak els
munkalapjn egy formzott tblzatot.

A pldaprogramban a Form-ra feltettnk egy DataGrid kontrolt, szemlltetend, hogy milyen


adatok jelennek meg a ltrehozand Excel munkalapon. A program indulsakor a rcs tartalmt az
alkalmazs mappjban tallhat products.xml llomnybl tltjk be. Az egyszersg kedvrt az
Excel tblzatot nem ebbl hozzuk ltre, ez csupn a minta.
A mveletet a Wsh10.wsf llomnyban tallhat kd vgzi el, melyet a LTREHOZS gomb
megnyomsakor futtatunk le a Process osztly Start metdusnak segtsgvel.
A Wsh10.wsf llomny futskor kt paramtert kap. Az els paramter egy elrsi tvonal annak
a mappnak az elrsi tvonala, melyben az llomnyt ltrehozzuk (pldul C:\test) -, a msodik
paramter pedig egy szm, amely meghatrozza, hogy az llomny XLS, vagy HTML kiterjesztst
kapjon. Az rlapra helyezett jellngyzettel lehet jelezni, hogy a ments HTML formtumban
trtnjen.
Az llomnyok mindegyike a megadott rendszermeghajt gykerben ltrehozott /test mappba
kerl.
Lssuk teht, hogyan lehet egy formzott tblzatban elhelyezni az adatokat. Els lps, hogy
ltrehozunk egy pldnyt az Excel.Application objektumbl.

var excelApp = WScript.CreateObject("Excel.Application");


Ltrehozunk egy j munkafzetet.

var newWB = excelApp.Workbooks.Add();


Ennek els, Munka1 nev lapjra hivatkozunk.

var sheet1 = newWB.Worksheets("Munka1");


A ltrehozand tblzat egy 6x3-as mtrix lesz, mely egy tmbknt is kezelhet. Ekkor minden
utasts a tmb egszre vonatkozik. Ehhez hasznljuk a Range objektumot. A tmb egszt
megformzzuk az AutoFormat metdussal, amelyben az els paramter vonatkozik a formz
stlusra.

sheet1.Range("B1:D6").AutoFormat(8,true,true,true);
A tblzat fejlce lesz az ID, Name, s a Price felirat. Ekkor mr a cellkra, mint nll
egysgekre hivatkozunk.

sheet1.Cells(1,2).Value = "ID";
sheet1.Cells(1,3).Value = "Name";
sheet1.Cells(1,4).Value = "Price";
A tblzat rtkeit ezzel analg mdon rjuk az llomnyba.
Utols lpsknt megvizsgljuk, hogy a msodik parancssori argumentum milyen rtk.
Amennyiben 0, vagyis a jellngyzet nem volt jellt, akkor a ltrehozand llomny xls
kiterjeszts, egybknt html.

if (saveType == 0)
{
newWB.SaveAs(newFile + "\\sample.xls");
}
else
{
newWB.SaveAs(newFile + "\\sample.html",44);
}

14

Az utbbi esetben az xlFileFormat konstans rtkt kell helyesen megadni, mely jelen esetben az
xlHtml rtknek megfelel szm, vagyis 44.

15

Excel sablonok kitltse WebService


ltal szolgltatott adatokkal
WebService elrse Office alkalmazsokbl 2. rsz
A sorozat ezt megelz szmban bemutattuk, hogyan teremthetnk kapcsolatot Microsoft Word alkalmazsunk s egy
Web szerviz kzt gy, hogy egy makrbl hvjuk meg a szerviz metdusait, s a kapott adatokkal megcmznk egy
faxbort sablont. Mai cikknkben azt vizsgjuk meg, hogy miknt tehet ez meg Excel alkalmazsbl. A mellkelt
pldban egy munkafzet sablont fogunk kitlteni tekintlyes mennyisg adattal.
Mellkelt plda megnyitsa eltt szksges egy OfficeService02 nev virtulis knyvtr ltrehozsa, mely a plda knyvtrra
mutat. Ehhez nyissa meg a mellkelt mappa Tulajdonsg ablakt s itt a Webmegoszts lapon engedlyezze a mappa
megosztst
olvassi
s
parancsfjlok
futtatsi
jogval.
A mellkelt plda hasznlathoz el kell vgeznnk bizonyos belltsokat. Ehhez olvassa el a Kezdeti belltsok cm fejezetet.

Kezdeti belltsok
A pldhoz szksges az OfficeDb adatbzis, melyet a plda mappjnak Database alknyvtrban
megtallhat Run_script.cmd BATCH llomny lefuttatsval hozhatunk ltre. Az OfficeDb.sql script
5. sorban adja meg helyesen a ltrehozand adatbzisfjlok mappjnak nevt s elrsi
tvonalt.
Az adatbzis megalkotsa utn meg kell bizonyosodnunk arrl, hogy a feladathoz szksges Excel
sablon megtallhat-e az MS Office alkalmazscsomag valamely almappjban. Alaprtelmezsben
a kvetkez mappban tallhat: <winroot>:\Program Files\Microsoft Office\Templates\1038, s
az Invoice.xlt, vagy a Sales Invoice.xlt nevet viseli. Amennyiben a sablon nem rhet el a
megfelel helyen, akkor az Office programcsomag teleptkszlett felhasznlva fel kell azt
telepteni, vagy felhasznlni a mellkelt mappa EmptyTemplate alknyvtrban elhelyezett
Invoice.xlt llomnyt. A makro hasznlatakor a Form szvegmezjben meg kell adni az llomny
elrsi tvonalt. Ellenkez esetben a mvelet hibazenettel befejezdik.
A pldaalkalmazs mappjban elhelyezett Macro alknyvtr tartalmazza annak a makrnak a
kdllomnyait, melybl a Web szerviz alkalmazsunkat elrhetjk, s metdusainak meghvsval
vgl kitlthetjk az emltett sablon mezit. Amennyiben nem kvnunk makrt telepteni,
hasznljuk fel a Macro almappa Worksheet_with_macro.xls nev llomnyt, melyet meg kell nyitni,
s az Eszkzk menbl ki kell vlasztani a Makr pontot, majd az almenbl a Makrk
almenpontot ahhoz, hogy a makrt indthassuk.
Telepts esetn kicsit hosszabb a mvelet. Ehhez el kell indtani a beptett Visual Basic makrszerkeszt kisalkalmazst, s a Module1.bas, valamint UserForm1.frm llomnyokat importlnunk
kell egy j projektbe.
A makr futtatshoz a Run menben ki kell vlasztanunk a Run Makro pontot, vagy meg kell
nyomnunk az F5 nyomgombot. Elindtva a makrt annak Form-jn megadhatjuk a sablonllomny
elrsi tvonalt, majd a listbl kivlaszthatunk egy elemet. A MEGCMEZ gombbal indthat a
mvelet.
WebService jellemzi
A Web szerviz alkalmazsunk csak abban klnbzik a korbbi verzitl, hogy az adatbzis
kapcsolatot megvalst SqlConnection komponens az OfficeDb adatbzis Table1 tbljbl kri az
adatokat.
A szerviz kt metdussal rendelkezik. Az els metdus (GetCustomerIDs) visszatrsi rtkknt
egy karakterlnc tmbt ad vissza, mely tartalmazza a Table1 tblban tallhat rekordok
CustomerID oszloprtkeit, melyeket megjelentnk a makrnk Form-jn.

[WebMethod]
public string[] GetCustomerIDs()
{
...
}
A szerviz msik metdusval (GetParticulars) a Table1 tbla egy rekordjnak elemeit kaphatjuk
vissza, paramterknt adva meg, hogy melyik azonostval rendelkez elem legyen az.

[WebMethod]
public string[] GetParticulars(string id)
{
...
}
Makr UserForm1 objektuma
A UserForm1 objektum kdjban kell megvalstanunk azt, hogy a szerviz els metdusa a Form
inicializcijakor vgrehajtdjon, s az azonostk bekerljenek a Form-ra helyezett ListBox
kontrolba.

Private Sub UserForm_Initialize()


Dim oSOAPClient As Object

16

Ltrehozzuk a SoapClient objektumot:

Set oSOAPClient = CreateObject("MSSOAP.SoapClient")


Megadjuk a szerviz alkalmazsunk URL-jt:

oSOAPClient.mssoapinit
"http://localhost/OfficeService02/Service1.asmx?wsdl", "Service1",
"Service1Soap"
Lekrdezzk egy karakterlnc-tmbbe az azonostkat:

Dim arrTemp() As String


arrTemp = oSOAPClient.GetCustomerIDs()
Majd a tmb elemeit egy ciklussal bedolgozzuk a ListBox kontrolba:

For i = 0 To UBound(arrTemp)
ListBox1.AddItem arrTemp(i)
Next
End Sub
Makr Module1 objektuma
A makrnk Module1 objektumban ltrehozunk egy metdust, mely paramterknt megkapja a
listbl kivlasztott azonostt, s ezt az azonostt a tadja a szerviz metdusnak, mely az adott
rekord oszlopaiban megtallhat rtkekkel tr vissza.

Sub GenerateForm(sID As String)


...
A SoapClient objektumra itt is szksg van:

Set oSOAPClient = CreateObject("MSSOAP.SoapClient")


oSOAPClient.mssoapinit
"http://localhost/OfficeService02/Service1.asmx?wsdl", "Service1",
"Service1Soap"
A metdus eredmnye itt is egy tmbbe kerl:

arrTemp = oSOAPClient.GetParticulars(sID)
A sablonhoz szksgnk van egy Excel munkafzet-objektumra:

Dim oBook As Excel.Workbook


A Form TextBox kontroljban meg kell adni ennek a Template objektumnak a fizikai elrsi
tvonalt. Ezt a karakterlncot adjuk t az Excel objektumnak:

Set oBook = Application.Workbooks.Add(UserForm1.TextBox1.Text)


A MS Office 2000 s 2002 (XP) verziiban mkdik a makr, azonban a sablon cellit ms s ms
elnevezssel illeti a kt verzi, gy mindkt varicira megoldottuk a kitltst gy, hogy a Range
tmb elemire val hivatkozskor eltr nevet adtunk meg:

With oBook.ActiveSheet
If Application.Version = "10.0" Then
.Range("L4").Value = arrTemp(0)
...
ElseIf Application.Version = "9.0" Then
.Range("NO").Value = arrTemp(0)
...
End If
End With
Exit Sub
A metdust a Form felletn elhelyezett gomb lenyomsakor hvjuk meg a ListBox kontrolban
kivlasztott elemmel a paramterben:

GenerateForm ListBox1.List(ListBox1.ListIndex)
A mvelet vgn megkapjuk a kitlttt sablont.

17

18

Excel munkafzeteket konvertl osztly


ksztse
Ksztnk egy osztlyt, amely segtsgvel a Microsoft Excel ltal ismert, klnbz formtum munkkat
konvertlhatunk t egyik formtumbl a msikba. A forrsllomny s a clllomny formtumai a kvetkezk
lehetnek: Dbase4-es tbla, DIF llomny, Excel bvtmny, Excel munkafzet, Excel sablon, HTML, MSDOS szveg,
unicode szveg, PRN llomny s XML.
Az Excel ltal hasznlhat formtumok az Excel verzijtl s teleptstl fggek. Elfordulhat, hogy nem tudja felhasznlni
az sszes lehetsges formtumot.

Ahhoz, hogy az Excel elrhet legyen, egy referencit kell hozzadni projektnkhz. Vlasszuk a
Project - Add reference menpontot, majd a COM lapon keressk el a Microsoft Excel 10.0 Object
Library-t. A verziszm az ppen teleptett Excel verziszmtl fggen vltozhat.
Egy felsorolstpus segtsgvel ltrehozunk egy listt a hasznlhat formtumokrl.

public enum SaveFormats {sf_AddIn, sf_DBF4, sf_DIF, sf_HTML, sf_TextMSDOS,


sf_Template,
sf_TextPrinter, sf_UnicodeText, sf_WorkBook, sf_XMLSpreadsheet};
A konvertlst az Execute fggvny vgzi.

public static void Execute(string oldDocument, string newDocument,


SaveFormats sf)
A konvertland llomny nevt az oldDocument, a clllomny nevt a newDocument
paramterekben adhatjuk meg. Az llomnynevek megadsnl az elrskhz szksges elrsi
utat is meg kell adnunk. Az sf paramterben adhatjuk meg a ments formtumt.
A konvertlst gy hajtjuk vgre, hogy a httrben megnyitjuk a Microsoft Excel programot.
Betltjk a forrsllomnyt, majd elmentjk a newDocument-ben megadott nven, az sf
paramterben megadott formtumban.
Elszr meg kell nyitnunk az Excel programot.

Excel.Application excelApp = new Excel.ApplicationClass();


Az oldDocument paramterben magadott dokumentumot megnyitjuk a httrben.

object m = Missing.Value;
excelApp.Workbooks.Open(Application.StartupPath + "\\" + oldDocument, m, m,
m, m, m, m, m, m, m, m, m, m, m, m);
A dokumentum megnyitsakor szerencsnk van, mert az Excel automatikusan felismeri a megadott
llomny formtumt.
Ha az llomny betltdtt, akkor a SaveAs metdus meghvsval menthetjk el, ms nven s
formtumban.

excelApp.ActiveWorkbook.SaveAs(Application.StartupPath + "\\" +
newDocument, xlFormat, null, null, null, null,
XlSaveAsAccessMode.xlExclusive, null, null, null, null, null);
A mentsnl mr neknk kell megadnunk a ltrejv llomny formtumt.
Miutn ltrejtt az j llomny, nincs ms dolgunk, mint bezrni az Excel programot.

excelApp.ActiveWorkbook.Close(false, null, null);


excelApp.Quit();
A konvertls folyamata teljesen a httrben zajlik, a felhasznl szmra nem lthat mdon.
Azrt, hogy a ltrejv llomny a megfelel kiterjesztst kapja, ltrehoztuk a ValidateFileName
fggvnyt.

public static string ValidateFileName(string fileName, SaveFormats sf)


Bemen paramterknt az llomnynevet s a ments formtumt kell megadnunk. A fggvny a
formtumnak megfelel kiterjesztssel tr vissza.
A kiterjeszts mdostshoz a Path.ChangeExtension fggvnyt hasznljuk.

fileName = Path.ChangeExtension(fileName, ext);

19

Grafikon kszts Excel-ben


Excel programozsa 4. rsz
Minden grafikon alapja egy valamilyen mdon rendezett szmhalmaz. A mellkelt pldban mi egy
olyan tblzatot ksztettnk el, amelyet egy ketts ciklussal tltnk fel szmokkal, majd az
elkszlt tblzatot megjelentjk egy 3D oszlopdiagram formjban.

private void button1_Click(object sender, System.EventArgs e)


{
...
Els lpsben teht fel kell tltennk a tblzatunkat adatokkal.

for (int l=1; l<=3; l++)


{
for (int i=1; i<=6; i++)
{
ws.Cells[i, l] = i*l*12;
}
}
Ha ez megvan, akkor a grafikonban megjelenteni kvnt adatokat tartalmaz cellkat kijelljk az
albbi mdon:

ws.get_Range("A1", "C6").Select();
Ezutn hozzadunk a dokumentumunkhoz egy j diagram
fggvnyvel. Ennek lehetsges, de nem ktelez paramterei:

lapot, a Charts osztly Add

Before: az a munkalap, ami el a grafikont be szeretnnk szrni.


After: az a munkalap, ami utn a grafikont be szeretnnk szrni.
Count: a ltrehozand munkalapok szma (alapesetben 1).
Type: XlSheetType tpus konstans rtk: xlWorksheet, xlChart, xlExcel4MacroSheet, vagy
xlExcel4IntlMacroSheet.

Excel.Chart c = (Excel.Chart)ew.Charts.Add(m, m, m, m);


Vgl a ChartType property-vel llthatjuk be a grafikon tpust.

c.ChartType = Excel.XlChartType.xl3DColumn;
}

20

Excel fggvnyek futtatsa, teleptett


Excel nyelve
Excel programozsa 3. rsz
Sorozatunk mostani rszben azt vizsgljuk, hogy miknt tudunk az egyes cellkba nem csak
konstans rtkeket rni, hanem tetszleges Excel fggvnyeket is elhelyezni, valamint a fggvny
ltal szmtott rtket programbl kiolvasni.
Vizsgldsunk tovbbi trgya az Excel nyelvnek lekrdezse. Erre azrt is szksgnk lesz, mert
pldul a SUM fggvnyt a magyar nyelv Excel-be mr SZUM fggvnyknt kell rni. gy a nyelv
ismerete fontos, ha fel akarjuk kszteni alkalmazsunkat tbbfle Excel verzi kezelsre.
Ltrehozunk egy j Excel munkalapot a mr szoksos mdon s egyik oszlopba szmokat runk.

private void button1_Click(object sender, System.EventArgs e)


{
for (int i=1; i<10; i++)
{
ws.Cells[i, 1] = i*12.34;
}
A feladatunk az lesz, hogy ezen oszlop szmait sszegezzk az Excel SUM fggvnyvel s az
sszeget jelentsk meg sajt alkalmazsunkban is. Ehhez szksgnk lesz a Range objektumra,
mely most azt a cellt fogja lerni, ahov az Excel fggvnyt szrjuk be.

Excel.Range er = (Excel.Range)ws.Cells[10, 1];


Mieltt elvgeznnk a fggvny beszrst egy cellba, el kell dntennk programbl, hogy milyen
nyelv Office lett teleptve. Ettl fgg majd hogy SUM, vagy SZUM nev fggvnyt kell-e
alkalmaznunk. (Alkalmazsunkban most csak az angol, illetve a magyar nyelv Office verzikkal
foglalkozunk.)
Az Office nyelv azonostjt lekrdezhetjk az Excel alkalmazs objektumnak LanguageSettings
property-jn keresztl elrhet get_LanguageID fggvnnyel.

label3.Text =
ea.LanguageSettings.get_LanguageID(Microsoft.Office.Core.MsoAppLanguageID.m
soLanguageIDInstall).ToString();
Magyar nyelv Office esetn 1038 lesz a visszaadott szm. A get_LanguageID fggvny vr egy
paramtert is, mely az albbiak egyike lehet:
Konstans

Lers

msoLanguageIDHelp

Az Office sgjnak nyelve.

msoLanguageIDInstall

A teleptett Office nyelve.

msoLanguageIDUI

Az Office felhasznli felletnek nyelve.

Az Office nyelvt teht vizsglhatnnk a get_LanguageID fggvny ltal visszaadott szm alapjn
is, de van erre egy mg egyszerbb mdszer. Ez pedig a get_LanguagePreferredForEditing
fggvny. Ennek paramterknt meg kell adnunk egy nyelvet, majd a fggvny igaz rtkkel tr
vissza, ha az Office ltal az adott nyelv tmogatott.
A nyelv ismeretben mr tudjuk, hogy a SZUM, vagy a SUM fggvnyt kell-e hasznlnunk, mely
funkcijban nyilvn azonos, csupn a lersa ms. A fggvnyt a mr ltrehozott Range objektum
FormulaArray property-n keresztl helyezhetjk el sztringknt. Ezt a sztring pont olyan lesz, mint
amikor manulisan runk be egy cellba egy Excel fggvnyt.

if
(ea.LanguageSettings.get_LanguagePreferredForEditing(Microsoft.Office.Core.
MsoLanguageID.msoLanguageIDHungarian))
{
er.FormulaArray = "=Szum(A1:A9)";
}
else
{
er.FormulaArray = "=Sum(A1:A9)";
}
A cella eredmnyt most a NumberFormat property-n keresztl egyedi formjv alaktjuk.

er.NumberFormat = "# ##0,00 Ft";


er.Font.Italic = Convert.ToInt32(true);

21

Vgl mr csak az eredmnyt kell kiolvasnunk s megjelentennk az alkalmazsunkban. Erre kt


md is ltezik: az egyik a Range objektum Text property-je, a msik a Value2 property. Mindkt
esetben megkapjuk az eredmnyt, de Text property-n keresztl a formzott rtket kapjuk vissza
szvegknt, mg a Value2 property-n keresztl csak az rtket szmknt.

label1.Text = er.Text.ToString();
label2.Text = er.Value2.ToString();
}

22

Cellaformzs az Excel tblban


Excel programozsa 2. rsz
Cikksorozatunk elz rszben mr eljutottunk odig, hogy tudunk j dokumentumot ltrehozni az Excel-ben, s abba
adatokat bevinni. Ebben a cikkben most nhny cellaformzssal kapcsolatos funkcit valstunk meg, hogy
tblzatainkban ne csak mlesztve legyenek az adatok, hanem legyen valamilyen klalakja is.

Elszr is ltrehozunk egy j Excel tblt, majd feltltjk nhny adattal. Ezt kveten rtrhetnk
a cellk formzsra, melyet megtehetnk egy cella esetben, de akr tbb cellnl egyszerre is.
Utbbi esetben ki kell jellnnk azt a terletet, melyet formzni szeretnnk. Ehhez ksztnk egy
Range objektumot, melyben gy adhatjuk meg a kijellni kvnt tglalapot, hogy megadjuk bal
fels sarknak celljt, illetve jobb als celljt. E kt cella egyrtelmen kijell egy tglalapot a
tblzatban.

Excel.Range er = ws.get_Range("B1", "K13");


A kijellt terlet keretnek a tulajdonsgait a Range Borders property-n keresztl rhetjk el. Itt
bellthatjuk a keret vonalnak stlust, vastagsgt, sznt, stb.

er.Borders.LineStyle=Excel.XlLineStyle.xlContinuous;
er.Borders.Weight=Excel.XlBorderWeight.xlThin;
er.Borders.Color=ToRgb(Color.Blue);
Hogy a cellkon bell hova legyen igaztva a tartalom, azt a HorizontalAlignment property-n
keresztl szablyozhatjuk.

er.HorizontalAlignment=Excel.XlHAlign.xlHAlignCenter;
A kijellt cellk szlessgt a ColumnWidth property adja meg.

er.ColumnWidth=5;
Lehetsg van arra is, hogy egy terletnek csak a hatrvonalain vltoztassuk meg a keret
tulajdonsgait. Ehhez a Borders get_Item fggvnyt kell hasznlnunk, melynek paramterben
megadhat, hogy a terlet melyik szlt szeretnnk elrni. Ha ez mr megvan, akkor ugyangy
mint az elbb, hasznlhatjuk a vonal stlus, szn, stb. property-ket az rtkek belltshoz.

er = ws.get_Range("B1", "K1");
er.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).LineStyle=Excel.XlLi
neStyle.xlDouble;
er.Borders.get_Item(Excel.XlBordersIndex.xlEdgeBottom).Color=ToRgb(Color.Re
d);
er.Font.Bold=true;
A Range osztlynak is van Font property-je, melyen keresztl a kijellt terlet bettpusnak
tulajdonsgai llthatk be tetszs szerint.

er = ws.get_Range("A1", "A13");
er.Font.Bold=true;
A Borders osztly LineStyle property-jnek belltsval teht a kijellt cella krvonala a megadott
stlus vonalra vltozik. A LineStyle property rtke a kvetkez konstansok egyike lehet:
xlContinuous, xlDash, xlDashDot, xlDashDotDot, xlDot, xlDouble, xlSlantDashDot, s
xlLineStyleNone
A Borders.Weight property segtsgvel belltjuk a vonal vastagsgt. Ezt szintn konstansokkal
kell megadnunk: xlHairline, xlThin, xlMedium, vagy xlThick.
A cellk szvegnek vzszintes igaztst a HorizontalAlignment property-vel adhatjuk meg:
xlHAlignCenter, xlHAlignDistributed, xlHAlignJustify, xlHAlignLeft, vagy xlHAlignRight. Range s
Style objektumoknl a kvetkez konstansok is hasznlhatk: xlHAlignCenterAcrossSelection,
xlHAlignFill, s xlHAlignGeneral.

23

Alapvet mveletek az Excel-ben


Excel programozsa 1. rsz
Az Office programozsval foglalkoz cikksorozatunk eddigi rszeiben a Word-el ismerkedhettnk meg. Most rtrnk
az Excel alkalmazs programozsra, amely sorn a legalapvetbb mveletek elvgzse lesz a clunk, termszetesen
C# szemszgbl nzve. Ilyen mvelet az j tblzat ltrehozsa, meglv megnyitsa, mentse s termszetesen az
adatok rsa az Excel tblba.

Ahhoz, hogy az Excel elrhet legyen, itt is szksges egy referencit hozzadni projektnkhz.
Vlasszuk teht a Project - Add reference menpontot, majd a COM lapon keressk el a Microsoft
Excel 10.0 Object Library-t. A verziszm az ppen teleptett Excel verziszmtl fggen
vltozhat.
A kapcsolat
Els feladatunk lesz, hogy csatlakozzunk az Excel-hez s lthatv tegyk az alkalmazst. Ez
hasonlan trtnik, mint a Word esetben, teht a kd a kvetkez:

Excel.Application ea = new Excel.Application();


ea.Visible = true;
j munkafzet
Egy j Excel munkafzet ltrehozsa az alkalmzs Workbooks property-jnek Add fggvnyvel
trtnhet.

Excel.Workbook ew = ea.Workbooks.Add(m);
Az Add fggvnynek egyetlen paramtere lehet:
Template: XlWBATemplate tpus paramter, melynek a kvetkez rtkei lehetnek: xlWBATChart,
xlWBATExcel4IntlMacroSheet, xlWBATExcel4MacroSheet, s xlWBATWorksheet. Ha nem hasznljuk
ezt a lehetsget, akkor kapunk egy res munkafzetet, alaprtelmezs szerint 3 munkalappal.
Ha mr van ltez Excel tbla llomnyunk s azt szeretnnk megnyitni, akkor a Workbooks Open
fggvnyt kell hasznlnunk:

Excel.Workbook ew =
ea.Workbooks.Open(Application.StartupPath+"\\teszt.xls", m, m, m, m, m, m,
m, m, m, m, m, m, m, m);
Meglv munkafzet megnyits a
Az Open fggvnynek mr tbb paramtere van az Add-hoz kpest:
Open(FileName,
UpdateLinks,
ReadOnly,
Format,
Password,
WriteResPassword,
IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMRU);

FileName: a megnyitand fjl neve.


UpdateLinks: 0 rtk esetn nem, 1 esetn csak a kls, de nem tvoli, 2 esetn csak a
tvoli s 3 esetn az sszes hivatkozst frissti.
ReadOnly: csak olvashat mdban nyitja meg a fjlt.
Format: ha szvegfjlt adunk meg, akkor ez a paramter hatrozza meg az egyes mezk
kztti elvlaszt jelet: 1=tabultor karakter, 2=vessz, 3=szkz, 4=pontosvessz,
5=semmi s 6=a Delimiter paramterben megadott karakter.
Password: a megnyitshoz szksges jelsz.
WriteResPassword: rsvdelemhez hasznlt jelsz.
IgnoreReadOnlyRecommended: igaz esetn figyelmezteti a felhasznlt, hogy csak
olvashat mdban nyissa meg a dokumentumot.
Origin: ha szvegfjlt nyitunk meg, akkor szksges ezt a paramtert megadni. A
paramter azt hatrozza meg, hogy a szvegfjl melyik platformrl szrmazik, mivel a
sorvge karakterek klnbzhetnek egymstl. Lehetsges rtkei: xlMacintosh,
xlWindows, s xlMSDOS.
Delimiter: a mezket elvlaszt karakter.
Editable: ha a megnyitand fjl egy add-in modul, akkor annak megjelensi formjt
hatrozza meg. Csak Excel 5.0-nl rgebbi verzij Excel-eknl hasznlatos.
Notify: ha a fjlt nem sikerlt olvass/rs mdban megnyitni, akkor igaz esetn
megprblja megnyitni csak olvashat mdban.
Converter: az elsdleges hasznland fjl konverter indexe.
AddToMRU: igaz esetn hozzadja a fjl nevt az utoljra megnyitott fjlok listjhoz a Fjl
menben.

Munkafzet mentse
Miutn dolgoztunk a munkafzettel azt rendszerint el is szeretnnk menteni. Ehhez a WorkBooks
osztly Save vagy SaveAs fggvnyt hasznlhatjuk.
A Save paramter nlkli, teht csak akkor hasznlhatjuk, ha mr lett mentve a munkafzet, csak
vltozott s most ismt menteni szeretnnk.

24

A SaveAs-t hasznlhatjuk az els mentsre, vagy egy mr meglvt menthetnk ms nvvel.

ew.SaveAs(Application.StartupPath+"\\teszt2.xls", m, m, m, m, m,
Excel.XlSaveAsAccessMode.xlShared, m, m, m, m, m);
SaveAs(Filename,
FileFormat,
Password,
WriteResPassword,
ReadOnlyRecommended,
CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodePage, TextVisualLayout);

FileName: fjlnv.
FileFormat: XlFileFormat tpus konstans rtk, amely a fjl formtumt hatrozza meg. Ha
nem adjuk meg, akkor az alaprtelmezett formtumban, ill. megnyitott llomny esetn az
eredeti formtumban menti el az Excel. xlAddIn, xlCSV, xlCSVMac, xlCSVMSDOS,
xlCSVWindows, xlCurrentPlatformText, xlDBF2, xlDBF3, xlDBF4, xlDIF, xlExcel2,
xlExcel2FarEast, xlExcel3, xlExcel4, xlExcel4Workbook, xlExcel5, xlExcel7, xlExcel9795,
xlHTML,
xlIntlAddIn,
xlIntlMacro,xlSYLK,
xlTemplate,
xlTextMac,
xlTextMSDOS,
xlTextPrinter, xlTextWindows, xlUnicodeText, xlWJ2WD1, xlWK1, xlWK1ALL, xlWK1FMT,
xlWK3, xlWK4, xlWK3FM3, xlWKS, xlWorkbookNormal, xlWorks2FarEast, xlWQ1, xlWJ3,
xlWJ3FJ3.
Password: a fjl megnyitshoz szksges jelsz.
WriteResPassword: az rsvdelem feloldshoz szksges jelsz.
ReadOnlyRecommended: igaz esetn megnyitskor figyelmezteti a felhasznlt, hogy csak
olvashat mdban nyissa meg a fjlt.
CreateBackup: biztonsgi msolat kszl az utoljra mentett vltozatrl.
AccessMode: a hozzfrs mdjt hatrozza meg. XlSaveAsAccessMode tpus konstans
rtk: xlShared (megosztott), xlExclusive (kizrlagos), vagy xlNoChange (nem
vltoztatjuk meg az eredeti belltst).
AddToMru: igaz esetn hozzadja a fjl nevt az utoljra megnyitott fjlok listjhoz a Fjl
menben.
TextCodePage: nem hasznlt.
TextVisualLayout: nem hasznlt.

Adat rsa a cellkba


Mit sem r tblzatunk, ha nincsenek benne adatok. Adott egy Worksheet osztly, mellyel ez
megoldhat. Az Application osztly tartalmaz egy Worksheets tmbt, melynek minden eleme
Worksheet tpus. E tmbnek annyi eleme van, ahny lapja a munkafzetnek. gy egy lap
kivlasztshoz ebbl a tmbbl kell vlasztanunk.

Excel.Worksheet ws = (Excel.Worksheet)ea.Worksheets[1];
Ha ez megvan, akkor a Worksheet Cells nev property-jn keresztl a tblzat sszes cellja, mint
egy kt dimenzis tmb elrhet. gyeljnk arra a tmb indexelsnl, hogy az els indexbe kerl
a sor szma, mg a msodikba az oszlop szma. Mindkt szmozs egytl indul.

for (int y=10; y<=20; y++)


{
for (int x=1; x<=5; x++)
{
ws.Cells[y, x] = y*x;
}
}
Cellaformzs
Ha mr rtunk adatot a cellkba, akkor ezeket knnyedn meg is formzhatjuk. Ehhez egy Range
objektumot hasznlunk, melynek gy adunk rtket, hogy a Worksheet get_Range fggvnyt
meghvjuk. Ennek paramterknt kt cella koordintjt adhatjuk meg. E kt cella kijell egy
tglalapot a munkalapon. Az els paramter a tglalap bal fels, mg a msodik a jobb als celljt
cmzi. Ezek utn a kapott Range objektum Font property-jn keresztl tetszleges bettpust
vlaszthatunk a kivlasztott terlet cellinak.

Excel.Range er = ws.get_Range("A10", "E20");


er.Font.Size=8;
er.Font.Bold=true;
Nyomtats
A munkalapokat ki is tudjuk nyomtatni a Workbook PrintOut fggvnynek meghvsval.
Az elkszlt tblzatot s grafikont ltalban ki is szoktuk nyomtatni, ezt szintn megtehetjk
programbl is. Ha kzvetlenl a nyomtatra akarjuk kldeni a dokumentumot, akkor a Workbooks
osztly PrintOut metdust, ha csak egy nyomtatsi kpet szeretnnk megjelenteni, s a tbbit a
felhasznlra bzzuk, akkor a PrintPreview metdust alkalmazzuk.
PrintOut(From, To, Copies, Preview, ActivePrinter, PrintToFile, Collate, PrToFileName)

From: a kezd oldal sorszma.


To: az utols oldal sorszma.

25

Copies: a msolatok szma.


Preview: igaz esetn a nyomtats eltt megjelenti a nyomtatsi kpet.
ActivePrinter: a nyomtat nevnek megadsra szolgl.
PrintToFile: igaz esetn fjlba nyomtat.
Collate: igaz esetn levlogatja a msolatokat (ha a Copies>1 !).
PrToFileName: fjlba nyomtats esetn a fjl neve.

Ha csak nyomtatsi kp megjelentsre lenne szksgnk, akkor ezt a PrintPreview fggvny


hvsval tehetjk meg.

ew.PrintPreview(true);
PrintPreview(EnableChanges);

EnableChanges: true esetn engedlyezzk a vltoztatsokat a nyomtatsi kpen.

26

Real-Time Data Server (RTD), avagy


automatikusan frissl Excel cellk
Kpzeljnk el egy olyan Excel tblzatot, melynek celliba az adatokat sajt alkalmazsunk
szolgltatja, radsul vals idben frisstve akr. Mivel az adatok sajt alkalmazsunkbl kerlnek
t az Excel celliba, gy az adatforrs s annak ellltsi mdja csak rajtunk mlik. Hogy milyen
idkznknt frisslnek a cellk az szintn csak az alkalmazsunkon mlik, vagyis attl fgg, hogy
az adataink milyen gyakorisggal vltoznak. Az Excel celliba csupn egy egyszer fggvnyhvst
kell rni, pl.: =RTD("alkalmazs nv";paramterek) formjban s mris megkapjuk a programunk
ltal visszaadott rtket. Ha az adatokhoz mondjuk egy grafikon is tartozik, akkor ennek tartalma
is dinamikus lesz: ahogy vltoznak az adatok, gy kveti ezt a grafikon is.
Ha elkpzeltk mindezt, akkor most valstsuk is meg...
A megoldshoz egy specilis DLL-t kell ksztennk, melyet COM szerverknt regisztrlva
hasznlhatunk. Amikor az Excel egy-egy celljba egy =RTD(... fggvnyhvs kerl, akkor az ott
hivatkozott program indul el s ad rtket a cellnak. Ezt az rtket ettl kezdve pp gy
felhasznlhatjuk az Excel-ben mint brmely ms fggvny eredmnyt. Klnbsg csak annyi lesz,
hogy e cellnak rtke automatikusan vltozni fog, ahogy azt a programunkban elrjuk.

Nzzk most miknt is trtnik a megvalsts: hozzunk ltre egy j projektet, mely Class Library
tpus legyen, vagyis DLL llomnyba kerljn a programunk. Ezt COM szerverknt szeretnnk
zemeltetni, gy a megfelel regisztrcihoz vlasszuk ki az RTDLibrary nev projektnket, majd
jobb gomb s Properties menpont. A megjelen ablakban vlasszuk a Configuration Properties Build elemet. Ekkor elrhetv vlik a Register for COM interop tulajdonsg, melyet lltsunk
igazra.
Tovbbi elkszletknt szksges mg az Excel nvtr hasznlathoz annak importlsa is. Ehhez
vlasszuk a Project - Add reference menpontot is, majd a COM lapon keressk el a Microsoft
Excel 10.0 Object Library elemet. A verziszm lehet klnbz, de a Real-Time Data Server
szolgltats hasznlathoz minimlisan az Excel 10-es verzijt, vagyis az Excel XP-t kell
hasznlnunk. Ezek utn mr hivatkozhatunk az Excel nvtrre:

using Excel;
Alkalmazsunk regisztrcijhoz, illetve ksbbi azonostshoz szksgnk lesz egy nvre. Ezt az
egyedi sztringet a ProgId attribtumba kell megadnunk alkalmazsunk rszre. A ltrehozott
osztlyban az IRtdServer interfsz implementlsa vlik szksgess, hogy megvalsthassuk a
kvnt funkcit.

[ProgId("Animare.RTDTest"), ComVisible(true)]
public class RTDClass: IRtdServer

27

{
...
Jelen pldnkban a kvetkez feladatot valstjuk meg: olyan szmokat szolgltatunk az Excel
cellk szmra, melyeknek rtke vletlenszeren n, vagy cskken. A szmok 0 s 1000 kz kell
hogy essenek minden esetben. A feladat egyszersge miatt sok szolgltatst nem hasznljuk ki
a RTD-nek, jelen cikknek nem feladata egy vals helyzetben hasznlt alkalmazs ksztse, hanem
csak annak bemutatsa, hogy milyen alapvet lpsek szksgesek egy ilyen lehetsg
megvalstshoz.
A tovbbi lpsek eltt tegynk egy kis kitrt s nzzk meg, hogy miknt is alkalmazhatjuk majd
az Excel cellban az alkalmazsunkat. Ez az albbi kplet beszrsval oldhat meg:

=RTD("Animare.RTDTest";;1)
Az RTD fggvny els paramterben azonostjuk az alkalmazsunkat. Ide kerl az a sztring,
melyet a ProgId attribtumban megadtunk. A fggvny msodik paramterben megadhatnnk
egy gpnevet. Erre akkor van szksgnk, ha alkalmazsunk nem azon a szmtgpen fut, ahol
az Excel tbla van, hanem a hlzat egy msik gpn. A harmadik s a tovbbi paramterek
tetszleges rtkeket tartalmazhatnak. Ezeket az rtkeket alkalmazsunkbl ki tudjuk majd
olvasni s tetszs szerint felhasznlni. Ezt a lehetsget tudjuk kihasznlni annak rdekben, hogy
az Excel tbla klnbz celliba alkalmazsunk ltal klnbz rtkeket adjunk vissza, klnfle
feltteleknek megfelelen.
Trjnk most vissza az alkalmazsunk fejlesztshez. Itt nincs ms teendnk, mint az IRtdServer
interfsz fggvnyeihez a szksges kdot megrnunk.
A ServerStart fggvny akkor kerl meghvsra, amikor az Excel tblban egy RTD hvs tallhat
s az Excel aktivizlja programunkat. Itt paramterknt kapunk egy IRTDUpdateEvent interfszt,
melynek segtsgvel elvgezhetjk majd az automatikus adatfrisstst. Erre ksbb visszatrnk
mg, most csak annyi a teendnk, hogy troljuk ennek a paramternek az rtkt egy sajt
vltoznkba.

public int ServerStart(Excel.IRTDUpdateEvent CallbackObject)


{
updateEvent = CallbackObject;
Az automatikus adatfrisstst most gy valstjuk meg, hogy ltrehozunk egy Timer komponenst,
melyet megkrnk, hogy msodpercenknt hozza ltre az Elapsed nev esemnyt. Itt fogjuk
majd az Excel tbla cellit frissteni.

timer = new Timer(1000);


timer.Elapsed+=new ElapsedEventHandler(TimerElapsed);
timer.Enabled=true;
return 1;
}
A ServerTerminate fggvny akkor kerl meghvsra, ha alkalmazsunkra a tovbbiakban mr
nincs szksg. Ekkor nincs ms teendnk mint lelltjuk az idztt, hogy a tovbbiakban ne
frissljenek a cellk.

public void ServerTerminate()


{
timer.Enabled=false;
}
A kvetkez fggvny a ConnectData nev lesz. Ez akkor kerl meghvsra mikor az Excel
rtelmezte az RTD hvst, mr ltrehozta a kapcsolatot a programunkkal (ServerStart) s a cellba
bern a kezd rtket. A ConnectData ltal visszaadott rtke lesz a cella kezdrtke. Mivel az
Excel tbla tbb RTD hvst is tartalmazhat, melyet azonos alkalmazs szolgl ki, gy szksg van
arra, hogy az egyes cellkat meg tudjuk klnbztetni egymstl. Ezrt minden ilyen cella kap egy
egyedi azonostt. A ConnectData annyiszor kerl meghvsra, ahny ilyen cella van. A fggvny
els, TopicID paramterben kapjuk meg a cella azonost szmt, melyet clszer eltrolnunk,
hogy ksbb hivatkozhassunk erre a cellra. A trolshoz most egy NameValueCollection-t
hasznlunk. Ebbe a kollekciba olyan elemeket tudunk trolni, melyeknl kt sztring kap helyet
elemenknt. Az els sztringben fogjuk trolni a TopicID cella azonost szmot, a msikban pedig a
cella aktulis rtkt, melyet most 500-ra lltunk, mint kezd rtket.
Kapunk egy Strings nev paramtert is, mely egy olyan tmb, amelybe az RTD hvsnl megadott
tetszleges szm paramternk kaphat helyet. Jelen pldnkban erre nincs szksgnk, gy ezt
nem hasznljuk.

public object ConnectData(int TopicID, ref Array Strings, ref bool


GetNewValues)
{
data.Add(TopicID.ToString(), "500");
return 500;
}
Amikor egy-egy RTD cellra mr nincs szksg, mert pldul a felhasznl trlte ezt a cellt az
Excel tblbl, akkor kerl meghvsra a DisconnectData. Itt a paramterknt kapott TopicID

28

tartalmazza a trlend rtk azonostszmt. Ekkor


csak annyi a teendnk, hogy a NameValueCollection
kollekcinkbl trljk az ott trolt rtket.

public void DisconnectData(int


TopicID)
{
data.Remove(TopicID.ToString());
}
A RefreshData fggvny akkor kerl meghvsra, ha az
Excel tbla RTD cellinak tartalmt frissteni kell. Ez a
fggvny egy tmbt vr visszatrsi rtkknt. Ebbe
a tmbbe rhatjuk le, hogy aktulisan milyen rtkeket
szeretnnk
a
cellkhoz
rendelni.
A
tmbnek
ktdimenzisnak kell lennie: az egyik dimenzi a cella
azonostkat tartalmazza (TopicID), a msik az adott
cellhoz tartoz aktulis rtket. A tmb elemei object
tpusak. A paramterknt kapott TopicCount-ba kell
megadnunk az Excel szmra, hogy a visszaadand
tmb hny elemet tartalmaz, vagyis hny cellnak az
adatait adjuk vissza, mivel nem ktelez llandan az
sszes cellt frissteni.
Nincs teht ms teendnk, mint ltrehozni egy ktdimenzis tmbt, melybe elfr az sszes
adatunk s ezt egy for ciklussal feltlteni a trolt NameValueCollection kollekcinkbl, majd az gy
ltrehozott tmbt visszaadni az Excel szmra.

public Array RefreshData(ref int TopicCount)


{
object[,] a = new object[2, data.Count];
TopicCount=data.Count;
for (int i=0; i<data.Count; i++)
{
a[0, i] = Convert.ToInt32(data.GetKey(i));
a[1, i] = Convert.ToInt32(data.GetValues(i)[0]);
}
return a;
}
Vgl mr csak egy dolgunk maradt: meg kell hatroznunk, hogy a frissts mikor jjjn ltre,
vagyis az Excel mikor hvja meg a RefreshData fggvnynket. Ehhez, mint mr emltettk a
Timer-t hasznljuk fel. Amikor lejr a belltott egy msodperc, akkor meghvjuk az UpdateData
fggvnynket, mely elvgzi a trolt adatok frisstst. Ezt kveten mr csak az Excel-t kell
rtestennk, hogy az adatok frissltek, ideje kiolvasni azokat. Ehhez a ServerStart fggvny
hvsakor kapott IRTDUpdateEvent interfsz UpdateNotify fggvnyt kell meghvnunk. Ennek
hatsra az Excel meghvja a RefreshData fggvnyt s frissti a cellkat.

public void TimerElapsed(object source, ElapsedEventArgs e)


{
UpdateData();
updateEvent.UpdateNotify();
}
Az UpdateData fggvny vgigmegy az sszes trolt adaton s vletlenszeren nveli/cskkenti az
aktulis rtket 0 s 1000 kztt.
Ezzel alkalmazsunk el is kszlt. Fordtsuk most le. A DLL ltrejttvel a regisztrci is
megtrtnik, hiszen ezt belltottuk az elejn. Nzzk most hogyan is tudjuk felhasznlni a
programunkat. Ltrehozunk egy Excel tblt s cellba berjuk az albbi hivatkozst:

=RTD("Animare.RTDTest";;1)
Ennek eredmnye egy hibazenet lesz! Ez annak ksznhet, hogy az Excel-ben alaprtelmezetten
a legmagasabb vdelmi szint van belltva, mely megakadlyozza, hogy krtkony programkdok
lefussanak, ami helyes is, csak pp lehetetlen teszi sajt alkalmazsunk futst is. Ennek
megoldsakpp cskkentsk a vdelmi szintet kzepesre. gy minden program futtatsa eltt egy
krdst kapunk az Excel-tl, hogy engedlyezzk-e vagy sem. Ezzel a krtkony kdok futst a
tovbbiakban is megakadlyozhatjuk, de sajt alkalmazsunk futtatsra most mr md nylik.
Ehhez vlasszuk az Excel-ben az Eszkzk - Makrk - Biztonsg menpontot. A megjelen
ablakban a biztonsgi szintet lltsuk kzepesre.

29

Ha most megnyitjuk a RTD cellkat tartalmaz Excel tblt, akkor kapunk egy figyelmeztet
zenetet, melyben engedlyezhetjk, vagy tilthatjuk a program futst. Az itt megjelen ablakban
egy rdekes dologra figyelhetnk fel: az zenet szerint a futtatand llomny a
C:\WINDOWS\System32\mscoree.dll s nem is a sajt alkalmazsunk lenne. Ennek oka a
kvetkez: a .NET-ben kszlt DLL COM szerverknt val mkdshez elengedhetetlen nmi
kls segtsg, mely a mscoree.dll lesz. Ez fogja majd aktivizlni a mi DLL-nket, de ennek
rszletei mr egy kln tma.
Ha megnzzk a Windows regisztrcis adatbzisban az Animare.RTDTest bejegyzst, akkor ott
lthat, hogy C:\WINDOWS\System32\mscoree.dll van megadva futtatand alkalmazsknt, de
tallhat egy msik bejegyzs is, mely mr tnylegesen a mi programunkra hivatkozik:

CodeBase
file:///F:/So/Cso/0
214/RTDLibrary/bin/
Debug/RTDLibrary.DL
L

30

Office Spreedsheet ActiveX jellemzi


A Microsoft Office alkalmazsokat nemcsak COM komponenseik rvn rhetjk el, hanem akr az ltalunk felteleptett
ActiveX komponenseket is felhasznlhatjuk az alkalmazsaink rlapjain. Ilyen pldul az Excel alkalmazs ltal
teleptett Spreadsheet komponens, melynek rvn kzvetlenl szerkeszthetnk egy Excel munkalapot. Cikknkben
bemutatjuk, hogyan hasznlhatjuk fel a komponenst, s hogy milyen kezelk rendelhetk az egyes mveletek kzben
generlt esemnyekhez.

A mellkelt pldban bemutatand Excel ActiveX komponens hasznlathoz fel kell csak dobnunk
azt a ToolBox elemei kzl a Form-ra, s belltanunk a szksges tulajdonsgokat. A komponens
az Office csomag Web Components egyttesnek rszeknt telepl fel a rendszernkbe s
verzitl fggen az MSOWC.DLL vagy az MSOWC10.DLL llomnyokban tallhat. Az Office XP
teleptsekor mindkt DLL rendelkezsnkre ll.

Ahhoz, hogy a komponens elrhet legyen a ToolBox-ban, fel kell azt vennnk oda. Ehhez
kattintsunk a ToolBox paneljn az egr jobb gombjval, majd a megjelen menbl vlasszuk a
Customize ToolBox menpontot. A felbukkan ablak COM Components fle alatt keressk meg a
Microsoft Office Spreadsheet 9.0 elemet, majd jelljk be a mellette tallhat CheckBox-ot. Ezt
kveten mr a ToolBox tartalmazza a kontrolt.
A Microsoft Office Spreadsheet 10.0 komponens valamilyen okbl nem mkdik megfelelen egytt
a .NET 1.0 futtatrendszerrel, ezrt vlasztottuk a 9.0 verzit.
A kontrolt feldobva a Form-ra megjelenik egy Excel munkalap kevesebb funkcit tartalmaz msa.
A cellkat szerkeszthetjk, formzhatjuk, az eredmnyt llomnyba exportlhatjuk. A mveletek
tbbsghez egy-egy esemny kapcsolhat, melyek elkaphatk, informciik lekrdezhetk.
Lssuk, milyen esemnyekrl beszlhetnk.
Az els a Command nevet viseli, s minden olyan esetben ltrejn, amikor az eszkzpalettjn
tallhat funkcik kzl valamelyiket kivlasztjuk s vgrehajtjuk. Ehhez deklarlhatunk egy
kezelt, melynek tpusa AxOWC.IWebCalcEventSink_CommandEventHandler.

this.axSpreadsheet1.Command += new
AxOWC.IWebCalcEventSink_CommandEventHandler(this.Command);
A
kezelmetdus
patamterei
kzl
AxOWC.IWebCalcEventSink_CommandEvent.

msodik

specilis,

tpusa

private void Command(object sender, AxOWC.IWebCalcEventSink_CommandEvent e)


{
statusBar1.Text = "Parancs futsa elkezddtt...";
}
Amikor valamely cella szerkesztst befejeztk s a fkusz mr nincs a celln, akkor az ENDEDIT
esemny fut le.

this.axSpreadsheet1.EndEdit += new
AxOWC.IWebCalcEventSink_EndEditEventHandler(this.EndEdit);

31

A kezelmetdus paramtere AxOWC.IWebCalcEventSink_EndEditEvent tpus. A paramter


rendelkezik egy tagobjektummal, melynek neve EVENTINFO, s amelyen keresztl informcik
szerezhetk a cellval kapcsolatban.
A tagobjektum Range elemnek Address property-jbl egy karakterlnc formjban lekrdezhet,
hogy melyik cellrl van sz. Az eredmny lehet pldul A1, stb.
Az EDITDATA property lehetsget ad arra, hogy a cellba bert adatot lekrdezzk. Az eredmny
itt is egy karakterlnc lesz. Az EndEdit esemny kezelje teht a kvetkezkppen fest:

private void EndEdit(object sender, AxOWC.IWebCalcEventSink_EndEditEvent e)


{
statusBar1.Text = e.eventInfo.Range.Address + " cella adata: " +
e.eventInfo.EditData;
}
Ha valamely cella tartalmt szerkesztjk, de a szerkeszts mvelett megszaktjuk azzal, hogy
megnyomjuk az ESC gombot, vagy megvltoztatjuk az aktv cellt egy egrkattintssal (lnyeg
hogy az ENTER billenty nem kerl lenyomsra), akkor a CALCELEDIT esemny kvetkezik be.

this.axSpreadsheet1.CancelEdit += new
AxOWC.IWebCalcEventSink_CancelEditEventHandler(this.CancelEdit);
Az esemnykezel pedig AxOWC.IWebCalcEventSink_CancelEditEventHandler tpus:

private void CancelEdit(object sender,


AxOWC.IWebCalcEventSink_CancelEditEvent e)
{
statusBar1.Text = e.eventInfo.Range.Address + " cella trlve!";
}
A cellk valamelyikn kattintva egy jabb esemny generldik, melynek neve CLICKEVENT.

this.axSpreadsheet1.ClickEvent += new
AxOWC.IWebCalcEventSink_ClickEventHandler(this.ClickEvent);
A kezelfggvnyt IWebCalcEventSink_ClickEventHandler tpusra kell vlasztanunk.

private void ClickEvent(object sender, AxOWC.IWebCalcEventSink_ClickEvent


e)
{
statusBar1.Text = "Aktv cella: " + e.eventInfo.Range.Address;
}

32

Microsoft Office XP webes komponensek


A Microsoft Office XP alkalmazs-egyttes megjelentetsvel a cg elrhetv tett egy webes komponens-csomagot,
melynek segtsgvel knnyedn publiklhatjuk az Office programokban ksztett dokumentumainkat, munkalapjainkat
a Web-en. Cikknkben a csomag egyik elemvel ismerkedhetnk meg, bemutatva hogyan rhetjk el programunkbl,
s hogyan hasznlhat Excel munkalapok publiklsra.

A csomag a Microsoft Office XP Web Components nevet viseli, mely utal arra, hogy tbb
komponens is helyet kapott benne. Ezek tulajdonkppen ActiveX komponensek, melyek kiegsztik
az alkalmazsok egyes elemeinek funkcionalitst.
Amikor az ilyen mdon publiklt Office dokumentumokat egy bngszn keresztl nzi a ltogat,
akkor lehetsge van arra, hogy rendezze, szrje, mdostsa az adatokat. St azzal az elnnyel is
brnak, hogy tkletesen programozhatk, vagyis fejlesztknt funkcionalitsukat programjainkbl
is elrhetjk.
Cikknkben a komponenscsomag Spreadsheet nev elemvel ismerkedhetnk meg, mely nevvel
is sugallja, hogy funkcionalitsa az Excel alkalmazshoz kapcsoldik.
A mellkelt programban ltrehoztuk a komponensre hivatkoz referencit, majd a pldnyostottuk
a Spreadsheet objektumot.

A referencia hozzadsa gy trtnik, hogy az Add reference dialgusablakbl kivlasztjuk a


Microsoft Office XP Web Component COM komponenst.
A program kdjban az OWC10 karakterlnccal hivatkozhatunk a COM komponens nvterre.
A pldban a mellkelt Employees.xml llomny tartalmt olvassuk be egy DataSet objektumba,
majd jelentjk meg az adathalmazt egy DataGrid kontrolban. Ezt kveten rjk el a Spreadsheet
objektumot, s hvjuk meg annak exportl metdust, mely egy Web-kpes Excel llomnyt
generl. Az llomny tartalmazza az XML adatait tblzatos formban.
A pldnyosts egyszeren trtnik.

SpreadsheetClass xlsheet = new SpreadsheetClass();


Ezt kveten a DataSet adatait az objektum celliba rjuk. Ehhez kt ciklust indtunk.

for(int j=0;j<ds.Tables[0].Rows.Count;j++)
{
for(int i=0;i<ds.Tables[0].Columns.Count;i++)
{
xlsheet.ActiveSheet.Cells[j+1,i+1] =
ds.Tables[0].Rows[j][i].ToString();
}
}

33

Nincs ms htra, mint meghvni az objektum Export nev metdust, mely elkszti a
paramterben megadott szempontok szerint az llomnyt.

xlsheet.Export(Application.StartupPath + "\\" + file,


OWC10.SheetExportActionEnum.ssExportActionOpenInExcel,SheetExportFormat.ssE
xportHTML);
A mvelet eredmnye HTML alap lesz, s megnylik, elindtva egy Excel alkalmazspldnyt.
A generlt llomnyt elhelyezhetjk egy webes alkalmazs pldul egy ASP.NET alkalmazs
mappjban, majd az URL-re hivatkozhatunk a kliens-oldali bngszben. Ekkor a munkalap
betltdik a felhasznli oldalon.

34

Intelligens cmkk tesztelse


Az Office XP alkalmazscsomag bizonyos elemeinl felhasznlhat Intelligens cmkk ksztsre korbbi szmainkban
lthattunk mr pldt. Jl tudjuk, hogy a cmkk ltal elvgzett feladatot kt rszre oszthatjuk: a keresett sz (vagy
szavak) felismersre, illetve a menbl kivlaszthat funkcik megvalstsra. A kt feladat kzl taln az elbbi a
kritikusabb, eddig azonban nem voltunk kpesek a hibakeressre. A Microsoft rendelkezsnkre bocst egy
segdprogramot, mellyel tesztelhetjk a cmke szkeres funkcijt, s megtallhatjuk a hibkat.

Segdprogram beszerzse
A Microsoft hivatalos oldaln rhet el a Smart Tag Enterprise Resource Kit programcsomag, mely
tbbek kzt tartalmazza a bemutatand segdprogramokat. A programcsomag a cikk rsakor a
kvetkez cmen volt elrhet, mely azonban azta megvltozhatott:

http://www.microsoft.com/downloads/details.aspx?FamilyId=91B8C50C-4F6B4360-9625-81B2899DA30F&displaylang=en.
A letlttt STERK.EXE nkicsomagol alkalmazst elindtva kapunk egy STERK.MSI
teleptprogramot, mely egy tetszleges mappban elhelyezi a csomag elemeit. A csomag
tartalmazza a szmtgpen tallhat cmkk tulajdonsgt feltr, valamint az egy adott cmkt
tesztel programokat, valamint ezek Visual Basic kdjt, s egy pldt.
Cikknk szempontjbl csak a kt program lnyeges. A telepts utn ltrejtt Developer Utilities
mappa Explorer mappjban talljuk meg a cmkket feltrkpez s tulajdonsgaikat feltr
SmartTagExplorer.exe alkalmazst. A Smart Tag szfelismer funkcionalitsnak tesztelsre a
RecognizerTester mappban tallhat RecognizeTester.exe alkalmazs szolgl.
SmartTagExplorer.exe alkalmazs

A program indulsakor az rlapon egy TabControl vezrlt tallunk, mely kt fllel rendelkezik. A
program nem nv szerint rendezi a cmkket, hanem megfelel osztlyaikat egy-egy csoportba
sorolja, s csak ezen bell kereshetnk a Smart Tag-ra.
A Recogziner DLL fl alatt kivlaszthatunk egy cmkt, s lthatjuk az rlap vezrliben az adott
cmke szfelismerst vgz osztlynak, pldnkban a RecognizeClass jellemzit.
Az Action DLL fl alatt kivlaszthatunk egy cmkt, s lthatjuk az rlap vezrliben az adott cmke
menbl elrhet funkcionalitst implementl osztlynak, pldnkban az ActionClass jellemzit.
A jellemzk, melyeket megtallhatunk az osztlyokkal kapcsolatban:

Cmke neve
Lersa
ProgID property rtke
SmartTagCount property rtke
Rendszerler adatbzis kulcs

Az Action DLL fl alatt megtallhatjuk mg a felismert sz fltt elrhet men pontjainak feliratt,
valamint a men fejlc-szvegt.

35

RecognizeTester.exe
alkalmazs
A mellkelt plda egy Intelligens
cmke,
mely
megkeresi
s
azonostja az ALFKI karakterlncot. A karakterlnc egy CustomerID azonost a MS SQL Server
Northwind adatbzisban, a Customers tblban.
A szfelismer mveletben elvgznk egy adatbzis-mveletet, melynek eredmnye lnyegtelen,
de elvgzsnek mvelete tesztelhet, hiba esetn az kiszrhet az alkalmazs segtsgvel.
Demonstrland a hibakeress lehetsgt, az adatbzis-mvelet elvgzse eltt szndkosan
nem nyitottuk meg a kapcsolatot. A tesztel alkalmazs ezt jelezni fogja szmunkra.

A tesztelshez indtsuk el a RecognizeTester.exe alkalmazst. Az rlap kt fle kzl az elsn kell


kivlasztanunk egy jellngyzet segtsgvel a tesztelend DLL-t. A panel bal feln szveges
segtsget is kapunk a kivlasztshoz s a tesztels lpseinek elvgzshez.
A kijells utn a msodik flre kell kattintani, ahol megadhatjuk a keresend szt (szavakat) a
szvegmezben.

Ezt kveten a Scan Text gomb megnyomsval elindthat a szfelismer mvelet.


A kdban ejtett hiba miatt azonban a mvelet sikertelen, errl egy hibazenetet kapunk, a hiba
oknak feltntetsvel.

36

A hiba kijavtsa utn ismt lefordtjuk a kdot, majd elkezdhetjk a tesztelst. A gomb
megnyomsa utn a tesztels sikeres, ennek eredmnyt az rlap als harmadban megtallhat
tblzatban vizsglhatjuk meg.
A kapott eredmnyrekordokban a kvetkez informcikat kaphatjuk meg:

A
A
A
A
A

cmke nevt
cmke nvternek nevt
pldaszvegben elfordul felismert szavak szmt
felismert szavakat
felismert szavak pozcijt, s a kijellend karakterek szmt (sz hossz).

Bepl modul
A programcsomag teleptse utn az Office csomag Word s Excel alkalmazsaiba bepl egy
modul az eszkztrba, melynek felirata SMART TAG HOST ASSISTANT. Ahogy a nevbl is kiderl,
a modul segtsgvel kezelhetjk a szmtgpen tallhat cmkket. A modul gombjra kattintva
feltrul egy men, melyben tbbek kzt megtallhatjuk azt a funkcit, mely megjelenti az
Eszkzk - Automatikus javtsi belltsok menpont ltal megjelentett rlap Intelligens cmkk
fle alatti dialgusablakot.
A kdot lefordtva le kell futtatnunk a mellkelt AddRegistry.reg llomnyt, hogy a Smart Tag
osztlyainak kulcsa (GUID) bekerljn a Rendszerler adatbzisba.

37

Web alkalmazs
elrse Office
Smart Tag-bl
A Microsoft Office XP programcsomag nagysiker
jdonsga az Intelligens cmkk (Smart Tag)
hasznlatnak lehetsge, melyek segtsgvel a
megadott szavak csoportjhoz melyeket a
felhasznl ber egy Word dokumentumba, vagy
Excel cellba -, specilis funkcik illeszthetk. j
Intelligens cmkk ltrehozsa trtnhet
programkddal is, azonban hasznlhatunk erre a
clra egy specilis felpts XML llomnyt is.
Cikknkben elksztnk egy ilyen XML llomnyt,
melyben meghatrozzuk, hogy milyen szavak
bersakor forduljon az alkalmazs az ltalunk megrt
Web alkalmazshoz.
Mellkelt plda megnyitsa eltt szksges egy
DataFromSmartTag nev virtulis knyvtr ltrehozsa,
mely a plda knyvtrra mutat. Ehhez nyissa meg a
mellkelt mappa Tulajdonsg ablakt s itt a
Webmegoszts
lapon
engedlyezze
a
mappa
megosztst olvassi s parancsfjlok futtatsi jogval.
A mellkelt plda hasznlathoz el kell vgeznnk
bizonyos belltsokat. Ehhez olvassa el a Kezdeti
belltsok cm fejezetet.

Kezdeti belltsok
A mellkelt plda mappjban elhelyeztnk
egy XML llomnyt, mely tartalmazza a
ltrejv Intelligens cmke kdjt. A
kiprbls eltt gondoskodnunk kell arrl, hogy a cmke lthat legyen a Microsoft Word s Excel
alkalmazsokban. Ehhez a mellkelt GetEmployeeDatas.xml llomnyt be kell msolnunk a
kvetkez mappba (meghajtknt a Microsoft Office XP alkalmazs-csomagot tartalmaz
meghajtt kell feltntetnnk): C:\Program Files\Common Files\Microsoft Shared\Smart Tag\Lists\.
Msodik lpsben el kell indtanunk a Microsoft Word XP alkalmazst, majd meg kell gyzdnnk
arrl, hogy az alkalmazsok lthatjk az llomnyban kdolt cmkt.
Ehhez vlasszuk a Word-ben az Eszkzk - Automatikus javtsi belltsok menpontjt, majd
vltsunk a megjelen ablakban az Intelligens cmkk nev lapra. Itt a Felismerk nev listban
bejelltknt kell megjelenjen az Intelligenscmke-listk(GetEmployeeDatas) listaelem.
A Web-alkalmazs WebForm1.aspx lapja betltve hibt jelez abban az esetben, ha nem a definilt
menbl indtott folyamat eredmnyekppen jutunk a Weblapra, mivel ekkor a lap nem kapja meg
a szksges paramtert. A Word alkalmazsban a kvetkez szavakra jelenik meg a men:

Davolio
Fuller
Leverling
Peacock
Buchanan
Suyama
King
Callahan
Dodsworth

A cmkt tartalmaz XML llomny felptse


Az Intelligens cmke megalkotsakor az llomnyban meghatroztunk nhny nevet, melyek az MS
SQL Server 2000 adatbzis-kezel Northwind adatbzisnak CUSTOMERS tbljban megtallhat
rekordok LastName oszlopban jelennek meg. Amikor a megadott nevek valamelyike kerl bersra
a Word dokumentumban, vagy az Excel munkafzet egy celljban, akkor a megjelen menbl
kivlaszthatv vlik egy elre ltrehozott menpont, melyhez funkcit rendeltnk. A funkcit
szintn az XML-ben kdoltuk le. A bert sz a paramtere lesz a mellkelt Web-alkalmazs
WebForm1.aspx lapjnak, mely megkapva a paramtert, kigyjti a nvhez tartoz tbbi adatot a
CUSTOMERS tblbl, majd egy DataGrid kontrolban megjelenti.
Az XML llomny els sorban megadjuk a nyittagot, mely meghatrozza, hogy milyen tpus
llomnykezelsre van szksg:

<FL:smarttaglist xmlns:FL="urn:schemas-microsoft-com:smarttags:list">
Megadjuk a cmkecsoport nevt:

<FL:name>GetEmployeeDatas</FL:name>

38

Megadhatunk opcionlisan egy lerst a csoporthoz. Az XML rtelmez sajtossga miatt itt csak
kezetmentes szveget adhatunk meg:

<FL:description>Employee data reporter</FL:description>


A <FL:smarttag></FL:smarttag> pr tbbszr is ismtldhet, gy menpontok sorozatt adhatjuk
a listhoz:

<FL:smarttag type="urn:schemas-microsoftcom:office:smarttags#getempdata">
A <FL:caption> elemhez megadott szveg jelenik meg a kis men fejlcmezjben:

<FL:caption>EMPLOYEE Data Reporter Tool</FL:caption>


Meg kell adnunk azoknak
a szavaknak a krt,
melyekre megjelenik a
felbukkan
men.
A
szavakat vesszvel kell
elvlasztanunk:

<FL:terms>
<FL:termlist>Davoli
o, Fuller,
Leverling, Peacock,
Buchanan,
Suyama,King,
Callahan,
Dodsworth</FL:terml
ist>
</FL:terms>
Vgl
gondoskodunk
arrl, hogy a megfelel
mvelet hajtdjon vgre
a
menpont
kivlasztsakor. Ezt a
<FL:actions>
listban
adjuk meg, itt is van
lehetsgnk
tbb
csoportot ltrehozni, almenket deklarlni:

<FL:actions>
<FL:action id="GetEmpData">
<FL:caption>Web Reporter</FL:caption>
<FL:url>http://localhost/DataFromSmartTag/WebForm1.aspx?ln={TEXT}</FL:url>
</FL:action>
</FL:actions>
</FL:smarttag>
</FL:smarttaglist>
Az <FL:action> elemen bell elhelyezett <FL:caption> bejegyzsben megadott szveg jelenik meg
a ltrehozott egy menpontunkban.
Felhasznls
Az XML llomnyt bemsolva az emltett mappba csak el kell indtanunk egy Word alkalmazst,
majd a dokumentum tetszleges helyn bernunk a megadott szavak valamelyikt.
A sz bersa utn csak a sz fl kell mozgatnunk a kurzort, majd a megjelen listbl
kivlasztani a WEB REPORTER menpontot. A menpont kivlasztsa utn a Web alkalmazs
kezdlapja megkapja a bert szt, mint paramtert, s betltdskor generlja az adathalmazzal
feltlttt tblzatot, az adatbzis adataibl.

39

Template
dokumentumok
cmzse
WebService
ltal
szolgltatott
adatokkal
WebService elrse Office alkalmazsokbl 1. rsz
Kt rszes cikksorozatunkban megismerkedhetnk annak lehetsgvel, hogy miknt teremthetnk kapcsolatot
Microsoft Word, vagy Excel alkalmazsainkbl egy Web szervizzel a SoapClient objektum segtsgvel. Bemutatjuk,
hogy az objektumot hogyan hasznlhatjuk fel egy makrban abbl a clbl, hogy meghvjuk a szerviz adatszolgltat
metdusait egy faxbort fejlcezshez.
Mellkelt plda megnyitsa eltt szksges egy OfficeService01 nev virtulis knyvtr ltrehozsa, mely a plda knyvtrra
mutat. Ehhez nyissa meg a mellkelt mappa Tulajdonsg ablakt s itt a Webmegoszts lapon engedlyezze a mappa
megosztst
olvassi
s
parancsfjlok
futtatsi
jogval.
A mellkelt plda hasznlathoz el kell vgeznnk bizonyos belltsokat. Ehhez olvassa el a Kezdeti belltsok cm fejezetet.

Kezdeti belltsok
A pldaalkalmazs mappjban elhelyezett ShowForm mappa tartalmazza annak a makrnak a
kdllomnyait, melybl a Web szerviz alkalmazsunkat elrhetjk, s metdusainak meghvsval
vgl kitlthetjk egy faxbort fejlcmezjt. A vgs cl elrse rdekben a kvetkez elzetes
belltsokra van szksgnk:
A faxbort egy gynevezett Spreadsheet Template llomny, mely alaprtelmezsben a kvetkez
mappban tallhat: C:\Program Files\Microsoft Office\Templates\1038, s az Elegant Fax.dot
nevet viseli.
Meg kell bizonyosodnunk arrl, hogy ez az llomny fl van-e teleptve az MS Office
alkalmazsunkhoz. Amennyiben nem, akkor az Office programcsomag teleptkszlett
felhasznlva fel kell azt telepteni.
Msodik lpsknt ltre kell hoznunk a makrt, melybl a mveleteket vezreljk. Ehhez indtsuk
el MS Word alkalmazsunkat, majd az Eszkzk menbl vlasszuk a Makr pontot, majd az
almenbl a Makrk almenpontot.
A felbukkan ablakban a Ltrehozs gombbal ltre kell hoznunk a makrnkat ShowForm nven. Ezt
kveten nyomjuk meg a Szerkeszts gombot, minek eredmnyeknt elrhetv vlik a beptett
Visual Basic Szerkeszt, mellyel megrhatjuk a makrnk rvidke kdjt.
A makr forrskdjt mellkeltk a ShowForm almappban, gy a begpels helyett elegend
importlnunk az llomnyokat a makr projektbe.
A szerkesztben, annak bal szegmensben tallhatunk egy csompontot NORMAL nven, mely
tartalmazza makrnk projektjt. A Forms alcsompontban mr tallunk egy UserForm1
objektumot, melyet ki kell trlnnk. Ehhez a File menben vlasszuk a Remove UserForm1
menpontot. Tegyk ugyanezt a Modules alcsompont Module1 objektumval is.
A mellkelt llomnyok (Module1.bas s UserForm1.frm) importlshoz vlasszuk a File menben
az Import File menpontot, majd keressk meg llomnyainkat a mappban.
A makrt elmentve az rgtn hasznlhat. Ehhez a Run menben ki kell vlasztanunk a Run Makro
pontot, vagy meg kell nyomnunk az F5 nyomgombot. Elindtva a makrt annak Form-jn
megadhatjuk a faxbortnkat tartalmaz llomny elrsi tvonalt, majd a listbl kivlaszthatunk
egy elemet. A LEKRDEZS gombbal indthat a mvelet.
Web szerviz felptse
A makrnk a Web-szervernkn fut szerviz alkalmazshoz fordul adatokrt. A szerviz kt
metdussal rendelkezik. Az els metdus (GetCustomerIDs) visszatrsi rtkknt egy
karakterlnc tmbt ad vissza, mely tartalmazza a Northwind adatbzis Customers tbljban
tallhat rekordok CustomerID oszloprtkeit, mely listt megjelentjk a makrnk Form-jn.

[WebMethod]
public string[] GetCustomerIDs()
{
...
}

40

A szerviz msik metdusval (GetParticulars) a Customers tbla egy rekordjnak elemeit kaphatjuk
vissza, paramterknt adva meg, hogy melyik azonostval rendelkez elem legyen az.

[WebMethod]
public string[] GetParticulars(string id)
{
...
}
Makr UserForm1 objektuma
A UserForm1 objektum kdjban kell megvalstanunk azt, hogy a szerviz els metdusa a Form
inicializcijakor vgrehajtdjon, s az azonostk bekerljenek a Form-ra helyezett ListBox
kontrolba.

Private Sub UserForm_Initialize()


Dim oSOAPClient As Object
Ltrehozzuk a SoapClient objektumot:

Set oSOAPClient = CreateObject("MSSOAP.SoapClient")


Megadjuk a szerviz alkalmazsunk URL-jt:

oSOAPClient.mssoapinit
"http://localhost/OfficeService01/Service1.asmx?wsdl", "Service1",
"Service1Soap"
Lekrdezzk egy karakterlnc-tmbbe az azonostkat:

Dim arrTemp() As String


arrTemp = oSOAPClient.GetCustomerIDs()
Majd a tmb elemeit egy ciklussal bedolgozzuk a ListBox kontrolba:

For i = 0 To UBound(arrTemp)
ListBox1.AddItem arrTemp(i)
Next
End Sub
Makr Module1 objektuma
A makrnk Module1 objektumban ltrehozunk egy metdust, mely paramterknt megkapja a
listbl kivlasztott azonostt, s ezt az azonostt tadja a szerviz metdusnak, mely az adott
rekord oszlopaiban megtallhat rtkekkel tr vissza.

Sub GenerateForm(sID As String)


...
A SoapClient objektumra itt is szksg van:

Set oSOAPClient = CreateObject("MSSOAP.SoapClient")


oSOAPClient.mssoapinit
"http://localhost/OfficeService01/Service1.asmx?wsdl", "Service1",
"Service1Soap"
A metdus eredmnye itt is egy tmbbe kerl:

arrTemp = oSOAPClient.GetParticulars(sID)
Az Elegant Fax bort generlshoz ltre kell hoznunk egy Word objektumot:

Dim oDoc As Word.Document


A Form TextBox kontroljban meg kell adni ennek a Template objektumnak a fizikai elrsi
tvonalt. Ezt a karakterlncot adjuk t a Word objektumnak:

Set oDoc = Application.Documents.Add(UserForm1.TextBox1.Text)


A dokumentum fejlcben megjelentjk a tmb elemeit:

oDoc.Bookmarks("Company").Range.Text = arrTemp(1) + vbCrLf + arrTemp(2) +


", " + arrTemp(3) + vbCrLf + arrTemp(4) + vbCrLf + arrTemp(5) + ", " +
arrTemp(6) + vbCrLf + arrTemp(7)
Exit Sub
A metdust a Form felletn elhelyezett gomb lenyomsakor hvjuk meg a ListBox kontrolban
kivlasztott elemmel a paramterben:

GenerateForm ListBox1.List(ListBox1.ListIndex)
A feladat jl pldzza azt a Microsoft cg ltal preferlt trekvst, melynek eredmnyekppen az
alkalmazsok egyttmkdhetnek egymssal, mely hozzsegti a fejlesztket ahhoz, hogy igazn
knyelmes, s intelligens alkalmazsokat ptsenek.

41

42

Az j Microsoft.Data.Odbc nvtr
Adatelrst segt j nvterek 2. rsz
Cikksorozatunk els rszben a Microsoft j, az Oracle rendszereket hasznl alkalmazsok fejlesztst elsegt
OracleClient nvternek elemeivel ismerkedhettnk meg. Mai cikknkben bemutatjuk a Microsoft.Data.Odbc nvtr
elemeit, melyekkel knyelmesen, az eddig megszokott szignatrval rendelkez metdusgyjtemnnyel kezelhetnk
tetszleges adatbzisokat ODBC-csatoln keresztl.

ttekints
A Microsoft ltal elksztett nvtr a Microsoft.Data.Odbc nevet viseli, s cikknk rsakor a
kvetkez
Webcmen
volt
elrhet,
mely
termszetesen
megvltozhatott:
http://msdn.microsoft.com/downloads/default.asp?URL=/code/sample.asp?url=/MSDNFILES/027/001/668/msdncompositedoc.xml.
Letltve az llomnyt (Odbc_net.msi) teleptennk kell a .NET Framework al. Az ntelept
llomny errl gondoskodik, a hasznlhat .DLL llomny (Microsoft.Data.Odbc.dll), s a
kapcsold dokumentci alaprtelmezsben a kvetkez mappba kerl: %winroot%:\Program
Files\Microsoft.NET\Odbc.Net\.
A teleptett assembly bekerl a globlis assembly-listba, gy amikor referenciaknt megadjuk
alkalmazsainkban, akkor a globlis palettrl kell kivlasztanunk, nem pedig valamilyen alternatv
mappbl.
A mellkelt dokumentci tartalmazza a teleptsre, valamint a hasznlatba vtelre vonatkoz
instrukcikat, illetve tartalmaz egy az MSDN felptsvel megegyez szerkezet referencit is
a nvtrben megtallhat osztlyokrl, ezek metdusairl, property-jeirl s nhny pldt.
A teleptssel kapcsolatban meg kell emlteni, hogy rendelkeznnk kell teleptett .NET Frameworkkel a szmtgpen, s ajnlatos rendelkeznnk a Microsoft Data Access Components (MDAC) 2.7es verzijval is.
Az adott adatbzissal igen egyszeren kapcsolat teremthet. Nem kell mst tenni, mint helyesen
megadni a kapcsolat felptsre hivatott OdbcConnection osztly ConnectionString property-jt,
majd megnyitni a kapcsolatot, hasonlan ahhoz, ahogy a System.Data.SqlClient nvtr
SqlConnection osztlynak esetben tesszk. Lssunk nhny pldt a lehetsges rtkekre
klnbz adatforrsok esetn. Az els egy Oracle adatforrshoz kapcsoldik:

Driver={Microsoft ODBC for


Oracle};Server=ORACLE8i7;UID=odbcuser;PWD=odbc$5xr
A msodik egy Microsoft Access llomnyhoz:

Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\bin\nwind.mdb


A harmadik egy Microsoft Excel llomnyhoz:

Driver={Microsoft Excel Driver (*.xls)};DBQ=c:\bin\book1.xls


Az j nvtrben egysgestettk a hibakezelst is. Az adatbzis elrsekor bekvetkez hiba esetn
egy OdbcException tpus kivtel generldik.
Gyakorlati felhasznls
A mellkelt alkalmazsban egy Microsoft Access llomnyban tallhat adatforrssal ltestnk
kapcsolatot ODBC-csatoln keresztl, valamint bemutatjuk, hogy a nvtr osztlyaival hogyan
szrhatunk be rekordokat az adatforrs Products nev tbljba. A db.mdb Access-llomnyt az
alkalmazs mappjban helyeztk el.
Miutn referenciaknt alkalmazsunkhoz csatoltuk a megfelel assembly-t, gondoskodnunk kell
arrl, hogy ezt el is rjk:

...
using Microsoft.Data.Odbc;
Deklarlnunk kell azokat az objektumokat melyekkel a kapcsolat felpthet, valamint a DML
utasts futtathat. Ehhez szksg van egy adatbzis-kapcsolat objektumra:

private OdbcConnection connect = new OdbcConnection("Driver={Microsoft


Access Driver (*.mdb)};DBQ=" + Application.StartupPath + "\\db.mdb");
Egy adapter objektumra, mellyel a mr ismert mdon feltlthet a logikai adattbla:

private OdbcDataAdapter ad;


s egy, a rekordok beszrst vgz SQL-utastst futtat OdbcCommand objektumra:

private OdbcCommand Command = new OdbcCommand();


A program indulsakor, illetve egy-egy rekord beszrsa utn frisstennk kell a DataTable
objektum tartalmt, hogy a Form DataGrid kontroljban mindig az aktulis tblatartalom legyen
lthat. Ennek rdekben a mveletet egy sajt metdusba gyaztuk (Fill), melyben elszr
pldnyostjuk az adapter objektumot a megfelel lekrdez utastssal:

ad = new OdbcDataAdapter("SELECT * FROM PRODUCTS",connect);


...
Majd a .NET beptett osztlyaibl mr ismert mdon, az objektum Fill metdusval feltltjk az
adott tblt:

ad.Fill(dt);

43

Miutn megadtuk a szerkesztmezben a rgztend rtket, s sszelltottuk az adott objektum


CommandText property-jnek tadand karakterlncot, csak meg kell nyitnunk a kapcsolatot, s
meg kell hvnunk az OdbcCommand osztly ExecuteNonQuery metdust, mely elvgzi a rekord
beszrst:

Connect.Open();
Command.ExecuteNonQuery();
connect.Close();

44

COM
komponensek
elrse a
HttpServerUtilit
y osztllyal
A fejlesztk szmra bizonyra ismeretes, hogy
miknt lehet adatok tblzatos s grafikus
megjelentsre ignybe venni olyan alkalmazsokat, mint a Microsoft Excel. Ebben a cikkben annak jrunk utna,
hogyan ltesthetnk kapcsolatot Web-oldalunkrl az Excel alkalmazssal.
Ahhoz, hogy az Excel elrhet legyen, itt is szksges egy referencit hozzadni projektnkhz. Vlasszuk teht a Project - Add
reference menpontot, majd a COM lapon keressk el a Microsoft Excel 10.0 Object Library-t. A verziszm az ppen teleptett
Excel
verziszmtl
fggen
vltozhat.
Az
Excel
APS.NET-es
alkalmazsbl
trtn
elrshez
mdostsuk
az
alaprtelmezsben
a
%winntroot%:\WINDOWS\Microsoft.NET\Framework\%version%\CONFIG knyvtrban lv machine.config llomnyban a
processModel bejegyzsnl a userName attribtumot system rtkre, majd indtsuk jra a gpet.

<processModel ... userName=system>


...
Nagyon sok munktl kmli meg a fejlesztket, hogy a Microsoft lehetv tette, hogy bizonyos
ktttsgek mellett, ignybe vegyk az elksztett alkalmazsainak funkcionalitst. Ebbe a
kategriba tartozik a Microsoft Excel alkalmazs is, melyet tbbflekppen elrhetnk. A
kapcsolat felptst a .NET Framework futtatrendszer teszi lehetv szmunkra, a kvetkez
alapelvekkel:
A .NET Framework klnbsget tesz menedzselt s nem menedzselt kd kztt, attl fggen,
hogy az adott kd a CLR-futtatrendszer felgyelete alatt mkdik, elrve a CLR nyjtotta
szolgltatsokat (pldul szemtgyjts, vdett erforrsokhoz val hozzfrs-szablyozs), vagy
nem. A COM komponensek, az ActiveX interfszek s a Windows API fggvnyek a nem
menedzselt kategriba tartoznak.
A COM komponensek az interfsz alap kdok kategrijba tartoznak, azonban anlkl rhetjk el
funkciikat, hogy ezeket az interfszeket implementlnnk alkalmazsunkban, vagyis a COM
komponensek tpusknyvtraiban elhelyezett tpusinformcikhoz gynevezett metaadatokon
keresztl frhetnk hozz. Ezekre a futtatrendszernek van szksge.
A COM komponensekkel val kapcsolatot a .NET COM Interop szolgltatsa teszi lehetv, mely
implicit mdon ltrehoz egy osztly interfszt a nyilvnos metdusok, property-k, mezk s
esemnyek elrshez. Pldul az Application osztlyhoz egy _Application interfszt.
COM komponensekre val hivatkozskor a komponenshez ltrejn egy assembly, mely bekerl a
hv alkalmazs manifeszt-jbe.
A .NET Framework rendelkezsre bocst egy osztlyt HttpServerUtility nven, mely lehetv teszi,
hogy egy object tpussal hivatkozzunk a COM komponens megfelel osztlyaira.

C r e a t e Ob j ec t
Osztly: HttpServerUtility
public object CreateObject(
string progID
);
Lehetv teszi, hogy az adott COM komponensbl egy szerveroldali pldnyt hozzunk ltre a
komponens program-azonostjnak felhasznlsval.
Paramterek

string progID

A program-azonostt tartalmaz karakterlnc.


Visszatrsi rtk
Egy objektum, mellyel hasznlhatk az adott komponens-osztly metdusai explicit
tpusknyszerts felhasznlsval. Amennyiben nem sikerl valamilyen ok miatt ltrehozni az
objektumot, vagyis pldnyostani a komponens-osztlyt, egy HttpException kivtel keletkezik.
Vizsgljuk meg, hogyan trtnik ez alkalmazsunkban. A feladat az, hogy a karakteres formban
megadott matematikai mvelet kiszmtshoz a Microsoft Excel alkalmazst hasznljuk fel, az
Excel alkalmazs COM komponensekben megvalstott lehetsgeivel.
Az Excel alkalmazs osztlyaihoz ltrehozunk hrom objektumot:

private object ea;


private object ewb;
private object er;

45

Az oldal tltdsekor ltrehozzuk a komponens-osztlyok szerveroldali pldnyait:

ea = Server.CreateObject("Excel.Application");
ewb = (Excel.Workbook)((Excel.Application)ea).Workbooks.Add(m);
er = (Excel.Range)((Excel.Application)ea).Cells[1, 1];
Az alkalmazsban egy Execute nev fggvny vgzi el a mveletet, vagyis vgezteti el a mveletet
az Excel alkalmazssal. A fggvny karakterlncot vr paramterknt, mely a mveletet
reprezentlja, valamint egy double rtket ad vissza eredmnyknt:

public double Execute(string s)


{
((Excel.Range)er).FormulaArray = "="+s;
double result = Convert.ToDouble(((Excel.Range)er).Value2);
((Excel.Workbook)ewb).Close(false, m, m);
((Excel.Application)ea).Quit();
return result;
}
Az ASP.NET lapon egy-egy Label fogja megjelenteni az eredmnyeket a kvetkezk szerint a
megfelel gomb lenyomsra:

...
eLabel1.Text = Execute(tb1.Text).ToString();
...

46

Word kiegsztse sajt alkalmazssal


(Add-in)
A Visual Studio.NET-et hasznlva lehetsgnk nylik arra, hogy knnyedn kiegsztsk az MS Office alkalmazsait, a
Word, Excel, Outlook, PowerPoint, Access, FrontPage, Project s a Visio programokat sajt alkalmazsunkkal. Ezen
fell mg akr a Visual Studio.NET is kiegszthet magunk ksztette programmal. Ezek a kiegsztsek teljesen
beplnek az emltett programokba, mintha azok gyrilag mindig is bennk lettek volna. Mivel azonban sajt
alkalmazsunk fut a httrben, gy kiegsztsnk brmit megtehet: pldul sajt adatbzisunk elrheti s onnan
kzvetlenl szolgltathat adatokat a szmunkra megfelel formtumban rgtn a Word dokumentumba rva. Az
alkalmazsi terletnek csak fantzink, illetve az adott feladat szabhat hatrt.

Megoldsknt egy specilis projektet kell ltrehoznunk, mely tartalmazza annak a programunknak
az alapjait, amely kpes lesz beplni ms alkalmazsba.
Ehhez vlasszuk a File - New - Project menpontot, majd a megjelen ablakban az Other Projects Extensibility Projects elemnl a Shared Add-in ttelt jelljk ki.
Ekkor elindul egy varzsl, melynl megadhatjuk az alapvet belltsokat a projektnkhz. Az els
ablaknl vlaszthatjuk ki, hogy milyen nyelven szeretnnk rni a forrskdot, itt adjuk meg a
Create an Add-in using Visual C#-ot.

47

A kvetkez lapon azt jellhetjk meg, hogy mely alkalmazsokhoz szeretnnk, ha modulunk
kpes lenne beplni. Itt vlasszuk most csak a Microsoft Word elemet.
Tovbb lpve adhatunk nevet a bepl modulunknak, valamint egy rvid lerst rla. Ezt kveten
lltsuk be az I would like my Add-in to load when the host application loads. jellngyzetet,
mellyel azt rjk el, hogy bepl modulunk azonnal aktv lesz, amint az adott alkalmazs - jelen
esetben a Word - elindul. Ezt a lpst kihagyva kln lpsben kellene aktivizlnunk a modult.
A varzsl ezt kveten ltrehoz kt projektet. Az egyik lesz a bepl modulunk, a msik pedig
egy telept alkalmazs. Ha megrtuk a szksges programunkat, akkor knnyen elkszthetjk
belle a telept modult, melyet mr vihetnk is a kliens gpre.
Elszr azonban lssuk mi is kell a programunkba.
Mivel a Word-t szeretnnk kezelni, gy biztos szksges lesz egy referencia hozzadsa a
projekthez a Word-rl. Vlasszuk teht a Project - Add Reference menpontot, majd COM lapon a
Microsoft Word elemet keressk el.
A megvalstand feladat a kvetkez legyen: hozzon ltre a modulunk egy j nyomgombot a
Word Standard palettjn Software Online felirattal. Ha a felhasznl e gombra kattint, akkor az
aktulis Word dokumentum, aktulis kurzor pozcijba kerljn beszrsra az aktulis dtum s
idpont.
A megvalstshoz a kvetkez lpseket kell tennnk az OnStartupComplete fggvnynl, mely
akkor kerl meghvsra, amikor a Word mr elindult s a modulunk betltse utn mr ltrejtt a
kapcsolat a kt alkalmazs kztt.

public void OnStartupComplete(ref System.Array custom)


{
A Word alkalmazs elrshez szksgnk lesz egy Word Application osztlyra. Egy ilyen
objektumot mr kapott a modulunk az OnConnect fggvny hvsakor, ahol ezt eltrolta az
applicationObject vltozba. Mivel ez object tpus, mert nem csak Word, hanem brmi ms is,
pldul Outlook is lehetne, gy r kell definilnunk a Word.Application osztlyt.

wa = (Word.Application)applicationObject;
A nyomgomb ltrehozsa lesz a kvetkez feladat. Ehhez el kell rnnk azt a kollekcit, melyben
az egyes palettk tallhatk. Minden palettn tetszleges szm gomb tallhat, helyezhet el. Mi
most a Standard-ot vlasszuk sajt gombunk elhelyezsre. A palettkat a CommandBars osztly
kezeli, mg egy konkrt palettt a CommandBar osztlyon keresztl rhetnk el.

string caption = "Software Online";


CommandBars cbs;
CommandBar cb;
Els lpsknt lekrdezzk a Word alkalmazs CommandBars objektumt.

cbs =
(CommandBars)applicationObject.GetType().InvokeMember("CommandBars",
BindingFlags.GetProperty , null, applicationObject ,null);
Ezt kveten kivlasztjuk a Standard palettt.

48

cb = cbs["Standard"];
Megprbljuk elrni ezen a palettn a Software Online felirattal rendelkez gombot, ha mg nincs
ilyen, akkor hiba keletkezik s a catch rszben fut tovbb alkalmazsunk.

try
{
cbc = (CommandBarButton)cb.Controls[caption];
}
Ez esetben ha mg nincs meg a gomb, akkor ltrehozzuk azt. Ehhez a paletta Controls propertyjnek Add fggvnyt hvjuk, majd a ltrejtt objektumnak megadjuk gombunk feliratt s a
stlust nyomgomb stlusra vlasszuk.

catch(Exception)
{
cbc = (CommandBarButton)cb.Controls.Add(1, m, m, m, m);
cbc.Caption = caption;
cbc.Style = MsoButtonStyle.msoButtonCaption;
}
Ezen a ponton a cbc vltoz mr biztos, hogy tartalmazza a nyomgombunkat, akr most hoztuk
ltre, akr mr ltezett. Itt a lthatsgt igazra lltjuk s hozzrendelnk egy esemnykezelt a
Click esemnyhez, hogy a gombon trtn kattintst a programunk kezelni tudja.

cbc.Visible = true;
cbc.Click += new
_CommandBarButtonEvents_ClickEventHandler(Button_Click);
}
Ezzel a gomb adott, ha most rkattint a felhasznl, akkor a Button_Click nev fggvnynk kerl
meghvsra. Itt nincs ms dolgunk, mint az aktulis dokumentumba begpelni a dtumot s
idpontot, majd egy enter-t tni s ezzel a feladatot teljestettk is.

private void Button_Click(CommandBarButton cmdBarbutton,ref bool


cancel)
{
wa.Selection.TypeText(DateTime.Now.ToString());
wa.Selection.TypeParagraph();
}

Most az alkalmazsunk kszen is van, fordtsa eltt viszont tegynk mg egy belltst: vlasszuk
a Solution Explorer-ben a projektnket, majd jobb gombbal kattintsunk s vlasszuk Properties
menpontot. A megjelen ablakban a Configuration Properties - Build elemnl a Register for COM
interop opcit lltsuk igazra.

49

Ezzel azt rjk el, hogy a ksztett DLL a fordtskor automatikusan regisztrlva lesz a Windows
regisztrcis adatbzisban.
Most fordtsuk le a programunkat s ksztsk el a telept csomagot, majd futtassuk azt. A telept
futsa utn jelentkezznk ki a rendszerbl s jra be, majd ha ezt kveten indtjuk a Word-t,
akkor a standard palettjn mr ott kell lennie az j nyomgombnak is.
Gond esetn ellenrizzk, hogy a telept belltotta-e a Windows regisztrcis adatbzisba az
albbi kulcsot s rtket:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Word\Addins\MSWordAddin.Connec
t
LoadBehavior 3

50

Grafikon kszts web lapra


Ha web oldalainkon szksgnk lenne grafikon megjelentsre, akkor kt dolgot tehetnk: vagy leprogramozzuk
magunk a grafikonkszts, megjelents problmjt, vagy megkrjk az Excel-t, hogy ugyan ksztse mr el
szmunkra a szksges grafikont, legyen az brmilyen tpus (kr, oszlop, stb.), vagy akr 3D-s megjelens. Nos
egyszerbb az utbbit vlasztani, gy megsproljuk azt a hatalmas munkt, mely ahhoz kellene, hogy sajt
programunk kpes legyen olyan grafikonok ltrehozsra, mint az Excel. Kapunk teht az Excel-tl egy grafikont,
melyet aztn kpknt megjelenthetnk web oldalunkon. Mivel az Excel-nek mi adjuk meg az adatokat programbl, gy
brmilyen adatbl, brmilyen grafikont kszttethetnk.
Az
Excel
APS.NET-es
alkalmazsbl
trtn
elrshez
mdostsuk
az
alaprtelmezsben
a
C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\CONFIG knyvtrban lv machine.config llomnyban a processModel
bejegyzsnl a userName attribtumot system rtkre, majd indtsuk jra a gpet.

<processModel
...
userName="system"
...
A mellkelt WebForm1.aspx csak egy kpet ad vissza, mely tartalmazza a grafikont. Ha teht egy
web oldalba, vagy egy msik ASP.NET-es alkalmazs web lapjra szeretnnk beilleszteni ezt a
kpet, akkor a mellkelt _teszt.htm-ben lthat mdon tegyk ezt meg:

<img src="http://localhost/WebChart/WebForm1.aspx">
Termszetesen a WebForm1.aspx elrst vltoztassuk meg az adott krnyezettl fggen.
Trjnk most t a megvalsts lpseire.
Az Excel elrshez ltrehozunk egy Excel alkalmazst a httrben, melyben nyitunk egy j
munkafzetet.

Excel.Application ea = new Excel.Application();


ea.Visible = false;
Excel.Workbook ew = ea.Workbooks.Add(m);
Ennek els munkalapjra ksztnk egy tblzatot, mely tartalmazza azokat az adatokat, amibl
grafikon kszl. Az egyszersg kedvrt most csupn egy ketts ciklus ltal feltlttt tblzatot
hasznlunk, de az adatforrs termszetesen tetszleges lehet.

Excel.Worksheet ws = (Excel.Worksheet)ea.Worksheets[1];
for (int l=1; l<=3; l++)
{
for (int i=1; i<=6; i++)
{
ws.Cells[i, l] = i*l*12;
}
}
A tblzat begpelse utn kijelljk azt.

ws.get_Range("A1", "C6").Select();
Ezt kveten ltrehozunk egy grafikont, melynek megadjuk tpust, amit most xl3DColumn-ra
vlasztottunk.

Excel.Chart c = (Excel.Chart)ew.Charts.Add(m, m, m, m);


c.ChartType = Excel.XlChartType.xl3DColumn;
Kvetkez lpsben a mr elkszlt grafikon kpt a vglapra msoljuk s bezrjuk a
munkafzetet, majd az Excel-t is gy, hogy ne trtnjen ments.

c.CopyPicture(Excel.XlPictureAppearance.xlScreen,
Excel.XlCopyPictureFormat.xlBitmap, Excel.XlPictureAppearance.xlScreen);
ew.Close(false, m, m);
ea.Quit();
Adott teht a vglapon egy kp, mely azt a grafikont tartalmazza, amit a web oldalon meg
szeretnnk jelenteni. Ehhez nincs ms dolgunk, mint a vglapon lv kpet egy Bitmap osztlyba
msolni.

IDataObject ido = Clipboard.GetDataObject();


if (ido.GetDataPresent(DataFormats.Bitmap))
{
Bitmap bmp = (Bitmap)ido.GetData(DataFormats.Bitmap);
Az alkalmazsunk ltal visszaadott adathalmaz most nem egy szveges HTML kd lesz, hanem egy
kp, mely radsul GIF tpus lesz. Ezrt a formtumot image/gif tpusra lltjuk.

Response.ContentType = "image/gif";
Vgs lpsknt pedig mentjk a Bitmap-en trolt kpet a webes krst kiszolgl adatfolyamba.

bmp.Save(Response.OutputStream, ImageFormat.Gif);
}
Ezzel a krst kld kap egy GIF tpus kpet, melyen az Excel ltal ltrehozott grafikon lesz
lthat.

51

Szvegesen megadott kplet kiszmtsa


programbl
Mennyi 10+20? s mennyi id erre programbl vlaszolni? De gy, hogy nem szmknt van megadva a kt rtk s az
elvgzend mvelet, hanem sztringknt: 10+20. s mennyi az rtke ennek a kifejezsnek: sin(0,05)*30(cos(0,43)/pi())? Ha valaki nagyon rr, biztos szvesen r algoritmust arra, hogy ilyen sztringeket kpes legyen az
alkalmazsa kirtkelni s az eredmnyt kzlni a felhasznlval. Ha valaki azonban nem r r, akkor mutatunk egy
nyolc soros fggvnyt, mely kpes brmilyen bonyolultsg sztringknt megadott kpletet megoldani s az eredmnyt
visszaadni.

A megolds ismt igen egyszer, st szinte teljesen kzenfekv: sztringknt megadott kpletek
kirtkelsre hasznlja fel alkalmazsunk a httrben futtatva az Excel-t. gy a felhasznl szre
sem veszi, hogy nem csak a mi programunk fut s az Excel-nek elg bonyolult szvegesen
megadott kpleteket tadhatunk, hogy rtkelje ki azokat. Ennek leprogramozsval gy nincs
dolgunk. Megoldanunk csak azt kell, hogy elrjk az Excel-t s megkrjk a feladatunk
elvgzsre.
Az egszhez ksztsnk egy komponenst, gy a jvben igen egyszeren felhasznlhatv vlik egy
ilyen kirtkels. A komponensnkben egyetlen fggvnyt hozunk ltre, melynek paramterknt
kell megadnunk a kpletet, melynek meg kell tudni az eredmnyt. A fggvny visszatrsi rtke
egy double tpus szm lesz, mely kplet eredmnye.
Az Excel elrshez ne felejtsnk el egy referencit hozzadni a projektnkhz az Excel-rl.
A fggvnyben ltrehozunk egy kapcsolatot az Excel-el s mivel nem lltjuk a Visible property-jt
igazra, gy a felhasznl ebbl semmit sem vesz szre.

public double Execute(string s)


{
Excel.Application ea = new Excel.Application();
Ezt kveten ltrehozunk egy j munkafzetet s ennek egy celljt kitesszk egy Range
objektumba, hogy a tovbbiakban knnyebben elrhessk.

Excel.Workbook ew = ea.Workbooks.Add(m);
Excel.Range er = (Excel.Range)ea.Cells[1, 1];
Most ebbe a cellba rjuk a kpletet, mely el egy egyenlsgjelet illesztnk, hiszen az Excel csak
ez esetben hajland azt kpletknt rtelmezni s az eredmnyt kiszmolni.

er.FormulaArray = "="+s;
Miutn bertuk a kpletet mris kiolvashatjuk annak az eredmnyt.

double result = Convert.ToDouble(er.Value2);


Vgl nem maradt ms dolgunk, mint zrni a megnyitott munkafzetet ments nlkl, majd
bezrni az Excel-t s visszaadni a kapott rtket.

ew.Close(false, m, m);
ea.Quit();
return result;
}
A komponens hasznlatval mr csak az Execute fggvny hvsa marad htra ahhoz, hogy egy
tetszleges, de csak az Excel ltal elfogadott kpletet megadjunk s kiszmoltassuk az
eredmnyt.

private void button1_Click(object sender, System.EventArgs e)


{
label1.Text = functionComponent1.Execute(textBox1.Text).ToString();
}

52

Intelligens cmkk (SmartTag) ksztse


Office alkalmazsokhoz
Ha brmely Office alkalmazsba (Word, Excel, stb.) a felhasznl szveget gpel, akkor
lehetsgnk van arra, hogy bizonyos ltalunk kivlasztott szavakhoz egyedi funkcit rendeljnk.
Ez gy nz ki, hogy ha az alkalmazsunk rzkeli a bert szt, akkor ezt jelzi az adott Office
alkalmazsnak, mely egy pontozott vonallal alhzza a szt. Ha ezek utn a felhasznl az egrrel
e sz fl ll, akkor lehetsge van egy gyors men megjelentsre, melynek menpontjait s a
hozz tartoz tetszleges funkciikat a mi alkalmazsunk szolgltathatja.
E cikkben annak jrunk utna, hogy miknt kszthetnk SmartTag-et a Visual Studio.NET-tel.
A
mellkelt
plda
hasznlathoz
tegye
a
kvetkezket:
Fordtsa
le
a
mellklet
pldt.
Kattintson a mellkelt Registry.reg llomnyra s vgezze el a tartalmnak berst a regisztrcis adatbzisba.
Indtson el egy Word-ot s gpelje be a szoftver szt.

A megvalstand feladat a kvetkez legyen: ksztsnk egy olyan SmartTag-et, mely figyeli,
hogy a Word dokumentumaiba begpelsre kerl-e a szoftver sz. Ha igen, akkor ehhez kt
menpontot hoz ltre. Az els segtsgvel megvltoztathatjuk a bert sz stlust, mg a
msodikat vlasztva kicserlhetjk ezt a szt egy msik szvegre.

A megoldshoz egy DLL-t kell ksztennk, gy az j projekt ltrehozsakor vlasszuk a Class


Library projekt tpust. Mivel ezt COM DLL-knt szeretnnk zemeltetni, gy a megfelel
regisztrcihoz vlasszuk ki a Solution Explorer-ben a SmartTagTest nev projektnket, majd jobb
gomb s Properties menpont. A megjelen ablakban vlasszuk a Configuration Properties - Build
elemet. Ekkor elrhetv vlik a Register for COM interop tulajdonsg, melyet lltsunk igazra.
Ezek utn vlasszuk a Project - Add reference menpontot. A megjelen ablakban a COM lapon
keressk el a Microsoft SmartTags 1.0 Type Library elemet s adjuk hozz projektnkhz ezt a
referencit. A SmartTag csak az Office XP verzitl felfele rhet el, gy ennl rgebbi Office esetn
ez a lehetsg nem ll rendelkezsnkre.
A Microsoft SmartTags 1.0 Type Library-ban van kt olyan interfsz, melyet implementlnunk kell
az alkalmazsunkba, annak rdekben, hogy a kvnt funkcikat megvalsthassuk.
Az egyik interfsz az ISmartTagRecognizer, a msik az ISmartTagAction lesz.
ISmartTagRecognizer interfsz felhasznlsa
Az ISmartTagRecognizer interfsz abban jtszik szerepet, hogy a begpelt szavakat azonosthassuk
s rtesthessk az adott Office alkalmazst az esetleges tallatrl.

53

A ksbbi regisztrcihoz szksgnk lesz egy az osztlyhoz rendelt GUID azonostra, gy krjnk
egy jat a Tools - Create GUID menpont kivlasztsakor, majd msoljuk be a kapott rtket a
Guid attribtumba.

[Guid("F84853C0-679A-4465-A167-737E93C812CF"), ComVisible(true)]
public class Class1: ISmartTagRecognizer
{
Alkalmazsunkban tbb SmartTag funkcit is megvalsthatunk, de plda egyszersgnek
kedvrt most csupn egyet ksztnk, melynek kell adnunk egy bels nevet. Ez a nv kerl a
smartTagName bels vltoznkba.

private string smartTagName="softwareonline#smarttag";


Az ISmartTagRecognizer interfsz felhasznlsakor tbb property-t s fggvnyt is fel kell
hasznlnunk, melyek segtsgvel a felismersi feladat elvgezhet.
Ilyen pldul a ProgId property, melyben egy a programunkat azonost sztringet kell
visszaadnunk. Ez a sztring kerl majd a DLL regisztrcijakor a Windows regisztrcis
adatbzisba.

public string ProgId


{
get
{
return "Animare.FirstSmartTagRecognizer";
}
}
A SmartTagCount property-n keresztl adhatjuk meg, hogy alkalmazsunk hny SmartTag-et
kpvisel.

public int SmartTagCount


{
get
{
return 1;
}
}
A get_Name fggvny egy olyan sztringet vr, mellyel az Office felhasznlja is tallkozik majd.
Ezzel a nvvel fog szembekerlni, amikor a SmartTag funkcit - melyet alkalmazsunk kpvisel engedlyez, letilt. A fggvny paramtereknt kapunk egy LocaleId nev int tpus rtket. Ebbl
megtudhatjuk, hogy milyen nyelvterleten fut az alkalmazsunk, gy ennek megfelelen tbb
nyelv programot is kszthetnk.

public string get_Name(int LocaleId)


{
return "Software Online SmartTag teszt";
}
A get_Desc fggvnyben egy tetszleges szveget adhatunk meg, melyben lerhatjuk, hogy mire is
kpes az alkalmazsunk. Itt szintn lehetsgnk van tbb nyelv program ksztsekor
figyelembe venni, hogy melyik nyelvterleten kerl alkalmazsra programunk.

public string get_Desc(int LocaleId)


{
return "SmartTag tesztalkalmazs";
}
Megadhatunk egy url cmet is a get_SmartTagDownloadURL fggvny visszatrsi rtkben.
Paramterknt kapunk egy SmartTagID azonost szmot, melyre csak akkor lenne szksgnk, ha
a DLL-nkben tbb, klnll SmartTag-et valstannk meg.

public string get_SmartTagDownloadURL(int SmartTagID)


{
return "http://www.SoftwareOnline.hu";
}
Minden SmartTag funkcit el kell ltnunk egy belsleg hasznlt nvvel. Ezt a get_SmartTagName
fggvnynl tehetjk meg. Itt szintn kapunk egy SmartTagID azonost szmot, melyre csak
akkor lenne szksgnk, ha a DLL-nkben tbb, klnll SmartTag-et valstannk meg.

public string get_SmartTagName(int SmartTagID)


{
if (SmartTagID==1)
{
return smartTagName;
}
else
{

54

return "";
}
}
Az ISmartTagRecognizer leglnyegesebb fggvnye a Recognize. Ez kerl meghvsra akkor, ha
vltozik a szveg s ezen bell azonostanunk kell a SmartTag ltal kezelend szavakat. Az
ellenrizend szveget a Text paramterben kapjuk. Ha ebben a szvegben megtalljuk azt a szt,
esetleg
szavakat
melyet
keresnk,
akkor
ezt
a
szintn
paramterknt
kapott
ISmartTagRecognizerSite interfsz CommitSmartTag nev fggvnynek meghvsval jeleznnk
kell. Itt els paramterknt a SmartTag nevt kell megadni, melyet az adott szhoz rendelnk.
Msodik paramterben azt tudatjuk, hogy a Text-en bell melyik az a pozci, ahonnan a felismert
szavunk kezddik. (A karakterek szmozsa egytl indul!) A harmadik paramterben kell
megadnunk, hogy a felismert szavunk hny karakter hossz. A msodik s harmadik paramter
alapjn fogja az adott Office alkalmazs az ltalunk felismert szt pontozott vonallal alhzni.

public void Recognize(string Text, SmartTagLib.IF_TYPE DataType, int


LocaleID, SmartTagLib.ISmartTagRecognizerSite RecognizerSite)
{
int i=Text.ToLower().IndexOf("szoftver");
if (i>=0)
{
RecognizerSite.CommitSmartTag(smartTagName, i+1, 8,
RecognizerSite.GetNewPropertyBag());
}
}
A jelen plda egyszersgnek kedvrt nem vizsgljuk azt az esetet, hogy a Text paramterben
tbbszr elfordul a szoftver sz, gy mindig csak az els tallat fog megjelenni.
ISmartTagAction interfsz felhasznlsa
Ha megtrtnt egy-egy sz felismerse s az adott Office alkalmazs megjellte a szt pontozott
vonallal, akkor a felhasznl aktivizlhatja a SmartTag-et gy, hogy az egrrel a sz fl ll s a
megjelen kis brra kattint. Ekkor kap szerepet alkalmazsunkban az ISmartTagAction interfszt
felhasznl osztly. Ilyenkor megjelentsre kerl egy gyorsmen. Ennek a mennek adhatunk egy
tetszleges fejlc szveget, valamint menpontokat, melyek kzl a felhasznl szabadon
vlaszthat. A kivlasztott menpont esetn ismt a mi DLL-nk kapja meg a vezrlst s
tetszleges mveletet vgezhet.
Az ISmartTagAction interfszt felhasznl osztlyunknak ismt kell egy j GUID szmot adnunk
(Tool - Create GUID menpont) ez a ksbbi regisztrcikor vlik szksgess.

[Guid("C7DFBDE3-9113-4f3f-89C5-C33BE30A5E9D"), ComVisible(true)]
public class ActionClass: ISmartTagAction
{
A megjelen men ablaknak fejlc szvegt a get_SmartTagCaption fggvny visszatrsi
rtkeknt adhatjuk meg.

public string get_SmartTagCaption(int SmartTagID, int LocaleID)


{
return "Felismert sz";
}
A get_VerbCount fggvny visszatrsi rtkben hatrozhatjuk meg, hogy hny j menpontot
szeretnnk mi magunk megjelenteni. Paramterknt megkapjuk, hogy melyik SmartTag-hez kell a
menpontokat rendelni, mivel a DLL-nkben tbb SmartTag funkcit is megvalsthatnnk.

public int get_VerbCount(string SmartTagName)


{
if (SmartTagName=="softwareonline#smarttag")
{
return 2;
}
else
{
return 0;
}
}
Hogy mi legyen a menpontok felirata, azt a get_VerbCaptionFromID fggvnyben adhatjuk meg.
Ez annyiszor kerl meghvsra, amekkora rtket adtunk a get_VerbCount fggvny visszatrsi
rtknek. Hogy aktulisan melyik menpontrl is van sz, azt a VerbID paramterbl tudhatjuk
meg.

public string get_VerbCaptionFromID(int VerbID, string ApplicationName,


int LocaleID)
{

55

string s="";
switch (VerbID)
{
case 1:
s="Els menpont";
break;
case 2:
s="Msodik menpont";
break;
}
return s;
}
Minden menpontnak adhatunk egy belsleg hasznlt nevet is a get_VerbNameFromID
fggvnyben. Itt szintn a paramterknt kapott VerbID rtke alapjn dnthetjk el, hogy melyik
menpont nevt is kell visszaadnunk.

public string get_VerbNameFromID(int VerbID)


{
string s="";
switch (VerbID)
{
case 1:
s="First";
break;
case 2:
s="Second";
break;
}
return s;
}
Ha a felhasznl kivlaszt egy menpontot a mi ltalunk szolgltatottakbl, akkor kerl meghvsra
az InvokeVerb fggvny. Itt szintn a VerbID paramter rulkodik arrl, hogy melyik menpont
lett kivlasztva. Az ApplicationName paramterbl megtudhatjuk, hogy melyik Office alkalmazsrl
is van sz. Ennek vizsglatval pldul elrhetjk, hogy csak a Word-ben legyen hasznlhat az
ltalunk megvalstott SmartTag. A Target property-ben az adott Office alkalmazstl fgg
objektumot kapunk. Ez minden esetben ms s ms. Jelen pldnknl a Word esetben egy
Word.Range osztly pldnya lesz, melyen keresztl elrhetjk a SmartTag ltal kijellt szt.

public void InvokeVerb(int VerbID, string ApplicationName, object


Target, SmartTagLib.ISmartTagProperties Properties, string Text, string
Xml)
{
if (ApplicationName.IndexOf("Word.Application")>=0)
{
Word.Range wr = (Word.Range)Target;
switch (VerbID)
{
A pldban az els menpont kivlasztsakor a SmartTag ltal megjellt szoftver szt
megformzzuk vastag betsre.

case 1:
wr.Bold = Convert.ToInt32(true);
break;
A msodik menpontot vlasztva a szt kicserljk egy msik szvegre.

case 2:
wr.Text = "http://www.SoftwareOnline.hu";
break;
}
}
}
Ezzel a SmartTag DLL-nk kszen is van. Hasznlathoz azonban nem elegend a DLL regisztrlsa
a Windows regisztrcis adatbzisba, hanem mg kt tovbbi bejegyzs is szksges a
mkdshez. Mindkettre a HKEY_CURRENT_USER fkulcson bell van szksg. Az
ISmartTagRecognizer interfszt felhasznl osztlyunkhoz tartoz GUID szmot kell a
Software\Microsoft\Office\Common\Smart
Tag\Recognizers\
kulcs
al
bejegyezni.
Az
ISmartTagAction
interfszt
felhasznl
osztlyunkhoz
tartoz
GUID
pedig
a
Software\Microsoft\Office\Common\Smart Tag\Actions\ kulcs al kerl. Ezt a mellkelt Registry.reg
llomny elvgzi helyettnk.

56

A teleptett SmartTag-eket
ellenrizhetjk is, ha a Wordben
az
Eszkzk
Automatikus
javtsi
belltsok
menpontjt
vlasztjuk, majd a megjelen
ablakban
az
Intelligens
cmkk nev lapra vltunk.

57

58

You might also like